В чем разница между StatefulSet и Deployment в Kubernetes?

«В чем разница между StatefulSet и Deployment в Kubernetes?» — вопрос из категории Kubernetes, который задают на 33% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Deployment и StatefulSet — это контроллеры для управления набором идентичных подов, но предназначенные для принципиально разных типов workloads.

Deployment: для Stateless-приложений

  • Цель: Развертывание и обновление взаимозаменяемых подов (например, веб-серверы, API, workers).
  • Имена подов: Генерируются случайным образом (например, nginx-deployment-756d9f5c78-xjq9v).
  • Сеть: Все поды разделяют один Service (ClusterIP/LoadBalancer), трафик распределяется случайным образом.
  • Хранилище: Обычно используют общие тома (например, emptyDir или сетевые тома типа NFS), не привязанные к конкретному поду.
  • Порядок операций: Поды создаются и удаляются параллельно, без гарантированного порядка.

StatefulSet: для Stateful-приложений

  • Цель: Управление уникальными, имеющими состояние подами (например, базы данных, Kafka, ZooKeeper, etcd).
  • Имена подов: Предсказуемые, упорядоченные и стабильные (например, mysql-0, mysql-1, mysql-2).
  • Сеть: Каждый под получает уникальный DNS-адрес вида <pod-name>.<service-name>.<namespace>.svc.cluster.local. Headless Service (clusterIP: None) обеспечивает прямое взаимодействие.
  • Хранилище: Каждому поду выделяется уникальный PersistentVolumeClaim (PVC), который следует за подом при пересоздании. Это гарантирует сохранность данных.
  • Порядок операций: Критические операции (развертывание, масштабирование, обновление) выполняются в строгом порядке (от 0 до N-1).

Пример сценария: Для кластера PostgreSQL вы выберете StatefulSet, чтобы каждый инстанс имел свое постоянное хранилище и стабильное сетевое имя для репликации. Для фронтенда на React — Deployment, так как все инстансы идентичны и не хранят уникального состояния.