- Virtual Infrastructure
- Disaster Recovery
- Кроссплатформенная миграция на базе Киберпротект
- Veeam Agent BaaS
- Veeam Cloud Connect
- Объектное хранилище #CloudMTS
- GPU Workspaces
- VDI Desktops
- Cloud CDN / Медиасервисы
- Диск #CloudMTS
- Техническая поддержка и отзывы
- DBaaS for PostgreSQL
- Containerum Kubernetes
- GPU SuperCloud
Работа с PersistentVolume
Механизм Persistent Volume Claim (PVC) позволяет динамически выделять и подключать к подам блочные диски с необходимыми характеристиками.
Чтобы динамически создать PV на базе PVC, потребуется указать корректный класс хранения (storage class). Чтобы получить полный список классов хранения и типов дисков, доступных для кластера, необходимо выполнить команду:
$ kubectl get storageclasses |
Пример результата выполнения команды:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE mts-ssd-basic csi.vsphere.vmware.com Delete Immediate false 6d5h mts-ssd-fast ( default ) csi.vsphere.vmware.com Delete Immediate false 6d5h mts-ssd-ultra csi.vsphere.vmware.com Delete Immediate false 6d5h mts-ssd-ultra-plus csi.vsphere.vmware.com Delete Immediate false 6d5h |
Отметка default
означает, что если не указать параметр storageClassName
, будет использован класс хранилищ по умолчанию: mts-ssd-fast
Технические характеристики различных классов
Storage Class | IOPS Reservation | IOPS Limit | IOPS Shares |
---|---|---|---|
mts-ssd-basic | 200 | 40 000 | 200 |
mts-ssd-fast | 500 | 40 000 | 200 |
mts-ssd-ultra | 1000 | 40 000 | 1000 |
mts-ssd-ultra-plus | 5000 | 40 000 | 3000 |
Reservation - минимально гарантированная производительность канала в операциях ввода-вывода (IOPS). Она выделяется машине безусловно (резервируется для данной машины).
Limit - верхний предел в IOPS, которые машина может потреблять.
Shares - относительная доля диска по отношению к остальным виртуальным дискам в хранилище. Более высокое значение IOPS Shares позволяет диску поддерживать большее количество одновременных операций ввода-вывода в условиях конкуренции за ресурсы.
Стоимость 1 Gb для каждой дисковой политики равна цене аналогичной дисковой политики для диска worker-нод.
Динамическое выделение дисков с PVC
Для StatefullSet
рекомендуем создавать отдельную Группу нод, чтобы избежать случайного удаления ноды при масштабировании.
Создайте объект PersistentVolumeClaim
Сохраните следующую спецификацию для создания объекта PersistentVolumeClaim
в YAML-файл с названием test-pvc.yaml
.
Подробнее о спецификации для создания объекта PersistentVolumeClaim читайте в данной статье.
При подготовке спецификации задайте необходимый объем дискового пространства.
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-pvc annotations: volume.beta.kubernetes.io/storage-class : mts-ssd-fast spec: accessModes: - ReadWriteOnce resources: requests: storage: 1Gi |
Выполните в kubectl команду:
$ kubectl create -f test-pvc.yaml |
Результат выполнения команды:
persistentvolumeclaim/test-pvc created |
Containerum Kubernetes не поддерживает режим доступа ReadWriteMany
. Это обусловлено особенностями реализации гипервизора и стремлением к наибольшей надежности работы хранилища.
MTS Cloud не несет ответственности и не гарантирует сохранность данных при использовании PersistentVolume, созданных без PersistentVolumeClaim, например, с типом hostPath или local.
Создайте pod с динамически подготовленным томом
Сохраните следующую спецификацию для создания пода в YAML-файл с названием pod.yaml
.
Подробнее о спецификации для создания пода читайте в документации Kubernetes.
apiVersion: v1 kind: Pod metadata: name: pod spec: containers: - name : app image: ubuntu command: [ "/bin/sh" ] args: [ "-c" , "while true; do echo $(date -u) >> /data/out.txt; sleep 5; done" ] volumeMounts: - name : persistent-storage mountPath: /data volumes: - name : persistent-storage persistentVolumeClaim: claimName: test-pvc |
mountPath
— это точка монтирования PersistentVolume в файловую систему контейнера.
Все данные, которые приложение в контейнере будет писать в директорию /data,
будут сохранятся на PersistentVolume.
Важно. Если вы хотите, чтобы контейнер использовал несколько PersistentVolume, то используйте различные точки монтирования mountPath
Выполните в kubectl команду:
$ kubectl create -f pod.yaml |
Результат выполнения команды:
pod/pod created |
Убедитесь, что pod
с примонтированным PersistentVolume
успешно создан
Выполните в kubectl команду:
$ kubectl describe pods pod |
Результат выполнения команды:
Name: pod Namespace: default Priority: 0 Node: beloved-walrus-b3f5dc-b15729/ 10.100 . 0.137 Start Time: Mon, 26 Apr 2021 17 : 26 : 22 + 0300 Labels: <none> Annotations: cni.projectcalico.org/podIP: 192.168 . 199.16 / 32 Status: Running ... Volumes: persistent-storage: Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace) ClaimName: test-pvc ReadOnly: false default -token-nzmgl: Type: Secret (a volume populated by a Secret) SecretName: default -token-nzmgl Optional: false QoS Class: BestEffort Node-Selectors: <none> Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300s Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 4m12s default -scheduler Successfully assigned default /pod to beloved-walrus-b3f5dc-b15729 Normal SuccessfulAttachVolume 4m11s attachdetach-controller AttachVolume.Attach succeeded for volume "pvc-59b4a96b-efdf-4b38-834d-99dbcc1a7475" Normal Pulling 4m9s kubelet Pulling image "ubuntu" Normal Pulled 3m59s kubelet Successfully pulled image "ubuntu" in 9 .528515094s Normal Created 3m59s kubelet Created container app Normal Started 3m59s kubelet Started container app |
После создания пода:
- на странице "Список кластеров" нажмите на имя кластера Kubernetes, для которого создавался PersistentVolume
- на вкладке Выделенные тома вы увидите все созданные PersitentVolumes, их имена и размеры
Создание Deployment c Persistent Volume Claim
В данном примере запускается контейнер, в котором создается файл /var/log/test.txt
и выполняется команда echo "test pv" >> /var/log/test.txt
, которая записывает строку "test pv" в файл test.txt
.
Следовательно, при каждом перезапуске пода файл будет пополняться дополнительной записью.
Сохраните следующую спецификацию для создания пода в YAML-файл с названием task-pv-pod.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: task-pv-pod spec: replicas: 1 strategy: type: Recreate selector: matchLabels: app: test template: metadata: labels: app: test spec: containers: - name : task-pv-container command: [ "/bin/sh" , "-c" ] args: - touch /var/log/test.txt; cat /var/log/test.txt; echo "test pv" >> /var/log/test.txt; sleep 36000; image: alpine volumeMounts: - mountPath : "/var/log/" name: test-pvc volumes: - name : test-pvc persistentVolumeClaim: claimName: test-pvc |
Выполните в kubectl команду:
$ kubectl apply -f task-pv-pod.yaml |
Результат выполнения команды:
deployment.apps/task-pv-pod created |
Убедитесь, что pod
с примонтированным PersistentVolume
успешно создан. Выполните команду:
$ kubectl get pods |
Результат выполнения команды:
NAME READY STATUS RESTARTS AGE task-pv-pod-65595866c6-m998s 1 / 1 Running 0 23s |
Выведем в консоль содержимое файла test.txt
. Выполните команду:
$ kubectl exec -it task-pv-pod-65595866c6-m998s -- cat /var/log/test.txt |
Результат выполнения команды:
test pv |
Проверим сохранность данных при удалении пода. Для этого пересоздаем под и проверяем результат.
Выполните в kubectl команду:
$ kubectl delete pod task-pv-pod-65595866c6-m998s |
Результат выполнения команды:
pod "task-pv-pod-65595866c6-m998s" deleted |
Далее повторим действия из предыдущего шага:
$ kubectl get pods NAME READY STATUS RESTARTS AGE task-pv-pod-65595866c6-mgvxr 1 / 1 Running 0 73s $ kubectl exec -it task-pv-pod-65595866c6-mgvxr -- cat /var/log/test.txt test pv test pv |
Описания и инструкции, размещаемые на данном ресурсе, носят исключительно информационный характер и не могут рассматриваться в качестве гарантий, заверений, рекомендаций или документа, порождающего какие-либо обязательства МТС. Конкретные условия использования сервисов определяются договорами с клиентом. МТС не несет ответственности за содержание публикуемых инструкций и результаты их применения клиентом. Актуальность отдельных положений публикуемых описаний и инструкций необходимо уточнять у аккаунт-менеджера или службы технической поддержки support@cloud.mts.ru