Работа с PersistentVolume
Механизм Persistent Volume Claim (PVC) позволяет динамически выделять и подключать к вашим подам блочные диски с необходимыми характеристиками.
Для того, чтобы динамически создать PV на базе PVC, вам потребуется указать корректный класс хранения (storage class). Чтобы получить полный список классов хранения и типов дисков, доступных для вашего кластера, необходимо выполнить команду:
kubectl get storageclassesПример результата выполнения команды:
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGEmts-ssd-basic csi.vsphere.vmware.com Delete Immediate false 6d5hmts-ssd-fast (default) csi.vsphere.vmware.com Delete Immediate false 6d5hmts-ssd-ultra csi.vsphere.vmware.com Delete Immediate false 6d5hmts-ssd-ultra-plus csi.vsphere.vmware.com Delete Immediate false 6d5hОтметка default означает, что если не указать параметр storageClassName, то будет использован класс хранилищ по умолчанию: mts-ssd-fast.
Технические характеристики различных классов
Заголовок раздела «Технические характеристики различных классов»| Storage Class | IOPS Reservation | IOPS Limit | IPOS Shares |
|---|---|---|---|
| mts-ssd-basic | 200 | 40000 | 200 |
| mts-ssd-fast | 500 | 40000 | 200 |
| mts-ssd-ultra | 1000 | 40000 | 1000 |
| mts-ssd-ultra-plus | 5000 | 40000 | 30000 |
Reservation - минимально гарантированная производительность канала в операциях ввода-вывода (IOPS). Она выделяется машине безусловно (резервируется для данной машины).
Limit - верхний предел в IOPS, которые машина может потреблять.
Shares - относительная доля диска по отношению к остальным виртуальным дискам в хранилище. Более высокое значение IOPS Shares позволяет диску поддерживать большее количество одновременных операций ввода-вывода в условиях конкуренции за ресурсы.
Стоимость 1Gb для каждой дисковой политики равна цене аналогичной дисковой политики для диска worker-нод.
Динамическое выделение дисков с PVC
Заголовок раздела «Динамическое выделение дисков с PVC»Создайте объект PersistentVolumeClaim
Заголовок раздела «Создайте объект PersistentVolumeClaim»Сохраните следующую спецификацию для создания объекта PersistentVolumeClaim в YAML-файл с названием test-pvc.yaml. Подробнее о спецификации для создания объекта PersistentVolumeClaim можно узнать в документации Kubernetes.
При подготовке спецификации задайте необходимый объем дискового пространства.
kind: PersistentVolumeClaimapiVersion: v1metadata: name: test-pvc annotations: volume.beta.kubernetes.io/storage-class: mts-ssd-fastspec: accessModes: - ReadWriteOnce resources: requests: storage: 1GiВыполните команду:
kubectl create -f test-pvc.yamlРезультат выполнения команды:
persistentvolumeclaim/test-pvc createdСоздайте под с динамически подготовленным томом
Заголовок раздела «Создайте под с динамически подготовленным томом»Сохраните следующую спецификацию для создания пода в YAML-файл с названием pod.yaml. Подробнее о спецификации для создания пода можно узнать в документации Kubernetes.
apiVersion: v1kind: Podmetadata: name: podspec: 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-pvcmountPath— это точка монтирования PersistentVolume в файловую систему контейнера.
Все данные, которые приложение в контейнере будет писать в директорию /data будут сохранятся на PersistentVolume.
Выполните команду:
kubectl create -f pod.yamlРезультат выполнения команды:
pod/pod createdУбедитесь, что под с примонтированным PersistentVolume успешно создан
Заголовок раздела «Убедитесь, что под с примонтированным PersistentVolume успешно создан»Выполните команду:
kubectl describe pods podРезультат выполнения команды:
Name: podNamespace: defaultPriority: 0Node: beloved-walrus-b3f5dc-b15729/10.100.0.137Start Time: Mon, 26 Apr 2021 17:26:22 +0300Labels: <none>Annotations: cni.projectcalico.org/podIP: 192.168.199.16/32Status: 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: falseQoS Class: BestEffortNode-Selectors: <none>Tolerations: node.kubernetes.io/not-ready:NoExecute op=Exists for 300s node.kubernetes.io/unreachable:NoExecute op=Exists for 300sEvents: 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
Заголовок раздела «Создание 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:yaml apiVersion: apps/v1kind: Deploymentmetadata:name: task-pv-podspec:replicas: 1strategy:type: Recreateselector:matchLabels:app: testtemplate:metadata:labels:app: testspec:containers:- name: task-pv-containercommand: ["/bin/sh","-c"]args:- touch /var/log/test.txt;cat /var/log/test.txt;echo "test pv" >> /var/log/test.txt;sleep 36000;image: alpinevolumeMounts:- mountPath: "/var/log/"name: test-pvcvolumes:- name: test-pvcpersistentVolumeClaim:claimName: test-pvcВыполните команду:
shell kubectl apply -f task-pv-pod.yamlРезультат выполнения команды:
shell deployment.apps/task-pv-pod createdУбедитесь, что под с примонтированным PersistentVolume успешно создан. Выполните команду:
shell kubectl get podsРезультат выполнения команды:
shell NAME READY STATUS RESTARTS AGEtask-pv-pod-65595866c6-m998s 1/1 Running 0 23sВыведите в консоль содержимое файла
test.txt. Выполните команду:shell kubectl exec -it task-pv-pod-65595866c6-m998s -- cat /var/log/test.txtРезультат выполнения команды:
shell test pvПроверьте сохранность данных при удалении пода. Для этого пересоздайте под и проверьте результат:
Выполните команду:
shell kubectl delete pod task-pv-pod-65595866c6-m998sРезультат выполнения команды:
shell pod "task-pv-pod-65595866c6-m998s" deletedДалее повторите действия из предыдущего шага:
shell kubectl get podsNAME READY STATUS RESTARTS AGEtask-pv-pod-65595866c6-mgvxr 1/1 Running 0 73skubectl exec -it task-pv-pod-65595866c6-mgvxr -- cat /var/log/test.txttest pvtest pv