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 — для сервисов, которые должны быть на каждом узле (мониторинг, логирование, сетевые плагины).

Даже в глоссарии есть повод сэкономить

Дарим 1 месяц к году оплаты VPS. Код: NEWCOM

Месяц в подарок
COPIED
NEWCOM COPIED