Ответ
StatefulSet — это контроллер рабочей нагрузки в Kubernetes, предназначенный для управления stateful-приложениями, которым критически важны устойчивые идентификаторы, упорядоченное развёртывание и постоянное хранилище.
Ключевые особенности (в сравнении с Deployment):
| Особенность | StatefulSet | Deployment (для stateless) |
|---|---|---|
| Имя пода | Устойчивое, предсказуемое (<statefulset-name>-<ordinal>). Пример: mysql-0, mysql-1. |
Произвольное, с суффиксом (app-5f8c6d9b-xjqk). |
| Порядок | Упорядоченное создание/масштабирование (0→1→2) и обратное удаление (2→1→0). | Параллельное и произвольное. |
| Постоянное хранилище | Каждому поду назначается уникальный PersistentVolumeClaim (PVC) из volumeClaimTemplates, который сохраняется при пересоздании пода. |
Обычно используется общий том или временное хранилище. |
| Сетевая идентичность | У каждого пода стабильное DNS-имя: <pod-name>.<service-name>.<namespace>.svc.cluster.local. |
Нет стабильного DNS для отдельных подов. |
Пример манифеста для кластера PostgreSQL:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: postgresql
spec:
serviceName: postgresql-hl # Headless Service для сетевой идентичности
replicas: 3
selector:
matchLabels:
app: postgresql
template:
metadata:
labels:
app: postgresql
spec:
containers:
- name: postgresql
image: postgres:15
env:
- name: POSTGRES_PASSWORD
valueFrom: { secretKeyRef: { name: pg-secret, key: password } }
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
# Шаблон для создания уникального PVC для каждого пода
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 10Gi
Типичные use-cases: Кластерные базы данных (MySQL, MongoDB, PostgreSQL), очереди сообщений (Kafka, RabbitMQ), системы распределённых данных (Elasticsearch, Cassandra).