StatefulSet — это приложение, которое должно сохранять данные или состояние во время работы. StatefulSet подходят для stateful‑приложений, таких как базы данных, кэш‑сервисы и очереди сообщений. В отличие от Deployments, у StatefulSet есть следующие особенности:
Parameter | Description |
|---|---|
Workload Type | Выберите StatefulSet. Подробную информацию о различных типах рабочих нагрузок см. в Workload Overview. |
Workload Name | Введите имя для рабочей нагрузки. Введите от 1 до 63 символов, начинающихся со строчной буквы и заканчивающихся строчной буквой или цифрой. Допускаются только строчные буквы, цифры и дефисы (-). |
Namespace | Выберите пространство имён для рабочей нагрузки. Значение по умолчанию — default. Вы также можете нажать Create Namespace, чтобы создать его. Подробную информацию см. в Creating a Namespace. |
Pods | Введите количество pod'ов рабочей нагрузки. |
Time Zone Synchronization | Настройте, включать ли синхронизацию часового пояса. После включения этой функции контейнер и узел будут использовать один и тот же часовой пояс. Синхронизация часового пояса опирается на локальный диск, смонтированный в контейнер. Не изменяйте и не удаляйте локальный диск. Подробную информацию см. в Configuring Time Zone Synchronization. |
Если вы настроили несколько контейнеров для pod, убедитесь, что порты, используемые каждым контейнером, не конфликтуют друг с другом, иначе рабочая нагрузка не может быть развернута.
Parameter | Description |
|---|---|
Container Name | Введите имя контейнера. |
Pull Policy | Политика обновления или получения образа. Если вы выбираете Always, образ будет загружаться из репозитория образов каждый раз. Если вы не выбираете Always, предпочтительно используется существующий образ узла. Если образ не существует, он будет загружен из репозитория образов. |
Image Name | Нажмите Select Image и выберите образ, используемый контейнером. Чтобы использовать сторонний образ, введите путь к образу напрямую. Убедитесь, что image access credential может использоваться для доступа к репозиторию образов. Подробности см. в Using Third-Party Images. |
Image Tag | Выберите тег образа для развертывания. |
CPU Quota |
Если Request и Limit не указаны, квота не ограничивается. Для получения дополнительной информации и рекомендаций по Request и Limit см. Configuring Container Specifications. |
Memory Quota |
Если Request и Limit не указаны, квота не ограничивается. Для получения дополнительной информации и рекомендаций по Request и Limit см. Configuring Container Specifications. |
(Необязательно) GPU Quota | Настраивается только при наличии в кластере узлов GPU и установленном дополнении CCE AI Suite (NVIDIA GPU).
Подробности о том, как использовать GPU в кластере, см. Default GPU Scheduling in Kubernetes. |
(Необязательно) Privileged Container | Программы в привилегированном контейнере обладают определёнными привилегиями. Если эта опция включена, контейнеру будут предоставлены привилегии. Например, привилегированные контейнеры могут управлять сетевыми устройствами на хост‑машине, изменять параметры ядра, получать доступ ко всем устройствам узла. Для получения дополнительной информации см. Pod Security Standards. |
(Необязательно) Init Container | Нужно ли использовать контейнер в качестве init container. init container не поддерживает проверку состояния. Init container — это специальный контейнер, который запускается до того, как будут запущены другие контейнеры приложений в pod. Каждый pod может содержать несколько контейнеров. Кроме того, pod может содержать один или несколько init container. Контейнеры приложений в pod запускаются и работают только после завершения работы всех init container. Для получения подробной информации см. Init Containers. |
(Необязательно) Run Option | Добавьте параметры запуска для контейнера. Для получения подробной информации см. Pod. CCE поддерживает следующие параметры запуска:
|
Динамическое монтирование достигается с помощью поля volumeClaimTemplates и зависит от возможности динамического создания StorageClass. StatefulSet связывает каждый pod с PVC, используя поле volumeClaimTemplates, а PVC привязывается к соответствующему PV. Поэтому после переназначения pod исходные данные могут быть смонтированы на основе имени PVC.
Чтобы отключить сбор журналов стандартного вывода текущей рабочей нагрузки, добавьте аннотацию kubernetes.AOM.log.stdout: [] в Labels and Annotations в области Advanced Settings. Подробнее о том, как использовать эту аннотацию, см. Table 1.
Headless Service предоставляет фиксированное доменное имя доступа для каждого pod в StatefulSet для взаимного доступа pod‑ов. Подробнее см. Headless Services.
Service обеспечивает внешний доступ к pod‑ам. При статическом IP-адресе Service перенаправляет трафик доступа к pod‑ам и автоматически балансирует нагрузку для этих pod‑ов.
Вы также можете создать Service после создания рабочей нагрузки. Подробнее о Service разных типов см. Service Overview.
Parameter | Description |
|---|---|
Upgrade | Укажите режим обновления и параметры рабочей нагрузки. Rolling upgrade и Replace upgrade доступны. Подробнее см. Upgrading and Rolling Back a Workload. |
Pod Management Policies | Для некоторых распределённых систем гарантии упорядочения StatefulSet не нужны и/или нежелательны. Такие системы требуют только уникальности и идентификаторов.
|
Scheduling | Настройте политики аффинити и анти‑аффинити для гибкого планирования рабочей нагрузки. Предоставляются политики Load affinity и Node affinity.
|
Толерантность | Использование как taints, так и tolerations позволяет (не принудительно) планировать pod на узел с соответствующими taints и управлять политиками выселения pod после того, как узел, на котором находится pod, будет помечен taint. Для получения подробной информации см. Configuring Tolerance Policies. |
Метки и аннотации | Добавьте метки или аннотации для pod'ов, используя пары ключ‑значение. После настройки нажмите Confirm. Для получения подробной информации о метках и аннотациях см. Configuring Labels and Annotations. |
DNS | Настройте отдельную политику DNS для рабочей нагрузки. Для получения подробной информации см. DNS Configuration. |
Настройка сети |
|
В этом примере используется нагрузка Nginx, и том EVS динамически монтируется к ней с помощью поля volumeClaimTemplates.
nginx-statefulset.yaml — пример имени файла, его можно изменить по требованию.
vi nginx-statefulset.yaml
Ниже приведённый контент является лишь примером. Подробности о StatefulSets см. в Kubernetes official documentation.
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: ru-moscow-1a # 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 # StorageClass name. The value is csi-disk for the EVS volume.updateStrategy:type: RollingUpdate
Создайте файл 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 создан:
statefulset.apps/nginx created
Создайте headless Service.
kubectl create -f nginx-headless.yaml
Если отображается следующая информация, headless Service успешно создан.
service/nginx-svc created