Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Особенности Kubernetes StatefulSet
StatefulSet — это контроллер Kubernetes для управления stateful приложениями, которым требуется стабильные идентификаторы подов, сохраняемое хранилище и контролируемое масштабирование. В отличие от Deployment, StatefulSet предназначен для приложений, где порядок и уникальность подов критичны.
Основные отличия от Deployment
| Характеристика | Deployment | StatefulSet |
|---|---|---|
| Идентичность подов | Случайные имена | Стабильные порядковые номера (pod-0, pod-1) |
| Хранилище | Общее | Уникальное PersistentVolume для каждого |
| Масштабирование | Параллельное | Последовательное (по умолчанию) |
| Удаление | Параллельное | Последовательное (в обратном порядке) |
| Случай использования | Stateless приложения | Stateful приложения (БД, кеш) |
1. Стабильные идентификаторы подов
Поды в StatefulSet имеют порядковые номера и предсказуемые имена:
kubectl get pods
NAME READY STATUS
mysql-0 1/1 Running
mysql-1 1/1 Running
mysql-2 1/1 Running
Это критично для репликации и восстановления после сбоев.
2. Stablе сетевые имена (headless service)
StatefulSet требует headless Service для стабильных DNS имён:
apiVersion: v1
kind: Service
metadata:
name: mysql
spec:
clusterIP: None
selector:
app: mysql
ports:
- port: 3306
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: mysql
spec:
serviceName: mysql
replicas: 3
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:8.0
Каждый под имеет стабильное имя:
mysql-0.mysql.default.svc.cluster.localmysql-1.mysql.default.svc.cluster.localmysql-2.mysql.default.svc.cluster.local
3. Уникальное хранилище для каждого пода
StatefulSet создаёт PersistentVolumeClaim (PVC) для каждого пода:
spec:
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: [ "ReadWriteOnce" ]
storageClassName: fast-ssd
resources:
requests:
storage: 10Gi
Это означает:
postgres-0используетpostgres-0-dataPVCpostgres-1используетpostgres-1-dataPVC- Каждый под имеет отдельное хранилище
4. Последовательное масштабирование
Поды создаются и удаляются по очереди, а не параллельно:
kubectl scale statefulset postgres --replicas=3
# Создание: postgres-0 -> postgres-1 -> postgres-2
kubectl scale statefulset postgres --replicas=1
# Удаление: postgres-2 -> postgres-1 -> postgres-0
5. Политика управления подами
spec:
podManagementPolicy: Parallel # по умолчанию OrderedReady
- OrderedReady — последовательное создание (безопаснее)
- Parallel — параллельное создание (быстрее)
6. Обновления StatefulSet
Обновления происходят последовательно (от последнего к первому):
kubectl set image statefulset postgres postgres=postgres:16
kubectl rollout status statefulset postgres
7. Безопасное удаление
⚠️ Важно: удаление StatefulSet не удаляет PVC автоматически:
kubectl delete statefulset postgres
# PVC остаются, данные сохраняются
kubectl delete pvc -l app=postgres
# Удалить PVC вручную, если нужно
Практические примеры
- MySQL Replication — master-slave требует стабильных имён
- Elasticsearch Cluster — узлы должны быть идентифицируемы
- Kafka — брокеры имеют фиксированные ID
- Redis Sentinel — стабильные имена для координации
- PostgreSQL — primary-replica репликация
Вывод
StatefulSet нужен для приложений, требующих:
- Stable network identities — стабильные DNS имена
- Persistent storage — уникальное хранилище
- Ordered operations — контролируемый порядок
- Safe updates — безопасные обновления
Для stateless приложений используй Deployment. Для stateful (БД, очереди, кеш) — StatefulSet.