Перейти к основному содержимому
Постоянные тома

Постоянные тома

Постоянный том (Persistent Volume) используется для длительного хранения данных в кластере Managed Kubernetes. Для управления постоянными томами в Kubernetes используются объекты PersistentVolume (PV), PersistentVolumeClaim (PVC) и StorageClass.

Для постоянных томов в Managed Kubernetes рекомендуем использовать сетевые диски облачной платформы Vscale. Ты можешь создать постоянный том на локальном диске, но при удалении ноды данные будут удалены.

После создания постоянного тома ты можешь его увеличить и удалить.

Все постоянные тома отображаются в панели управления в разделе ОблакоДиски.

Создать постоянный том

к сведению

Создание через механизм Topology-Aware Volume Provisioning недоступно.

  1. Создай StorageClass или используй существующий StorageClass.
  2. Создай PersistentVolumeClaim.
  3. Создай под с постоянным томом.

1. Создать StorageClass

Для создания PersistentVolume используется объект StorageClass. StorageClass позволяет заранее описать конфигурацию постоянных томов, которые понадобятся в работе кластера.

При создании кластера будет автоматически создан один StorageClass с быстрым (fast) сетевым диском в том пуле, в котором расположена группа нод кластера.

к сведению

На данный момент создание кластеров возможно только в пуле ru-9a.

  1. Создай yaml-файл с манифестом для объекта StorageClass.

    Пример манифеста StorageClass для быстрого диска в пуле ru-9a:

    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
    name: fast.ru-9a
    provisioner: cinder.csi.openstack.org
    parameters:
    type: fast.ru-9a
    availability: ru-9a
    fsType: ext4
    allowVolumeExpansion: true

    Здесь fast.ru-9a — тип StorageClass.

    Ты можешь использовать другие готовые манифесты StorageClass.

  2. Примени манифест:

    kubectl apply -f <storage-class.yaml>

    Укажи <storage-class.yaml> — имя yaml-файла с манифестом для создания нового StorageClass.

  3. Убедись, что создан объект StorageClass:

    kubectl get sc

    В ответе появится список созданных объектов StorageClass:

    NAME         PROVISIONER                RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
    fast.ru-9a cinder.csi.openstack.org Delete Immediate true 16m

Тип StorageClass

Формат типа StorageClass  — <тип диска>.<сегмент пула, в котором он расположен>.

Типы дисков соответствуют сетевым дискам облачной платформы Vscale:

Тип сетевого дискаНазвание в StorageClass
Быстрый SSDfast
Базовый HDDbasic
Универсальный SSDuniversal

Например, для создания быстрого диска в сегменте пула ru-9a в описании StorageClass необходимо добавить:

parameters:
type: fast.ru-9a
availability: ru-9a

2. Создать PersistentVolumeClaim

к сведению

Работа с томами возможна только в режиме ReadWriteOnce — один том может быть примонтирован только к одной ноде, при этом к постоянному тому может быть подключен только один под. При подключении нескольких подов к одному PV данные могут быть повреждены.

  1. Создай yaml-файл с манифестом для объекта PersistentVolumeClaim (PVC).

    Пример манифеста:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: my-pv-claim
    spec:
    storageClassName: fast.ru-9a
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: 10Gi

    Пул в манифесте PVC должен совпадать с пулом ноды, к которой планируется подключить этот PVC. Если ты используешь несколько пулов для нод кластера и PVC, укажите в описании объектов Pod их привязку к пулу.

  2. Примени манифест:

    kubectl apply -f <pvc.yaml>

    Укажи <pvc.yaml> — имя yaml-файла с манифестом для создания нового PersistentVolumeClaim.

3. Создать под с постоянным томом

