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