Создать StatefulSet

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

В этой инструкции описано, как создать рабочую нагрузку StatefulSet в кластере Managed Kubernetes.

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

  1. Создайте кластер с публичным IP-адресом и группу узлов.

  2. Установите CSI-драйвер для работы с постоянными томами.

  3. Создайте SNAT-шлюз для доступа к образу, который будете разворачивать на поде.

  4. Подключитесь к созданному кластеру.

Шаг 1. Создайте Service

Service (сервис) — объект, определяющий логический набор подов и политику доступа к ним.

  1. Создайте файл cloudru-service.yaml и сохраните следующую спецификацию:

    apiVersion: v1
    kind: Service
    metadata:
      name: cloudru-mongo
      labels:
        name: mongo
    spec:
      ports:
        - port: 27017
          targetPort: 27017
      clusterIP: None
      selector:
        role: mongo
    

    Где:

    • metadata.name — название сервиса.

    • spec.ports.port — порт, на который сервис будет принимать запросы.

    • spec.ports.targetPort — порт, на который сервис будет пересылать приходящие запросы.

    • spec.clusterIP — параметр, определяющий доступ к сервису по внутреннему IP-адресу в кластере. «None» означает, что название сервиса преобразуется не во внутренний IP, а сразу в IP пода.

    Подробное описание параметров спецификации Service см. в документации Kubernetes.

  2. Выполните команду:

    kubectl create -f cloudru-service.yaml
    

    Результат:

    service/cloudru-mongo created
    

Шаг 2. Создайте StatefulSet

  1. Создайте файл cloudru-statefulset.yaml и сохраните следующую спецификацию:

    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: cloudru-statefulset
    spec:
      selector:
        matchLabels:
          app: nginx
      serviceName: "mongo"
      replicas: 3
      template:
        metadata:
          labels:
            app: mongo
        spec:
          terminationGracePeriodSeconds: 10
          containers:
          - name: mongo
            image: mongo
            ports:
            - containerPort: 27017
            volumeMounts:
            - name: db
              mountPath: /data/db
      volumeClaimTemplates:
      - metadata:
          name: db
        spec:
          accessModes: [ "ReadWriteOnce" ]
          storageClassName: cloudru-nvme
          resources:
            requests:
              storage: 1Gi
    

    Где:

    • metadata.name — название StatefulSet.

    • spec.selector.matchLabels.app — селектор, который устанавливает связь между StatefulSet и управляемыми подами.

    • spec.serviceName — название управляющего сервиса.

    • spec.replicas — количество желаемых подов. По умолчанию значение 1.

    • spec.template — информация о создаваемых подах.

    • spec.template.metadata.labels.app — селектор из spec.selector.matchLabels.app для связи создаваемых подов и StatefulSet.

    • spec.template.spec.terminationGracePeriodSeconds — время в секундах на корректное завершение приложения.

    • spec.template.spec.containers — список параметров для контейнеров.

    • spec.template.spec.containers.image — название контейнера.

    • spec.template.spec.containers.image — образ приложения, которое будет развернуто в контейнере.

    • spec.templates.spec.containers.ports — порты, которые необходимо открыть у контейнера.

    • spec.templates.spec.containers.volumeMounts — параметры монтирования тома.

    • spec.templates.spec.volumeMounts.name — название подключаемого тома.

    • spec.templates.spec.volumeMounts.mountPath — путь к каталогу в файловой системе контейнера, куда должен быть смонтирован том.

    • spec.volumeClaimTemplates — параметры запроса постоянных томов для каждого пода.

    Подробное описание параметров спецификации StatefulSet см. в документации Kubernetes.

  2. Выполните команду:

    kubectl create -f cloudru-statefulset.yaml
    

    Если команда выполнена успешно, будет создан StatefulSet с названием cloudru-statefulset, который состоит из трех подов с примонтированным к каждому поду постоянным томом размером 1 ГБ.

  3. Проверьте готовность StatefulSet:

    kubectl get statefulset
    

    Результат:

    NAME                  READY   AGE
    cloudru-statefulset   3/3     85s
    
  4. Проверьте статусы созданных подов:

    kubectl get pods -l="app=mongo"
    

    Результат:

    NAME                               READY   STATUS    RESTARTS   AGE
    cloudru-statefulset-0              1/1     Running   0          13m
    cloudru-statefulset-1              1/1     Running   0          13m
    cloudru-statefulset-2              1/1     Running   0          13m
    
  5. Проверьте статусы созданных Persistent Volume Claim и постоянных томов:

    kubectl get pvc,pv
    

    Результат:

    NAME                                             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    persistentvolumeclaim/db-cloudru-statefulset-0   Bound    pvc-ae228503-d4be-4572-8d35-a1d2050e5c05   1Gi        RWO            cloudru-nvme   10m
    persistentvolumeclaim/db-cloudru-statefulset-1   Bound    pvc-42abe866-e2e0-4697-82d9-691e49c7668d   1Gi        RWO            cloudru-nvme   10m
    persistentvolumeclaim/db-cloudru-statefulset-2   Bound    pvc-de91078f-3fd1-4b1e-96ea-1fd8e08d644d   1Gi        RWO            cloudru-nvme   9m51s
    
    NAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                              STORAGECLASS   REASON   AGE
    persistentvolume/pvc-42abe866-e2e0-4697-82d9-691e49c7668d   1Gi        RWO            Delete           Bound    default/db-cloudru-statefulset-1   cloudru-nvme            10m
    persistentvolume/pvc-ae228503-d4be-4572-8d35-a1d2050e5c05   1Gi        RWO            Delete           Bound    default/db-cloudru-statefulset-0   cloudru-nvme            10m
    persistentvolume/pvc-de91078f-3fd1-4b1e-96ea-1fd8e08d644d   1Gi        RWO            Delete           Bound    default/db-cloudru-statefulset-2   cloudru-nvme            9m51s
    

Теперь созданный StatefulSet будет управлять развернутыми на подах нагрузками.

Шаг 3. Удалите ресурсы

Если вы закончили работать с StatefulSet, удалите созданные ресурсы.

  1. Удалите StatefulSet:

    kubectl delete statefulset cloudru-statefulset
    

    Результат:

    statefulset.apps "cloudru-statefulset"
    

    Поды удалятся вместе со StatefulSet.

  2. Удалите PVC:

    kubectl delete pvc db-cloudru-statefulset-0
    kubectl delete pvc db-cloudru-statefulset-1
    kubectl delete pvc db-cloudru-statefulset-2
    

    Соответствующие тома удалятся автоматически.

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