Создание StatefulSets

StatefulSets — это тип рабочих нагрузок, данные или состояние которых сохраняются во время их выполнения. Например, для MySQL используют StatefulSet, потому что необходимо записывать и хранить новые данные.

Контейнер можно мигрировать между разными хостами, но данные не сохраняются на хостах. Для постоянного хранения данных StatefulSet подключите к контейнеру тома облачных хранилищ данных.

В этой инструкции описано, как создать рабочую нагрузку StatefulSets.

Перед началом работы

  • Создайте кластер и проверьте, что он находится в статусе «Running».

  • Для обеспечения публичного доступа к рабочей нагрузке проверьте, что EIP или балансировщик нагрузки привязан хотя бы к одному узлу в кластере.

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

Создание рабочей нагрузки в консоли ССЕ

Чтобы создать рабочую нагрузку:

  1. Войдите в консоль управления Advanced:

  2. Чтобы открыть список сервисов, нажмите Service List.

  3. Выберите Computing → Cloud Container Engine.

  4. В консоли управления CCE выберите Clusters.

  5. Нажмите на название созданного кластера.

  6. В левом меню выберите Workloads.

  7. Перейдите на вкладку StatefulSets.

  8. Нажмите Create Workload.

  9. Заполните поле Basic Info:

    Параметр

    Описание

    Workload Type

    Выберите тип рабочей нагрузки StatefulSet.

    Workload Name

    Укажите название рабочей нагрузки.

    Namespace

    Выберите пространство имен рабочей нагрузки.

    По умолчанию — default. Чтобы создать новое, нажмите Create Namespace.

    Pods

    Укажите количество подов в рабочей нагрузке.

    Time Zone Synchronization

    Синхронизация времени. Позволяет контейнерам и узлам работать в одном часовом поясе. Эта функция зависит от локального диска, подключенного к контейнеру. Не изменяйте и не удаляйте часовой пояс.

    Активируйте этот параметр при необходимости.

    Cluster Name

    Название кластера указано по умолчанию.

    (Опционально) Description

    Описание рабочей нагрузки.

    Добавьте при необходимости.

  10. Заполните поле Container Settings согласно таблице ниже. Чтобы настроить несколько контейнеров в поде, нажмите Add Container.

    Параметр

    Описание

    Basic Info

    Выполните базовые настройки контейнера.

    Lifecycle

    Настройте параметры жизненного цикла контейнера.

    Health Check

    Настройте Health Check контейнера.

    Environment Variables

    Настройте окружение.

    Data Storage

    Настройте хранение данных.

    Примечание

    • StatefulSets поддерживают динамически монтируемые тома EVS.

      Динамическое монтирование достигается с помощью параметра volumeClaimTemplates и зависит от возможности динамического создания StorageClass. StatefulSet связывает каждый под с уникальным PVC с помощью параметра volumeClaimTemplates, а PVC привязываются к соответствующим PV. Таким образом, после изменения расписания пода исходные данные могут быть смонтированы с помощью PVC.

    • После создания рабочей нагрузки динамически монтируемое хранилище не может быть обновлено.

    Security Context

    Защита системы и контейнеров от воздействия.

    Чтобы установить разрешения контейнера и предотвратить воздействие на системы и другие контейнеры, введите ID-пользователя.

    Logging

    Настройте сбор логов контейнера.

    Image Access Credential

    Укажите учетные данные, используемые для доступа к хранилищу образов.

    По умолчанию — default-secret. Этот секрет можно использовать для доступа к образам в SWR. Чтобы создать новый, нажмите Create Secret.

    GPU

    Инстанс рабочей нагрузки будет запланирован для узла с указанным типом графической карты GPU.

    По умолчанию — All.

  11. Заполните параметры для Headless Service в поле Headless Service Parameters.

    Headless Service используется для решения проблем взаимного доступа между подами в StatefulSet, а также предоставляет доменное имя с фиксированным доступом для каждого пода.

  12. Заполните параметры для создания сервиса в поле Service Settings.

    Сервис (Service) используется для доступа к поду. Сервис с фиксированным IP-адресом сервис перенаправляет трафик доступа к подам и выполняет балансировку нагрузки для этих подов.

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

  13. Заполните поле Advanced Settings:

    Параметр

    Описание

    Upgrade

    Настройте политику обновления рабочей нагрузки.

    Pod Management Policies

    Для некоторых распределенных систем последовательность StatefulSet не нужна и/или не должна встречаться. Эти системы требуют только уникальности и идентификаторов.

    Выберите:

    • OrderedReady — StatefulSet будет разворачивать, удалять или масштабировать поды в определенной последовательности (StatefulSet продолжается только после того, как предыдущий под будет готов или удален). Эта политика выбрана по умолчанию.

    • Parallel — StatefulSet будет создавать поды параллельно и удалять их сразу.

    Scheduling

    Настройте политику планирования (Affinity/Anti-affinity).

    Toleration

    Настройте допуски.

    Labels and Annotations

    Настройте метки и аннотации.

    DNS

    Настройте DNS.

  14. Нажмите Create Workload.

После успешного создания рабочая нагрузка появится со статусом «Running» на вкладке StatefulSets.

Создание рабочей нагрузки через kubectl

В этом примере используется рабочая нагрузка nginx, и том EVS динамически монтируется к ней с помощью параметра volumeClaimTemplates.

  1. Используйте kubectl для подключения к кластеру.

  2. Создайте и измените файл nginx-statefulset.yaml.

    «nginx-statefulset.yaml» — это пример названия файла.

    vi nginx-statefulset.yaml
    

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

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          containers:
            - name: container-1
              image: nginx:latest
              imagePullPolicy: IfNotPresent
              resources:
                requests:
                  cpu: 250m
                  memory: 512Mi
                limits:
                  cpu: 250m
                  memory: 512Mi
              volumeMounts:
                - name: test
                  readOnly: false
                  mountPath: /usr/share/nginx/html
                  subPath: ''
          imagePullSecrets:
            - name: default-secret
          dnsPolicy: ClusterFirst
          volumes: []
      serviceName: nginx-svc
      replicas: 2
    volumeClaimTemplates:  # Dynamically mounts the EVS volume to the workload.
        - apiVersion: v1
          kind: PersistentVolumeClaim
          metadata:
            name: test
            namespace: default
            annotations:
              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: 10Gi
            storageClassName: csi-disk # Storage class name. The value is csi-disk for the EVS volume.
      updateStrategy:
        type: RollingUpdate
    
  3. Создайте и измените файл nginx-headless.yaml.

    «nginx-headless.yaml» — это пример названия файла.

    vi nginx-headless.yaml
    
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-svc
      namespace: default
      labels:
        app: nginx
    spec:
      selector:
        app: nginx
        version: v1
      clusterIP: None
      ports:
        - name: nginx
          targetPort: 80
          nodePort: 0
          port: 80
          protocol: TCP
      type: ClusterIP
    
  4. Чтобы создать развертывание, введите:

    kubectl create -f nginx-statefulset.yaml
    

    В выводе команды появится:

    statefulset.apps/nginx created
    
  5. Чтобы создать headless service, введите:

    kubectl create -f nginx-headless.yaml
    

    В выводе команды появится:

    service/nginx-svc created
    

Примечание

Если доступ к развертыванию будет осуществляться через сервисы ClusterIP или NodePort, добавьте соответствующий сервис. Подробнее об этом — в разделе Сети.

Запустили Evolution free tier
для Dev & Test
Получить