Skip to content
На этой странице:

Работа с PersistentVolume

Механизм Persistent Volume Claim (PVC) позволяет динамически выделять и подключать к вашим подам блочные диски с необходимыми характеристиками.

Для того, чтобы динамически создать PV на базе PVC, вам потребуется указать корректный класс хранения (storage class). Чтобы получить полный список классов хранения и типов дисков, доступных для вашего кластера, необходимо выполнить команду:

sh
kubectl get storageclasses

Пример результата выполнения команды:

sh
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 LimitIPOS Shares
mts-ssd-basic20040000200
mts-ssd-fast50040000200
mts-ssd-ultra1000400001000
mts-ssd-ultra-plus50004000030000
  • Reservation - минимально гарантированная производительность канала в операциях ввода-вывода (IOPS). Она выделяется машине безусловно (резервируется для данной машины).

  • Limit - верхний предел в IOPS, которые машина может потреблять.

  • Shares - относительная доля диска по отношению к остальным виртуальным дискам в хранилище. Более высокое значение IOPS Shares позволяет диску поддерживать большее количество одновременных операций ввода-вывода в условиях конкуренции за ресурсы.

Стоимость 1Gb для каждой дисковой политики равна цене аналогичной дисковой политики для диска worker-нод.

Динамическое выделение дисков с PVC

Примечание

Для StatefullSet рекомендуем создавать отдельную Группу нод, чтобы избежать случайного удаления ноды при масштабировании.

Создайте объект PersistentVolumeClaim

Сохраните следующую спецификацию для создания объекта PersistentVolumeClaim в YAML-файл с названием test-pvc.yaml. Подробнее о спецификации для создания объекта PersistentVolumeClaim можно узнать в документации Kubernetes.

При подготовке спецификации задайте необходимый объем дискового пространства.

yaml
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

Выполните команду:

sh
kubectl create -f test-pvc.yaml

Результат выполнения команды:

sh
persistentvolumeclaim/test-pvc created

Внимание

Containerum Kubernetes не поддерживает режим доступа ReadWriteMany. Это обусловлено особенностями реализации гипервизора и стремлением к наибольшей надежности работы хранилища.

Внимание

MTS Cloud не несет ответственности и не гарантирует сохранность данных при использовании PersistentVolume, созданных без PersistentVolumeClaim, например, с типом hostPath или local.

Создайте под с динамически подготовленным томом

Сохраните следующую спецификацию для создания пода в YAML-файл с названием pod.yaml. Подробнее о спецификации для создания пода можно узнать в документации Kubernetes.

yaml
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.

Выполните команду:

sh
kubectl create -f pod.yaml

Результат выполнения команды:

pod/pod created

Убедитесь, что под с примонтированным PersistentVolume успешно создан

Выполните команду:

sh
kubectl describe pods pod

Результат выполнения команды:

sh
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

Рассмотрим пример, в рамках которого:

  1. Запускается контейнер, в котором создается файл /var/log/test.txt, и
  2. Выполняется команда echo "test pv" >> /var/log/test.txt, записывающая строку "test pv" в файл test.txt.

Таким образом, при каждом перезапуске пода файл будет пополняться дополнительной записью.

Требуемые действия:

  1. Сохраните следующую спецификацию для создания пода в YAML-файл с названием task-pv-pod.yaml:

    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
  2. Выполните команду:

    sh
    kubectl apply -f task-pv-pod.yaml

    Результат выполнения команды:

    sh
    deployment.apps/task-pv-pod created
  3. Убедитесь, что под с примонтированным PersistentVolume успешно создан. Выполните команду:

    sh
    kubectl get pods

    Результат выполнения команды:

    sh
    NAME                            READY   STATUS    RESTARTS   AGE
    task-pv-pod-65595866c6-m998s    1/1     Running   0          23s
  4. Выведите в консоль содержимое файла test.txt. Выполните команду:

    sh
    kubectl exec -it task-pv-pod-65595866c6-m998s -- cat /var/log/test.txt

    Результат выполнения команды:

    sh
    test pv
  5. Проверьте сохранность данных при удалении пода. Для этого пересоздайте под и проверьте результат:

    • Выполните команду:

      sh
      kubectl delete pod task-pv-pod-65595866c6-m998s

      Результат выполнения команды:

      sh
      pod "task-pv-pod-65595866c6-m998s" deleted
    • Далее повторите действия из предыдущего шага:

      sh
      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