Работа с 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 | 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
Примечание
Для StatefullSet рекомендуем создавать отдельную Группу нод, чтобы избежать случайного удаления ноды при масштабировании.
Создайте объект PersistentVolumeClaim
Сохраните следующую спецификацию для создания объекта PersistentVolumeClaim в YAML-файл с названием test-pvc.yaml. Подробнее о спецификации для создания объекта PersistentVolumeClaim можно узнать в документации Kubernetes.
При подготовке спецификации задайте необходимый объем дискового пространства.
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 create -f test-pvc.yamlРезультат выполнения команды:
persistentvolumeclaim/test-pvc createdВнимание
Containerum Kubernetes не поддерживает режим доступа ReadWriteMany. Это обусловлено особенностями реализации гипервизора и стремлением к наибольшей надежности работы хранилища.
Внимание
MTS Cloud не несет ответственности и не гарантирует сохранность данных при использовании PersistentVolume, созданных без PersistentVolumeClaim, например, с типом hostPath или local.
Создайте под с динамически подготовленным томом
Сохраните следующую спецификацию для создания пода в 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-pvcmountPath— это точка монтирования PersistentVolume в файловую систему контейнера.
Все данные, которые приложение в контейнере будет писать в директорию /data будут сохранятся на PersistentVolume.
Важно
Если вы хотите, чтобы контейнер использовал несколько PersistentVolume, то используйте различные точки монтирования mountPath.
Выполните команду:
kubectl create -f pod.yamlРезультат выполнения команды:
pod/pod createdУбедитесь, что под с примонтированным PersistentVolume успешно создан
Выполните команду:
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:yamlapiVersion: 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Выполните команду:
shkubectl apply -f task-pv-pod.yamlРезультат выполнения команды:
shdeployment.apps/task-pv-pod createdУбедитесь, что под с примонтированным PersistentVolume успешно создан. Выполните команду:
shkubectl get podsРезультат выполнения команды:
shNAME READY STATUS RESTARTS AGE task-pv-pod-65595866c6-m998s 1/1 Running 0 23sВыведите в консоль содержимое файла
test.txt. Выполните команду:shkubectl exec -it task-pv-pod-65595866c6-m998s -- cat /var/log/test.txtРезультат выполнения команды:
shtest pvПроверьте сохранность данных при удалении пода. Для этого пересоздайте под и проверьте результат:
Выполните команду:
shkubectl delete pod task-pv-pod-65595866c6-m998sРезультат выполнения команды:
shpod "task-pv-pod-65595866c6-m998s" deletedДалее повторите действия из предыдущего шага:
shkubectl 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