В чем разница между Deployment и StatefulSet с точки зрения обновления приложения в Kubernetes?

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

Ответ

Основное отличие заключается в стратегии обновления и гарантиях порядка, что критично для типа приложения.

Deployment предназначен для stateless-приложений (например, веб-серверы, API).

  • Стратегия по умолчанию: Rolling Update.
  • Поведение: Поды заменяются постепенно, что обеспечивает нулевое время простоя. Порядок замены подов не гарантирован и не контролируется.
  • Использование: Идеально для сервисов, где любой экземпляр идентичен и не хранит уникальное состояние.

StatefulSet предназначен для stateful-приложений (например, базы данных, очереди сообщений, кластеры с мастер-репликой).

  • Стратегия по умолчанию: Rolling Update, но с жесткими правилами.
  • Поведение: Поды обновляются строго по одному, в обратном порядке (начиная с pod с наибольшим индексом). Каждый под сохраняет свой стабильный идентификатор сети и хранилища (например, app-0, app-1).
  • Контроль: Позволяет управлять обновлением через partition, что полезно для канареечных развертываний или откатов.

Пример манифеста StatefulSet с контролируемым обновлением:

apiVersion: apps/v1
kind: StatefulSet
spec:
  updateStrategy:
    type: RollingUpdate
    rollingUpdate:
      # Обновляются только поды с индексом >= 1 (например, app-1, app-2).
      # Под app-0 останется на старой версии. Это позволяет протестировать обновление на части реплик.
      partition: 1

Итог: Выбор зависит от состояния приложения. Для данных, порядка и персистентности — StatefulSet. Для масштабируемых, идентичных реплик — Deployment.