Где StatefulSet хранит состояние в Kubernetes?

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

Ответ

StatefulSet хранит состояние в PersistentVolumes (PV), которые привязываются к каждому Pod через PersistentVolumeClaims (PVC). PVC создаются автоматически для каждого Pod на основе шаблона volumeClaimTemplates, объявленного в манифесте StatefulSet.

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

Пример манифеста:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 1Gi

Ключевые детали:

  • Именование PVC: PVC создаются по шаблону [volumeClaimTemplateName]-[statefulsetName]-[ordinalIndex] (например, www-web-0, www-web-1).
  • Стабильность: PV и PVC не удаляются автоматически при удалении Pod. Это гарантирует сохранность данных. При повторном создании Pod с тем же порядковым номером он повторно привяжется к своему тому.
  • Упорядоченность: Развертывание и масштабирование Pod в StatefulSet происходит последовательно, что также упорядочивает создание томов и минимизирует риски для stateful-нагрузок.