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 — другие приложения могут адресоваться к конкретной реплике.

DeploymentStatefulSet
Имена подовслучайныестабильные (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Хранение секретов
Поддержать проект