← Назад к вопросам

Какие знаешь особенности StatefulSet?

2.0 Middle🔥 161 комментариев
#Kubernetes

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Особенности Kubernetes StatefulSet

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

Основные отличия от Deployment

ХарактеристикаDeploymentStatefulSet
Идентичность подовСлучайные именаСтабильные порядковые номера (pod-0, pod-1)
ХранилищеОбщееУникальное PersistentVolume для каждого
МасштабированиеПараллельноеПоследовательное (по умолчанию)
УдалениеПараллельноеПоследовательное (в обратном порядке)
Случай использованияStateless приложенияStateful приложения (БД, кеш)

1. Стабильные идентификаторы подов

Поды в StatefulSet имеют порядковые номера и предсказуемые имена:

kubectl get pods
NAME         READY   STATUS
mysql-0      1/1    Running
mysql-1      1/1    Running
mysql-2      1/1    Running

Это критично для репликации и восстановления после сбоев.

2. Stablе сетевые имена (headless service)

StatefulSet требует headless Service для стабильных DNS имён:

apiVersion: v1
kind: Service
metadata:
  name: mysql
spec:
  clusterIP: None
  selector:
    app: mysql
  ports:
  - port: 3306
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: mysql
spec:
  serviceName: mysql
  replicas: 3
  selector:
    matchLabels:
      app: mysql
  template:
    metadata:
      labels:
        app: mysql
    spec:
      containers:
      - name: mysql
        image: mysql:8.0

Каждый под имеет стабильное имя:

  • mysql-0.mysql.default.svc.cluster.local
  • mysql-1.mysql.default.svc.cluster.local
  • mysql-2.mysql.default.svc.cluster.local

3. Уникальное хранилище для каждого пода

StatefulSet создаёт PersistentVolumeClaim (PVC) для каждого пода:

spec:
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: fast-ssd
      resources:
        requests:
          storage: 10Gi

Это означает:

  • postgres-0 использует postgres-0-data PVC
  • postgres-1 использует postgres-1-data PVC
  • Каждый под имеет отдельное хранилище

4. Последовательное масштабирование

Поды создаются и удаляются по очереди, а не параллельно:

kubectl scale statefulset postgres --replicas=3
# Создание: postgres-0 -> postgres-1 -> postgres-2

kubectl scale statefulset postgres --replicas=1
# Удаление: postgres-2 -> postgres-1 -> postgres-0

5. Политика управления подами

spec:
  podManagementPolicy: Parallel  # по умолчанию OrderedReady
  • OrderedReady — последовательное создание (безопаснее)
  • Parallel — параллельное создание (быстрее)

6. Обновления StatefulSet

Обновления происходят последовательно (от последнего к первому):

kubectl set image statefulset postgres postgres=postgres:16
kubectl rollout status statefulset postgres

7. Безопасное удаление

⚠️ Важно: удаление StatefulSet не удаляет PVC автоматически:

kubectl delete statefulset postgres
# PVC остаются, данные сохраняются

kubectl delete pvc -l app=postgres
# Удалить PVC вручную, если нужно

Практические примеры

  • MySQL Replication — master-slave требует стабильных имён
  • Elasticsearch Cluster — узлы должны быть идентифицируемы
  • Kafka — брокеры имеют фиксированные ID
  • Redis Sentinel — стабильные имена для координации
  • PostgreSQL — primary-replica репликация

Вывод

StatefulSet нужен для приложений, требующих:

  • Stable network identities — стабильные DNS имена
  • Persistent storage — уникальное хранилище
  • Ordered operations — контролируемый порядок
  • Safe updates — безопасные обновления

Для stateless приложений используй Deployment. Для stateful (БД, очереди, кеш) — StatefulSet.

Какие знаешь особенности StatefulSet? | PrepBro