Работа с 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-pvc
mountPath
— это точка монтирования 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