- tocdepth
2
Создать StatefulSet
StatefulSet — тип рабочей нагрузки, предназначенный для управления приложениями, которые сохраняют состояние. Например, приложение с базой данных PostgreSQL, MySQL или MongoDB.
В этой инструкции описано, как создать рабочую нагрузку StatefulSet в кластере Managed Kubernetes.
Перед началом работы
Создайте кластер с публичным IP-адресом и группу узлов.
Установите CSI-драйвер для работы с постоянными томами.
Создайте SNAT-шлюз для доступа к образу, который будете разворачивать на поде.
Подключитесь к созданному кластеру.
Шаг 1. Создайте Service
Service (сервис) — объект, определяющий логический набор подов и политику доступа к ним.
Создайте файл
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.
Выполните команду:
kubectl create -f cloudru-service.yaml
Результат:
service/cloudru-mongo created
Шаг 2. Создайте StatefulSet
Создайте файл
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.
Выполните команду:
kubectl create -f cloudru-statefulset.yaml
Если команда выполнена успешно, будет создан StatefulSet с названием cloudru-statefulset, который состоит из трех подов с примонтированным к каждому поду постоянным томом размером 1 ГБ.
Проверьте готовность StatefulSet:
kubectl get statefulset
Результат:
NAME READY AGE cloudru-statefulset 3/3 85s
Проверьте статусы созданных подов:
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
Проверьте статусы созданных 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, удалите созданные ресурсы.
Удалите StatefulSet:
kubectl delete statefulset cloudru-statefulset
Результат:
statefulset.apps "cloudru-statefulset" deleted
Поды удалятся вместе со StatefulSet.
Удалите PVC:
kubectl delete pvc db-cloudru-statefulset-0 kubectl delete pvc db-cloudru-statefulset-1 kubectl delete pvc db-cloudru-statefulset-2
Соответствующие тома удалятся автоматически.
для Dev & Test