StatefulSet в Kubernetes: создание и поведение подов

Краткое определение
StatefulSet — контроллер в Kubernetes, который создаёт и поддерживает набор подов с уникальными, устойчивыми идентификаторами и стабильными именами хостов. Под шаблона podTemplate задаёт спецификацию для каждого пода; при изменении этой спецификации StatefulSet обновляется.
Определения в одну строку:
- Pod: минимальная единица развертывания в Kubernetes.
- PVC: PersistentVolumeClaim — запрос на постоянный том.
- Headless Service: Service с clusterIP: None для контроля DNS имён подов.
Когда использовать StatefulSet
Используйте StatefulSet, если приложение требует:
- Стабильных, уникальных сетевых идентификаторов (DNS-имён).
- Постоянного, сохраняемого хранения (PersistentVolumes).
- Упорядоченного и аккуратного развёртывания и масштабирования.
- Упорядоченных автоматизированных Rolling Updates.
Важно: StatefulSet не нужен для полностью статессных (stateless) приложений — для них лучше Deployment.
Предусловия
- Kubernetes-кластер с как минимум одним рабочим узлом.
Примечание: если вам нужно собрать кластер локально, подойдёт kind/minikube; для облака — облачные провайдеры и инструкции по созданию кластеров.
Что мы сделаем
- Создадим StatefulSet с репликами nginx.
- Посмотрим, как Kubernetes нумерует поды и как сохраняются имена после удаления.
Создание StatefulSet
Создайте файл и вставьте в него следующую манифест-спецификацию.
vim statefulset.yml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
selector:
matchLabels:
app: nginx
serviceName: "nginx"
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 10
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
В этом примере:
- Headless Service с именем
nginxуправляет DNS-именами подов. - StatefulSet с именем
webсоздаёт 3 реплики контейнера nginx в отдельных подах с уникальными именами. - Используется образ nginx k8s.gcr.io/nginx-slim:0.8.
Команды для создания и проверки
Создайте StatefulSet и проверьте его статус:
kubectl get statefulset
kubectl create -f statefulset.yml
Список созданных ресурсов:
kubectl get statefulset
kubectl get service
Список подов с суффиксной нумерацией (web-0, web-1, web-2):
kubectl get pods
Подробная информация о StatefulSet:
kubectl get statefulset
kubectl describe statefulset web
Поведение при удалении подов
Для демонстрации удалим два пода и посмотрим, какие имена получат вновь созданные поды.
kubectl get pods
kubectl delete pods web-0 web-2
kubectl get pods
Наблюдение: даже после удаления пода, при его воссоздании StatefulSet присваивает тот же индекс и имя (например, web-0). Это отражает одно из ключевых свойств StatefulSet — стабильность сетевых имён и идентичности.
Когда StatefulSet не подходит — примеры отказа
- У вас stateless-приложение (веб-фронтенд), которое легко масштабируется горизонтально — используйте Deployment.
- Нужна высокая скорость масштабирования тысяч подов (StatefulSet создаёт поды последовательно).
- Если приложение само умеет синхронизировать состояние и не требует уникальных DNS-имён.
Альтернативы
- Deployment + PVC динамически: для большинства stateless-сервисов и микросервисов.
- Operator: для сложных кластеризованных приложений (например, базы данных) с дополнительной логикой восстановления.
- StatefulSet + ExternalStorage: если хранение нужно на внешнем хранилище.
Умственная модель (heuristic)
Представьте StatefulSet как «контроллер с памятью»: у каждого пода есть “постоянный адрес” и, при необходимости, постоянный диск. StatefulSet создаёт поды по одному в порядке 0..N‑1 и удаляет в обратном порядке.
Критерии приёмки
- StatefulSet создан и имеет желаемое количество реплик (kubectl get statefulset).
- Каждый под имеет предсказуемое имя: <имя>-0, <имя>-1 и т.д.
- При удалении пода он воссоздаётся с тем же именем и тем же PVC (если PVC сконфигурирован).
- Сервисы доступны по ожидаемым DNS-именам.
Ролевые контрольные списки
Разработчик:
- Убедиться, что приложение корректно опирается на имя хоста / том.
- Проверить логику инициализации при перезапуске.
SRE/Оператор:
- Настроить мониторинг состояния подов и PVC.
- Тестировать обновления в staging-окружении.
- Подготовить процедуры отката.
Мини‑руководство по обновлению и откату
- Обновите образ в манифесте StatefulSet.
- Примените изменения: kubectl apply -f statefulset.yml.
- Наблюдайте за порядком обновления подов (по одному).
- Для отката — верните предыдущую спецификацию и примените снова.
Важно: rolling update у StatefulSet идёт по порядку и может требовать дополнительных проверок на корректную остановку/запуск приложения.
Тестовые сценарии / критерии приёмки
- Развернуть StatefulSet и проверить, что kube-dns резолвит имена каждого пода.
- Удалить pod с индексом i и убедиться, что новый pod получает тот же индекс.
- Выполнить обновление образа и проверить, что pods обновляются по одному и приложение остаётся работоспособным.
Заключение
Мы создали StatefulSet для nginx, убедились в устойчивости имён подов и рассмотрели сценарии использования и альтернативы. StatefulSet — инструмент для приложений, требующих предсказуемой идентичности и упорядоченного жизненного цикла.
Ключевые выводы:
- StatefulSet обеспечивает стабильные имена и порядок создания/удаления подов.
- Он подходит для stateful и кластеризованных приложений, но не для простых stateless-сервисов.
- Перед применением в production обязательно протестируйте обновления и процедуру отката.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента