Что такое StatefulSet в Kubernetes?

«Что такое StatefulSet в Kubernetes?» — вопрос из категории DevOps, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

StatefulSet — это контроллер рабочей нагрузки в Kubernetes, предназначенный для управления stateful-приложениями, которым критически важны устойчивые идентификаторы, упорядоченное развёртывание и постоянное хранилище.

Ключевые особенности (в сравнении с Deployment):

Особенность StatefulSet Deployment (для stateless)
Имя пода Устойчивое, предсказуемое (<statefulset-name>-<ordinal>). Пример: mysql-0, mysql-1. Произвольное, с суффиксом (app-5f8c6d9b-xjqk).
Порядок Упорядоченное создание/масштабирование (0→1→2) и обратное удаление (2→1→0). Параллельное и произвольное.
Постоянное хранилище Каждому поду назначается уникальный PersistentVolumeClaim (PVC) из volumeClaimTemplates, который сохраняется при пересоздании пода. Обычно используется общий том или временное хранилище.
Сетевая идентичность У каждого пода стабильное DNS-имя: <pod-name>.<service-name>.<namespace>.svc.cluster.local. Нет стабильного DNS для отдельных подов.

Пример манифеста для кластера PostgreSQL:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgresql
spec:
  serviceName: postgresql-hl # Headless Service для сетевой идентичности
  replicas: 3
  selector:
    matchLabels:
      app: postgresql
  template:
    metadata:
      labels:
        app: postgresql
    spec:
      containers:
      - name: postgresql
        image: postgres:15
        env:
        - name: POSTGRES_PASSWORD
          valueFrom: { secretKeyRef: { name: pg-secret, key: password } }
        volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/data
  # Шаблон для создания уникального PVC для каждого пода
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 10Gi

Типичные use-cases: Кластерные базы данных (MySQL, MongoDB, PostgreSQL), очереди сообщений (Kafka, RabbitMQ), системы распределённых данных (Elasticsearch, Cassandra).