Для какого приложения использовал бы StatefulSet в Kubernetes?

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

Ответ

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

Конкретные примеры из практики:

  1. Кластерные базы данных: Например, развертывание отказоустойчивого кластера PostgreSQL с Patroni или Cassandra.
    # Упрощенный пример для StatefulSet с PersistentVolume
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: cassandra
    spec:
      serviceName: cassandra
      replicas: 3
      selector: { ... }
      template: { ... }
      volumeClaimTemplates:
      - metadata:
          name: data
        spec:
          accessModes: [ "ReadWriteOnce" ]
          resources:
            requests:
              storage: 100Gi
  2. Очереди сообщений: Например, Apache Kafka, где каждый брокер должен иметь свой уникальный ID и постоянный диск для логов партиций.
  3. Кластеры распределенных хранилищ/поиска: Elasticsearch, где нодам нужны стабильные имена для формирования кластера и свои тома для индексов.

Почему StatefulSet, а не Deployment? Он гарантирует:

  • Упорядоченный и предсказуемый запуск/останов подов (pod-0, затем pod-1).
  • Стабильные идентификаторы и DNS-имена: pod-0.cassandra.default.svc.cluster.local.
  • Постоянство хранилища: Каждому поду при пересоздании назначается его уникальный PersistentVolumeClaim.