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

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

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

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

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

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

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

к сведению

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

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

1. Создать StorageClass

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

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

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

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

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

    Здесь fast.ru-1a — тип 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-1a cinder.csi.openstack.org Delete Immediate true 16m

Тип StorageClass

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

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

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

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

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

2. Создать PersistentVolumeClaim

к сведению

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

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

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

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
    name: my-pv-claim
    spec:
    storageClassName: fast.ru-1a
    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-1a 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-1a
    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.