Механизм 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
. Это обусловлено особенностями реализации гипервизора и стремлением к наибольшей надежности работы хранилища.
Создайте 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