StatefulSet кратко
Базы данных и кластеры с состоянием нельзя гонять как stateless-поды — для них есть StatefulSet.
StatefulSet — контроллер для приложений с состоянием: даёт подам стабильные имена, постоянный порядок и собственное персистентное хранилище у каждого.
Deployment отлично подходит для stateless-приложений: его поды взаимозаменяемы, имена случайны, порядок неважен. Но базе данных нужно иначе. Реплике БД важно сохранять идентичность: тот же сетевой адрес, тот же диск с данными после перезапуска. Это и даёт StatefulSet.
Чем StatefulSet отличается
- Стабильные имена. Поды называются предсказуемо:
db-0,db-1,db-2— а не случайным суффиксом, как у Deployment. - Своё хранилище у каждого. Через
volumeClaimTemplatesкаждый под получает собственный PVC, который сохраняется при пересоздании пода. - Порядок. Поды создаются и удаляются по очереди (0, 1, 2…), а не все сразу — это важно для кластеров БД.
Манифест StatefulSet
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db
spec:
serviceName: db # headless-сервис для стабильных DNS-имён
replicas: 3
selector:
matchLabels:
app: db
template:
metadata:
labels:
app: db
spec:
containers:
- name: postgres
image: postgres:16
volumeMounts:
- name: data
mountPath: /var/lib/postgresql/data
volumeClaimTemplates: # у каждого пода свой PVC
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 5GiПоды получат стабильные DNS-имена вида db-0.db, db-1.db — другие приложения могут адресоваться к конкретной реплике.
| Deployment | StatefulSet | |
| Имена подов | случайные | стабильные (db-0, db-1) |
| Хранилище | общее/нет | своё у каждого пода |
| Порядок | неважен | по очереди |
| Для чего | stateless (web, API) | stateful (БД, очереди) |
Итог
- StatefulSet — для приложений с состоянием (БД, кластеры).
- Даёт стабильные имена, порядок и персональный PVC каждому поду.
- Stateless-сервисы по-прежнему запускают через Deployment.
Проверьте себя
1. Когда применяют StatefulSet вместо Deployment?
AДля любых веб-серверов
BДля приложений с состоянием, которым нужны стабильные имена и своё хранилище
CТолько для одноразовых задач
DДля маршрутизации HTTP
2. Как именуются поды в StatefulSet?
AСлучайным суффиксом
BПредсказуемо: db-0, db-1, db-2
CПо IP-адресу
DПо имени узла
3. Что обеспечивает volumeClaimTemplates в StatefulSet?
AОбщий том на все поды
BСобственный персистентный PVC для каждого пода
CБалансировку трафика
DХранение секретов