Если ты создаешь под (Pod) с постоянным томом, то том сохраняется при удалении пода.

  1. Создай yaml-файл с манифестом для создания нового пода с постоянным томом.

    Пример манифеста:

    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx
    labels:
    app: webservice
    spec:
    containers:
    - name: nginx
    image: library/nginx:1.17-alpine
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: "/var/www/html"
    name: data
    volumes:
    - name: data
    persistentVolumeClaim:
    claimName: my-pv-claim

    При создании пода с параметром securityContext.fsGroup постоянный том не будет смонтирован с соответствующим GID. Чтобы решить эту проблему, в параметрах StorageClass добавь fsType: ext4.

  2. Примени манифест:

    kubectl apply -f <pod-with-pv.yaml>

    Укажи <pod-with-pv.yaml> — имя yaml-файла с манифестом для создания нового пода с постоянным томом.

  3. Проверь, что PersistentVolume создан:

    kubectl get pv

    В ответе появится список PersistentVolumes:

    NAME CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
    pvc-f171f94c-0d38-41be-947e-2f5d7e46a6c3 10Gi RWO Delete Bound default/my-pv-claim fast.ru-9a 97s

Увеличить постоянный том

  1. Проверь объем занятого пространства в PersistentVolumeClaim.
  2. Убедись, что квот достаточно для увеличения PersistentVolume.
  3. Разреши увеличение тома в настройках StorageClass.
  4. Удалить поды с томом, размер которого нужно увеличить.
  5. Измени манифест PersistentVolumeClaim

1. Проверить объем занятого пространства в PVC

Узнай объем занятого пространства в PVC:

kubectl -n <namespace> exec <pod_name> -- df -ah

Укажи:

  • <namespace> — пространство имен, где расположен PVC;
  • <pod_name> — имя пода, который использует PVC.

2. Проверить квоты

Чтобы определить, что для увеличения постоянного тома достаточно ресурсов, проверь квоты и при необходимости сообщи в техническую поддержку, чтобы увеличить их.

3. Разрешить увеличение постоянного тома

В параметрах объекта StorageClass укажи allowVolumeExpansion: true.

Пример манифеста:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: example-vol-default
provisioner: vendor-name.example/magicstorage
parameters:
resturl: "http://192.168.10.100:8080"
restuser: ""
secretNamespace: ""
secretName: ""
allowVolumeExpansion: true
reclaimPolicy: Delete

4. Удалить поды с томом, размер которого нужно увеличить

  1. Проверь, какие поды используют PVC:

    kubectl describe pvc <pvc_name>

    Укажи <pvc_name> — имя PersistentVolumeClaim.

  2. Удали поды, которые используют PVC:

    kubectl delete pod <pod_name>

    Укажи <pod_name> — имя пода.

5. Изменить манифест PersistentVolumeClaim

  1. Открой yaml-файл с манифестом для PersistentVolumeClaim и измените параметр storage:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: my-pv-claim
    spec:
    storageClassName: fast.ru-9a
    accessModes:
    - ReadWriteOnce
    resources:
    requests:
    storage: 10Gi
  2. Создай PersistentVolumeClaim — примените манифест:

    kubectl apply -f <pvc_name>

    Укажи <pvc_name> — имя PersistentVolumeClaim.

  3. Запусти под с использованием этого PVC.

    Пример манифеста:

    apiVersion: v1
    kind: Pod
    metadata:
    name: nginx
    labels:
    app: webservice
    spec:
    containers:
    - name: nginx
    image: library/nginx:1.17-alpine
    ports:
    - containerPort: 80
    volumeMounts:
    - mountPath: "/var/www/html"
    name: data
    volumes:
    - name: data
    persistentVolumeClaim:
    claimName: my-pv-claim
  4. Проверь, что PersistentVolumeClaim создан:

    kubectl get pvc

Удалить постоянный том

Если тебе больше не нужен постоянный том, удали PersistentVolumeClaim, который использовался для создания этого тома.

PV будет сразу удален, если в манифесте PVC указан параметр persistentVolumeReclaimPolicy: Delete. Подробнее о политике возврата (Reclaim policy) в статье Reclaiming документации Kubernetes.

  1. Проверь, какие поды привязаны к PVC:

    kubectl describe pvc <pvc_name>

    Укажи <pvc_name> — имя PersistentVolumeClaim.

  2. Удали поды, которые используют PVC:

    kubectl delete pod <pod_name>

    Укажи <pod_name> — имя пода.

  3. Удали PVC, к которому привязан PV:

    kubectl delete pvc <pvc_name>

    Укажи <pvc_name> — имя PersistentVolumeClaim.

  4. Проверь, что PersistentVolumeClaim удален:

    kubectl get pvc