StatefulSets

Содержание

Понимание StatefulSets

Обратитесь к официальной документации Kubernetes: StatefulSets

StatefulSet — это объект API рабочих нагрузок Kubernetes, предназначенный для управления stateful-приложениями, обеспечивая:

  • Стабильную сетевую идентичность: DNS-имя хоста <statefulset-name>-<ordinal>.<service-name>.ns.svc.cluster.local.
  • Стабильное постоянное хранилище: через volumeClaimTemplates.
  • Упорядоченное развертывание/масштабирование: последовательное создание/удаление Pod-ов: Pod-0 → Pod-1 → Pod-N.
  • Упорядоченные обновления с прокруткой: обновления Pod-ов в обратном порядке: Pod-N → Pod-0.

В распределённых системах несколько StatefulSets могут быть развернуты как отдельные компоненты для предоставления специализированных stateful-сервисов (например, Kafka brokers, MongoDB shards).

Создание StatefulSets

Создание StatefulSet с помощью CLI

Предварительные требования

  • Убедитесь, что kubectl настроен и подключён к вашему кластеру.

Пример YAML-файла

# example-statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx # должен совпадать с .spec.template.metadata.labels
  serviceName: 'nginx' # этот headless Service отвечает за сетевую идентичность Pod-ов
  replicas: 3 # задаёт желаемое количество реплик Pod-ов (по умолчанию: 1)
  minReadySeconds: 10 # по умолчанию 0
  template: # задаёт шаблон Pod-а для StatefulSet
    metadata:
      labels:
        app: nginx # должен совпадать с .spec.selector.matchLabels
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: nginx
          image: registry.k8s.io/nginx-slim:0.24
          ports:
            - containerPort: 80
              name: web
          volumeMounts:
            - name: www
              mountPath: /usr/share/nginx/html
  volumeClaimTemplates: # задаёт шаблоны PersistentVolumeClaim (PVC). Каждый Pod получает уникальный PersistentVolume (PV), динамически созданный на основе этих шаблонов.
    - metadata:
        name: www
      spec:
        accessModes: ['ReadWriteOnce']
        storageClassName: 'my-storage-class'
        resources:
          requests:
            storage: 1Gi
---
# example-service.yaml
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
    - port: 80
      name: web
  clusterIP: None
  selector:
    app: nginx

Создание StatefulSet через YAML

# Шаг 1: Для создания StatefulSet, определённого в *example-statefulset.yaml*, выполните команду
kubectl apply -f example-statefulset.yaml

# Шаг 2: Для проверки создания и статуса вашего StatefulSet и связанных с ним Pod-ов и PVC:
kubectl get statefulset web # Просмотр StatefulSet
kubectl get pods -l app=nginx # Проверка Pod-ов, управляемых этим StatefulSet
kubectl get pvc -l app=nginx # Проверка PVC, созданных volumeClaimTemplates

Создание StatefulSet через веб-консоль

Предварительные требования

Получите адрес образа. Источником образов могут быть репозитории образов, интегрированные администратором платформы через toolchain, либо репозитории образов сторонних платформ.

  • В первом случае администратор обычно назначает репозиторий образов вашему проекту, и вы можете использовать образы из него. Если нужный репозиторий образов не найден, обратитесь к администратору для выделения.

  • Если это репозиторий образов сторонней платформы, убедитесь, что образы можно напрямую загрузить из него в текущем кластере.

Процедура — Настройка базовой информации

  1. В Container Platform перейдите в Workloads > StatefulSets в левой боковой панели.

  2. Нажмите Create StatefulSet.

  3. Выберите или введите образ и нажмите Confirm.

INFO

Примечание: При использовании образов из репозитория, интегрированного в веб-консоль, можно фильтровать образы по Already Integrated. Integration Project Name, например, образы (docker-registry-projectname), где projectname — имя проекта в этой веб-консоли и имя проекта containers в репозитории образов.

В разделе Basic Info настройте декларативные параметры для рабочих нагрузок StatefulSet:

ПараметрыОписание
ReplicasОпределяет желаемое количество реплик Pod-ов в StatefulSet (по умолчанию: 1). Настраивается в зависимости от требований рабочей нагрузки и ожидаемого объёма запросов.
Update StrategyУправляет поэтапными обновлениями при прокрутке StatefulSet. Стратегия RollingUpdate является значением по умолчанию и рекомендуется.
Partition: порог по порядковому номеру для обновления Pod-ов.
  • Pod-ы с индексом ≥ partition обновляются сразу.
  • Pod-ы с индексом < partition сохраняют предыдущую спецификацию.
