База знаний
Подключиться Консультация
Получить консультацию Подключиться
Облачные сервисы
Виртуальный рабочий стол
Передовые сервисы по предоставлению сотрудникам безопасного удалённого доступа к мощным виртуальным десктопам и корпоративным ресурсам клиента с любого устройства, из любой точки мира.
Корпоративные сервисы
Удобные сервисы для обмена документами или файлами между сотрудниками компании в том числе за пределами организации, а также настройка ИТ‑инфраструктуры «под ключ» для Вашего бизнеса от экспертов облака МТС. Благодаря этим сервисам сотрудники экономят рабочее время на выполнение ежедневным рутинных задач, тем самым повышается их эффективность.
Сетевые сервисы
Мы обеспечиваем комплекс решений по построению и оптимизации сетевой инфраструктуры. Это позволит вам быстро и эффективно реализовать необходимую связность между различными сервисами с определенными параметрами качества.
Хранение и резервирование данных
Надежно и стабильно с МТС Cloud. Мы обеспечиваем хранение любых видов и объемов данных. Это позволит вам быстро и эффективно работать с данными и приложениями.
Аренда оборудования
Сервисы собственной разработки, которые помогут повысить эффективность работы ИТ‑подразделений.
Проектные решения
Партнерские сервисы
Стать партнером
Поддержка
База Знаний #CloudMTS
База знаний #CloudMTS / Containerum Kubernetes / Работа с PersistentVolume

Работа с 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
IOPS Shares

mts-ssd-basic 

200 40 000 200

mts-ssd-fast

500 40 000 200

mts-ssd-ultra

1000 40 000 1000
mts-ssd-ultra-plus 5000 40 000 3000

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

Описания и инструкции, размещаемые на данном ресурсе, носят исключительно информационный характер и не могут рассматриваться в качестве гарантий, заверений, рекомендаций или документа, порождающего какие-либо обязательства МТС. Конкретные условия использования сервисов определяются договорами с клиентом. МТС не несет ответственности за содержание публикуемых инструкций и результаты их применения клиентом. Актуальность отдельных положений публикуемых описаний и инструкций необходимо уточнять у аккаунт-менеджера или службы технической поддержки hub-support@cloud.mts.ru