• Русский
  • 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 в колонке операций и подтвердите.