← Назад к вопросам

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

1.8 Middle🔥 232 комментариев
#Kubernetes

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Хранение состояния StatefulSet в Kubernetes

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

Механизмы хранения состояния

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

  1. PersistentVolume (PV) и PersistentVolumeClaim (PVC) — основной способ хранения данных.
  2. Устойчивые сетевые идентификаторы — для стабильного сетевого доступа.

1. Хранение данных: PersistentVolumeClaims (PVC)

Каждому поду, управляемому StatefulSet, может быть назначен один или несколько PersistentVolumeClaim (PVC). Эти PVC создаются на основе шаблона (volumeClaimTemplates), указанного в манифесте StatefulSet. При создании каждого пода StatefulSet динамически создает для него уникальный PVC, который затем привязывается к PersistentVolume (PV) — реальному ресурсу хранилища в кластере (например, диску в облачном провайдере, сетевой файловой системе NFS или локальному хранилищу).

Данные сохраняются на привязанном PV и переживают перезапуск, ресхедулирование или даже удаление пода (если не удален PVC). PVC для StatefulSet обычно имеют политику хранения (persistentVolumeReclaimPolicy) Retain или Delete, в зависимости от требований к данным.

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

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web-app
spec:
  serviceName: "web"
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:stable
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www-data
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # Шаблон для создания PVC
  - metadata:
      name: www-data
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "fast-ssd"
      resources:
        requests:
          storage: 10Gi

В этом примере:

  • Для каждого из трех подов (web-app-0, web-app-1, web-app-2) будет создан уникальный PVC с именем www-data-web-app-0, www-data-web-app-1 и т.д.
  • Эти PVC будут привязаны к отдельным PV, где и будут храниться данные из /usr/share/nginx/html.

2. Хранение сетевой идентичности

StatefulSet обеспечивает стабильность, критически важную для stateful-приложений, через:

  • Предсказуемые имена подов: Поды создаются последовательно (<statefulset-name>-0, -1, ...) и сохраняют свои имена и порядок при любых операциях.
  • Стабильные DNS-имена: Каждый под получает DNS-имя вида: <pod-name>.<service-name>.<namespace>.svc.cluster.local. Headless Service (clusterIP: None), связанный с StatefulSet, позволяет напрямую обращаться к каждому поду по его уникальному DNS-имени. Это позволяет приложениям (например, кластерам баз данных) находить друг друга и формировать кворум.
  • Упорядоченное развертывание и обновление: По умолчанию применяются стратегии OrderedReady для деплоя и апдейта, что важно для корректного запуска мастер-реплика или primary-ноды перед остальными.

Где именно хранятся данные?

Физически данные хранятся там, где развернут PersistentVolume. Это может быть:

  • Облачный диск: AWS EBS, Google Persistent Disk, Azure Disk.
  • Сетевое хранилище: NFS, CephFS, GlusterFS.
  • Локальное хранилище (Local PV): Диск на конкретном узле кластера (требует аккуратного управления).
  • Хранилище CSI-драйвера: Portworx, Rook (Ceph), Longhorn.

Важные особенности управления состоянием

  • Масштабирование вниз не удаляет PVC: При уменьшении количества реплик PVC для удаленных подов остаются, чтобы данные могли быть повторно использованы при последующем масштабировании вверх. Их нужно удалять вручную, если данные больше не нужны.
  • Стабильность томов при ресхедулинге: При перезапуске пода он получает доступ к тому же самому PVC (и, следовательно, тем же данным), что и раньше. K8s scheduler учитывает это ограничение.
  • Не является системой резервного копирования: StatefulSet обеспечивает устойчивость тома к жизненному циклу пода, но не защищает от повреждения данных, сбоя диска или ошибки пользователя. Для этого необходимы отдельные стратегии бэкапа PV (например, через снапшоты).

Заключение

Таким образом, StatefulSet хранит состояние (данные) не внутри себя, а во внешних ресурсах — PersistentVolume, которые динамически запрашиваются через PersistentVolumeClaims. Основная роль StatefulSet — предоставлять гарантии идентичности (уникальные имена подов, стабильные сетевые идентификаторы) и гарантии доступа к правильному тому с данными для каждого инстанса приложения. Это делает его идеальным оркестратором для распределенных баз данных (MySQL, PostgreSQL, MongoDB), кластеров кэширования (Redis) и message queues (Kafka), где каждому узлу требуется своя уникальная, устойчивая личность и свое постоянное хранилище.