Создать StatefulSet

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

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

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

  1. Создайте кластер Managed Kubernetes и хотя бы одну группу узлов.

  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 : mongo
    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" deleted

    Поды удалятся вместе со 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