За счет чего в Kubernetes StatefulSet сохраняется состояние (state) пода?

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

Ответ

StatefulSet сохраняет состояние пода за счет трех ключевых механизмов:

  1. Устойчивые тома (Persistent Volumes): Каждому поду в StatefulSet стабильно привязывается один или несколько PersistentVolumeClaim (PVC). Эти PVC создаются на основе шаблона volumeClaimTemplates и следуют предсказуемому именованию (<volumeClaimTemplateName>-<podName>). Том "переживает" перезапуск пода и привязывается к новому поду с тем же порядковым номером.

  2. Стабильные сетевые идентификаторы: Каждый под получает предсказуемое имя вида <statefulset-name>-<ordinal-index> (например, mysql-0, mysql-1) и стабильный DNS-запись:

    • pod-name.service-name.namespace.svc.cluster.local
    • Это позволяет приложениям внутри кластера надежно находить друг друга даже после рестартов.
  3. Упорядоченное и предсказуемое развертывание: Pod'ы создаются, обновляются и удаляются в строгом порядке (по возрастанию индексов), что критично для stateful-приложений, таких как базы данных с репликацией.

Пример манифеста для StatefulSet с PostgreSQL:

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgresql
spec:
  serviceName: "postgresql"
  replicas: 3
  selector:
    matchLabels:
      app: postgresql
  template:
    metadata:
      labels:
        app: postgresql
    spec:
      containers:
      - name: postgres
        image: postgres:15
        env:
        - name: PGDATA
          value: /var/lib/postgresql/data/pgdata
        volumeMounts:
        - name: data
          mountPath: /var/lib/postgresql/data
  # Ключевой элемент для сохранения состояния
  volumeClaimTemplates:
  - metadata:
      name: data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "fast-ssd" # Используется предварительно настроенный StorageClass
      resources:
        requests:
          storage: 10Gi

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