Page tree
Skip to end of metadata
Go to start of metadata

Механизм 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 ClassIOPS ReservationIOPS LimitIOPS Shares

mts-ssd-basic 

20040 000200

mts-ssd-fast

50040 000200

mts-ssd-ultra

100040 0001000
mts-ssd-ultra-plus500040 0003000

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
  • No labels