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, либо репозитории образов сторонних платформ.
-
В первом случае администратор обычно назначает репозиторий образов вашему проекту, и вы можете использовать образы из него. Если нужный репозиторий образов не найден, обратитесь к администратору для выделения.
-
Если это репозиторий образов сторонней платформы, убедитесь, что образы можно напрямую загрузить из него в текущем кластере.
Процедура — Настройка базовой информации
-
В Container Platform перейдите в Workloads > StatefulSets в левой боковой панели.
-
Нажмите Create StatefulSet.
-
Выберите или введите образ и нажмите 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 Templates | volumeClaimTemplates — ключевая функция 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
Обновление 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
- В Container Platform перейдите в Workloads > StatefulSets.
- Найдите StatefulSet, который хотите просмотреть.
- Нажмите на имя StatefulSet, чтобы увидеть Details, Topology, Logs, Events, Monitoring и т.д.
Обновление StatefulSet
- В Container Platform перейдите в Workloads > StatefulSets.
- Найдите StatefulSet, который хотите обновить.
- В выпадающем меню Actions выберите Update, чтобы открыть страницу редактирования StatefulSet, где можно обновить
Replicas
, image
, updateStrategy
и др.
Удаление StatefulSet
- В Container Platform перейдите в Workloads > StatefulSets.
- Найдите StatefulSet, который хотите удалить.
- В выпадающем меню Actions нажмите кнопку Delete в колонке операций и подтвердите.