Гид по технологиям

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

• 4 min read • Kubernetes • Обновлено 25 Nov 2025
StatefulSet в Kubernetes — создание и поведение
StatefulSet в Kubernetes — создание и поведение

Иллюстрация: концепция StatefulSet с уникальными именами подов

Краткое определение

StatefulSet — контроллер в Kubernetes, который создаёт и поддерживает набор подов с уникальными, устойчивыми идентификаторами и стабильными именами хостов. Под шаблона podTemplate задаёт спецификацию для каждого пода; при изменении этой спецификации StatefulSet обновляется.

Определения в одну строку:

  • Pod: минимальная единица развертывания в Kubernetes.
  • PVC: PersistentVolumeClaim — запрос на постоянный том.
  • Headless Service: Service с clusterIP: None для контроля DNS имён подов.

Когда использовать StatefulSet

Используйте StatefulSet, если приложение требует:

  • Стабильных, уникальных сетевых идентификаторов (DNS-имён).
  • Постоянного, сохраняемого хранения (PersistentVolumes).
  • Упорядоченного и аккуратного развёртывания и масштабирования.
  • Упорядоченных автоматизированных Rolling Updates.

Важно: StatefulSet не нужен для полностью статессных (stateless) приложений — для них лучше Deployment.

Предусловия

  1. Kubernetes-кластер с как минимум одним рабочим узлом.

Примечание: если вам нужно собрать кластер локально, подойдёт kind/minikube; для облака — облачные провайдеры и инструкции по созданию кластеров.

Что мы сделаем

  1. Создадим StatefulSet с репликами nginx.
  2. Посмотрим, как 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

Диаграмма: пример Service + StatefulSet для nginx

В этом примере:

  • 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

Скриншот: создание StatefulSet

Список созданных ресурсов:

kubectl get statefulset
kubectl get service

Скриншот: список StatefulSet и Service

Список подов с суффиксной нумерацией (web-0, web-1, web-2):

kubectl get pods

Скриншот: поды в StatefulSet с индексами

Подробная информация о StatefulSet:

kubectl get statefulset
kubectl describe statefulset web

Скриншот: 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-окружении.
  • Подготовить процедуры отката.

Мини‑руководство по обновлению и откату

  1. Обновите образ в манифесте StatefulSet.
  2. Примените изменения: kubectl apply -f statefulset.yml.
  3. Наблюдайте за порядком обновления подов (по одному).
  4. Для отката — верните предыдущую спецификацию и примените снова.

Важно: rolling update у StatefulSet идёт по порядку и может требовать дополнительных проверок на корректную остановку/запуск приложения.

Тестовые сценарии / критерии приёмки

  • Развернуть StatefulSet и проверить, что kube-dns резолвит имена каждого пода.
  • Удалить pod с индексом i и убедиться, что новый pod получает тот же индекс.
  • Выполнить обновление образа и проверить, что pods обновляются по одному и приложение остаётся работоспособным.

Заключение

Мы создали StatefulSet для nginx, убедились в устойчивости имён подов и рассмотрели сценарии использования и альтернативы. StatefulSet — инструмент для приложений, требующих предсказуемой идентичности и упорядоченного жизненного цикла.

Ключевые выводы:

  • StatefulSet обеспечивает стабильные имена и порядок создания/удаления подов.
  • Он подходит для stateful и кластеризованных приложений, но не для простых stateless-сервисов.
  • Перед применением в production обязательно протестируйте обновления и процедуру отката.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро