StatefulSet (Kubernetes)

⌘K

StatefulSet (Kubernetes)

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


Особенности StatefulSet

  1. Стабильные имена подов
    Подам присваиваются предсказуемые имена вида: pod-name-0, pod-name-1, pod-name-2 Это позволяет приложению полагаться на фиксированное имя узла в кластере.
  2. Последовательный порядок запуска и завершения
    • Поды создаются и удаляются по одному, строго в порядке индексов.
    • Это важно для систем, где нода-0 должна быть запущена первой (например, мастер-узел базы данных).
  3. Привязка к хранилищу
    Каждый под в StatefulSet связан со своим PersistentVolumeClaim (PVC). Даже при перезапуске на другом узле под «подтянет» свой том и продолжит работу с теми же данными.
  4. Управление масштабированием
    Масштабирование вверх добавляет новые поды с новыми индексами. Масштабирование вниз удаляет поды в обратном порядке (с самого большого индекса).

Пример конфигурации StatefulSet

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: postgres
spec:
  serviceName: "postgres"
  replicas: 3
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      containers:
      - name: postgres
        image: postgres:16-alpine
        volumeMounts:
        - name: pgdata
          mountPath: /var/lib/postgresql/data
  volumeClaimTemplates:
  - metadata:
      name: pgdata
    spec:
      accessModes: [ "ReadWriteOnce" ]
      resources:
        requests:
          storage: 20Gi

Когда использовать StatefulSet

  • Базы данных: PostgreSQL, MySQL, MongoDB.
  • Кластеры сообщений: Kafka, RabbitMQ.
  • Распределённые файловые системы: Ceph, MinIO, HDFS.

Для клиента

StatefulSet гарантирует:

  • сохранность данных при обновлениях или сбоях;
  • предсказуемое поведение подов;
  • автоматическое восстановление после падения узлов.

Это ключевой инструмент, когда приложение нельзя просто «погасить и поднять заново» — оно должно помнить своё состояние.


Отлично, тогда вот дополнение в виде сравнительной таблицы — удобно для глоссария, чтобы сразу видеть, чем отличаются контроллеры StatefulSet, Deployment и DaemonSet в Kubernetes:


Сравнение контроллеров Kubernetes

ХарактеристикаDeploymentStatefulSetDaemonSet
Тип приложенияStateless (не хранит состояние)Stateful (сохраняет состояние)Системные демоны и агенты
Имена подовДинамические (pod-abc123)Предсказуемые (name-0, name-1, name-2)Один под на каждом узле, имя зависит от узла
Хранение данныхОбщее/разделяемое, данные теряются при пересозданииПривязка к собственным PVC, данные сохраняютсяОбычно не хранит данные
Порядок запускаНет (можно поднимать все сразу)Последовательный, с контролем индексовОдин под автоматически создаётся на новом узле
Примеры использованияWeb-приложения, API, фронтендБазы данных, очереди сообщений, распределённые хранилищаЛог-агенты, мониторинг, сетевые плагины
МасштабированиеЛегко масштабируется в обе стороныМасштабируется по индексам, каждый под уникаленНе масштабируется вручную, зависит от числа узлов
ОбновленияRolling update (без простоя)Rolling update с сохранением порядкаОбновляет демонов на всех узлах

Кратко:

  • Deployment — лучший выбор для большинства микросервисов без состояния.
  • StatefulSet — нужен там, где данные уникальны и критичны.
  • DaemonSet — для сервисов, которые должны быть на каждом узле (мониторинг, логирование, сетевые плагины).