StatefulSets — это тип рабочих нагрузок, данные или состояние которых сохраняются во время их выполнения. Например, для MySQL используют StatefulSet, потому что необходимо записывать и хранить новые данные.
Контейнер можно мигрировать между разными хостами, но данные не сохраняются на хостах. Для постоянного хранения данных StatefulSet подключите к контейнеру тома облачных хранилищ данных.
В этой инструкции описано, как создать рабочую нагрузку StatefulSets.
Создайте кластер и проверьте, что он находится в статусе «Running».
Для обеспечения публичного доступа к рабочей нагрузке проверьте, что EIP или балансировщик нагрузки привязан хотя бы к одному узлу в кластере.
Если в состав пода входят несколько контейнеров, проверьте, что используемые порты не конфликтуют друг с другом.
Чтобы создать рабочую нагрузку:
Войдите в консоль управления Advanced:
В списке сервисов выберите Cloud Container Engine.
В консоли управления CCE выберите Clusters.
Нажмите на название созданного кластера.
В левом меню выберите Workloads.
Перейдите на вкладку StatefulSets.
Нажмите Create Workload.
Заполните поле Basic Info:
Параметр | Описание |
|---|---|
Workload Type | Выберите тип рабочей нагрузки StatefulSet. |
Workload Name | Укажите название рабочей нагрузки. |
Namespace | Выберите пространство имен рабочей нагрузки. По умолчанию — default. Чтобы создать новое, нажмите Create Namespace. |
Pods | Укажите количество подов в рабочей нагрузке. |
Time Zone Synchronization | Синхронизация времени. Позволяет контейнерам и узлам работать в одном часовом поясе. Эта функция зависит от локального диска, подключенного к контейнеру. Не изменяйте и не удаляйте часовой пояс. Активируйте этот параметр при необходимости. |
Cluster Name | Название кластера указано по умолчанию. |
(Опционально) Description | Описание рабочей нагрузки. Добавьте при необходимости. |
Заполните поле Container Settings согласно таблице ниже. Чтобы настроить несколько контейнеров в поде, нажмите Add Container.
Параметр | Описание |
|---|---|
Basic Info | Выполните базовые настройки контейнера. |
Lifecycle | Настройте параметры жизненного цикла контейнера. |
Health Check | Настройте Health Check контейнера. |
Environment Variables | Настройте окружение. |
Data Storage | Настройте хранение данных. Примечание
|
Security Context | Защита системы и контейнеров от воздействия. Чтобы установить разрешения контейнера и предотвратить воздействие на системы и другие контейнеры, введите ID-пользователя. |
Logging | Настройте сбор логов контейнера. |
Image Access Credential | Укажите учетные данные, используемые для доступа к хранилищу образов. По умолчанию — default-secret. Этот секрет можно использовать для доступа к образам в SWR. Чтобы создать новый, нажмите Create Secret. |
GPU | Инстанс рабочей нагрузки будет запланирован для узла с указанным типом графической карты GPU. По умолчанию — All. |
Заполните параметры для Headless Service в поле Headless Service Parameters.
Headless Service используется для решения проблем взаимного доступа между подами в StatefulSet, а также предоставляет доменное имя с фиксированным доступом для каждого пода.
Заполните параметры для создания сервиса в поле Service Settings.
Сервис (Service) используется для доступа к поду. Сервис с фиксированным IP-адресом сервис перенаправляет трафик доступа к подам и выполняет балансировку нагрузки для этих подов.
Вы можете создать сервис после создания рабочей нагрузки.
Заполните поле Advanced Settings:
Параметр | Описание |
|---|---|
Upgrade | Настройте политику обновления рабочей нагрузки. |
Pod Management Policies | Для некоторых распределенных систем последовательность StatefulSet не нужна и/или не должна встречаться. Эти системы требуют только уникальности и идентификаторов. Выберите:
|
Scheduling | |
Toleration | Настройте допуски. |
Labels and Annotations | Настройте метки и аннотации. |
DNS | Настройте DNS. |
Нажмите Create Workload.
После успешного создания рабочая нагрузка появится со статусом «Running» на вкладке StatefulSets.
В этом примере используется рабочая нагрузка nginx, и том EVS динамически монтируется к ней с помощью параметра volumeClaimTemplates.
Используйте kubectl для подключения к кластеру.
Создайте и измените файл nginx-statefulset.yaml.
«nginx-statefulset.yaml» — это пример названия файла.
vi nginx-statefulset.yaml
Пример YAML-файла:
apiVersion: apps/v1kind: StatefulSetmetadata:name: nginxspec:selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: container-1image: nginx:latestimagePullPolicy: IfNotPresentresources:requests:cpu: 250mmemory: 512Milimits:cpu: 250mmemory: 512MivolumeMounts:- name: testreadOnly: falsemountPath: /usr/share/nginx/htmlsubPath: ''imagePullSecrets:- name: default-secretdnsPolicy: ClusterFirstvolumes: []serviceName: nginx-svcreplicas: 2volumeClaimTemplates: # Dynamically mounts the EVS volume to the workload.- apiVersion: v1kind: PersistentVolumeClaimmetadata:name: testnamespace: defaultannotations:everest.io/disk-volume-type: SAS # SAS EVS volume type.labels:failure-domain.beta.kubernetes.io/region: ru-moscow-1 # region where the EVS volume is created.failure-domain.beta.kubernetes.io/zone: # AZ where the EVS volume is created. It must be the same as the AZ of the node.spec:accessModes:- ReadWriteOnce # The value must be ReadWriteOnce for the EVS volume.resources:requests:storage: 10GistorageClassName: csi-disk # Storage class name. The value is csi-disk for the EVS volume.updateStrategy:type: RollingUpdate
Создайте и измените файл nginx-headless.yaml.
«nginx-headless.yaml» — это пример названия файла.
vi nginx-headless.yaml
apiVersion: v1kind: Servicemetadata:name: nginx-svcnamespace: defaultlabels:app: nginxspec:selector:app: nginxversion: v1clusterIP: Noneports:- name: nginxtargetPort: 80nodePort: 0port: 80protocol: TCPtype: ClusterIP
Чтобы создать развертывание, введите:
kubectl create -f nginx-statefulset.yaml
В выводе команды появится:
statefulset.apps/nginx created
Чтобы создать headless service, введите:
kubectl create -f nginx-headless.yaml
В выводе команды появится:
service/nginx-svc created
Если доступ к развертыванию будет осуществляться через сервисы ClusterIP или NodePort, добавьте соответствующий сервис. Подробнее об этом — в разделе Сети.