StatefulSet — это контроллер в Kubernetes, предназначенный для управления состоянием приложений, которым важно сохранять идентичность и данные при перезапуске. В отличие от Deployment, который подходит для статeless-сервисов, StatefulSet используется для баз данных, кластеров очередей, распределённых хранилищ и других систем, где каждый экземпляр пода уникален.
Особенности StatefulSet
- Стабильные имена подов
Подам присваиваются предсказуемые имена вида:pod-name-0, pod-name-1, pod-name-2Это позволяет приложению полагаться на фиксированное имя узла в кластере. - Последовательный порядок запуска и завершения
- Поды создаются и удаляются по одному, строго в порядке индексов.
- Это важно для систем, где нода-0 должна быть запущена первой (например, мастер-узел базы данных).
- Привязка к хранилищу
Каждый под в StatefulSet связан со своим PersistentVolumeClaim (PVC). Даже при перезапуске на другом узле под «подтянет» свой том и продолжит работу с теми же данными. - Управление масштабированием
Масштабирование вверх добавляет новые поды с новыми индексами. Масштабирование вниз удаляет поды в обратном порядке (с самого большого индекса).
Пример конфигурации 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
| Характеристика | Deployment | StatefulSet | DaemonSet |
|---|---|---|---|
| Тип приложения | Stateless (не хранит состояние) | Stateful (сохраняет состояние) | Системные демоны и агенты |
| Имена подов | Динамические (pod-abc123) | Предсказуемые (name-0, name-1, name-2) | Один под на каждом узле, имя зависит от узла |
| Хранение данных | Общее/разделяемое, данные теряются при пересоздании | Привязка к собственным PVC, данные сохраняются | Обычно не хранит данные |
| Порядок запуска | Нет (можно поднимать все сразу) | Последовательный, с контролем индексов | Один под автоматически создаётся на новом узле |
| Примеры использования | Web-приложения, API, фронтенд | Базы данных, очереди сообщений, распределённые хранилища | Лог-агенты, мониторинг, сетевые плагины |
| Масштабирование | Легко масштабируется в обе стороны | Масштабируется по индексам, каждый под уникален | Не масштабируется вручную, зависит от числа узлов |
| Обновления | Rolling update (без простоя) | Rolling update с сохранением порядка | Обновляет демонов на всех узлах |
Кратко:
- Deployment — лучший выбор для большинства микросервисов без состояния.
- StatefulSet — нужен там, где данные уникальны и критичны.
- DaemonSet — для сервисов, которые должны быть на каждом узле (мониторинг, логирование, сетевые плагины).