Пример:
  • Replicas=5 (Pod-ы: web-0 ~ web-4)
  • Partition=3 (обновляются только web-3 и web-4)
Volume Claim TemplatesvolumeClaimTemplates — ключевая функция StatefulSets, позволяющая динамически создавать постоянное хранилище для каждого Pod-а. Каждая реплика Pod-а в StatefulSet автоматически получает свой уникальный PersistentVolumeClaim (PVC) на основе заранее определённых шаблонов.
  • 1. Динамическое создание PVC: автоматически создаёт уникальные PVC для каждого Pod-а с шаблоном имени: <statefulset-name>-<claim-template-name>-<pod-ordinal>. Пример: web-www-web-0, web-www-web-1.
  • 2. Режимы доступа: поддерживаются все режимы доступа Kubernetes.
    • ReadWriteOnce (RWO — однопользовательский режим чтения/записи)
    • ReadOnlyMany (ROX — многопользовательский режим только для чтения)
    • ReadWriteMany (RWX — многопользовательский режим чтения/записи).
  • 3. Storage Class: указывается backend хранения через storageClassName. Если не указано, используется StorageClass по умолчанию в кластере. Поддерживаются различные типы хранения в облаке и on-prem (например, SSD, HDD).
  • 4. Ёмкость: настраивается через resources.requests.storage. Пример: 1Gi. Поддерживается динамическое расширение томов, если это разрешено StorageClass.

Процедура — Настройка Pod

Раздел Pod, см. Deployment - Configure Pod

Процедура — Настройка контейнеров

Раздел Containers, см. Deployment - Configure Containers

Процедура — Создание

Нажмите Create.

Проверка состояния (Health Checks)

Управление StatefulSets

Управление StatefulSet с помощью CLI

Просмотр StatefulSet

Вы можете просмотреть StatefulSet, чтобы получить информацию о вашем приложении.

  • Проверьте, что StatefulSet создан.

    kubectl get statefulsets
  • Получите подробную информацию о вашем StatefulSet.

    kubectl describe statefulsets

Масштабирование StatefulSet

  • Чтобы изменить количество реплик для существующего StatefulSet:

    kubectl scale statefulset <statefulset-name> --replicas=<new-replica-count>
  • Пример:

    kubectl scale statefulset web --replicas=5

Обновление StatefulSet (Rolling Update)

При изменении шаблона Pod-а StatefulSet (например, смена образа контейнера) Kubernetes по умолчанию выполняет обновление с прокруткой (если updateStrategy установлен в RollingUpdate, что является значением по умолчанию).

  • Сначала отредактируйте YAML-файл (например, example-statefulset.yaml) с нужными изменениями, затем примените его:

    kubectl apply -f example-statefulset.yaml
  • Затем вы можете отслеживать прогресс обновления с прокруткой:

    kubectl rollout status statefulset/<statefulset-name>

Удаление StatefulSet

Чтобы удалить StatefulSet и связанные с ним Pod-ы:

kubectl delete statefulset <statefulset-name>

По умолчанию удаление StatefulSet не удаляет связанные PersistentVolumeClaims (PVC) или PersistentVolumes (PV) во избежание потери данных. Чтобы удалить также PVC, сделайте это явно:

kubectl delete pvc -l app=<label-selector-for-your-statefulset> # Пример: kubectl delete pvc -l app=nginx

Альтернативно, если ваши volumeClaimTemplates используют StorageClass с политикой reclaimPolicy равной Delete, PV и подлежащие хранилища будут удалены автоматически при удалении PVC.

Управление StatefulSet через веб-консоль

Просмотр StatefulSet

  1. В Container Platform перейдите в Workloads > StatefulSets.
  2. Найдите StatefulSet, который хотите просмотреть.
  3. Нажмите на имя StatefulSet, чтобы увидеть Details, Topology, Logs, Events, Monitoring и т.д.

Обновление StatefulSet

  1. В Container Platform перейдите в Workloads > StatefulSets.
  2. Найдите StatefulSet, который хотите обновить.
  3. В выпадающем меню Actions выберите Update, чтобы открыть страницу редактирования StatefulSet, где можно обновить Replicas, image, updateStrategy и др.

Удаление StatefulSet

  1. В Container Platform перейдите в Workloads > StatefulSets.
  2. Найдите StatefulSet, который хотите удалить.
  3. В выпадающем меню Actions нажмите кнопку Delete в колонке операций и подтвердите.