Создать StatefulSet
StatefulSet — тип рабочей нагрузки, предназначенный для управления приложениями, которые сохраняют состояние. Например, приложение с базой данных PostgreSQL, MySQL или MongoDB.
В этой инструкции описано, как создать рабочую нагрузку StatefulSet в кластере Managed Kubernetes.
Перед началом работы
Создайте кластер Managed Kubernetes и хотя бы одну группу узлов.
Установите CSI-драйвер для работы с постоянными томами.
Создайте SNAT-шлюз для доступа к образу, который будете развертывать на поде.
Подключитесь к созданному кластеру.
Шаг 1. Создайте Service
Service (сервис) — объект, определяющий логический набор подов и политику доступа к ним.
Создайте файл cloudru-service.yaml и сохраните следующую спецификацию:
apiVersion : v1kind : Servicemetadata :name : cloudru-mongolabels :name : mongospec :ports :- port : 27017targetPort : 27017clusterIP : Noneselector :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/v1kind : StatefulSetmetadata :name : cloudru-statefulsetspec :selector :matchLabels :app : mongoserviceName : "mongo"replicas : 3template :metadata :labels :app : mongospec :terminationGracePeriodSeconds : 10containers :- name : mongoimage : mongoports :- containerPort : 27017volumeMounts :- name : dbmountPath : /data/dbvolumeClaimTemplates :- metadata :name : dbspec :accessModes : [ "ReadWriteOnce" ]storageClassName : cloudru-nvmeresources :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 AGEcloudru-statefulset 3 /3 85sПроверьте статусы созданных подов:
kubectl get pods -l = "app=mongo"Результат:
NAME READY STATUS RESTARTS AGEcloudru-statefulset-0 1 /1 Running 0 13mcloudru-statefulset-1 1 /1 Running 0 13mcloudru-statefulset-2 1 /1 Running 0 13mПроверьте статусы созданных Persistent Volume Claim и постоянных томов:
kubectl get pvc,pvРезультат:
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGEpersistentvolumeclaim/db-cloudru-statefulset-0 Bound pvc-ae228503-d4be-4572-8d35-a1d2050e5c05 1Gi RWO cloudru-nvme 10mpersistentvolumeclaim/db-cloudru-statefulset-1 Bound pvc-42abe866-e2e0-4697-82d9-691e49c7668d 1Gi RWO cloudru-nvme 10mpersistentvolumeclaim/db-cloudru-statefulset-2 Bound pvc-de91078f-3fd1-4b1e-96ea-1fd8e08d644d 1Gi RWO cloudru-nvme 9m51sNAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGEpersistentvolume/pvc-42abe866-e2e0-4697-82d9-691e49c7668d 1Gi RWO Delete Bound default/db-cloudru-statefulset-1 cloudru-nvme 10mpersistentvolume/pvc-ae228503-d4be-4572-8d35-a1d2050e5c05 1Gi RWO Delete Bound default/db-cloudru-statefulset-0 cloudru-nvme 10mpersistentvolume/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-0kubectl delete pvc db-cloudru-statefulset-1kubectl delete pvc db-cloudru-statefulset-2Соответствующие тома удалятся автоматически.
- Перед началом работы
- Шаг 1. Создайте Service
- Шаг 2. Создайте StatefulSet
- Шаг 3. Удалите ресурсы