Персистентные диски

Персистентный диск (PersistentVolume) используется в качестве хранилища в кластере.

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

Персистентный диск нужно создавать в той же зоне, что и кластер, через PersistentVolumeClaim (запрос на создание диска).

Работа с дисками возможна только в режиме ReadWriteOnce.

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

Создание персистентного диска

Манифест для создания StorageClass

Для создания PersistentVolume используется объект StorageClass. StorageClass позволяет заранее описать конфигурацию персистентных дисков, которые понадобятся в работе кластера. В объекте Storage Class необходимо указать тип и зону диска. Например, для создания быстрых дисков в зоне ru-1a в описании StorageClass в разделе parameters необходимо добавить поля:

type: fast.ru-1a
availablity: ru-1a

Типы дисков fast, basic, universal соответствуют сетевым дискам в Облачной платформе Selectel.

При создании кластера в панели управления будет автоматически создан один StorageClass с быстрым сетевым диском в зоне, соответствующей зоне группы нод кластера. При создании кластера через Terraform или API StorageClass не создается автоматически.

Для того чтобы посмотреть, какие StorageClass были созданы (для OpenStack cinder), используйте команду:

$ kubectl get sc
NAME         PROVISIONER                AGE
fast.ru-3a   cinder.csi.openstack.org   2d19h

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

# fast.ru-1a.yaml
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
allowVolumeExpansion: true

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

Манифест для создания PersistentVolumeClaim

Создайте манифест PersistentVolumeClaim, использующий StorageClass:

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

Обратите внимание! Зона в манифесте PVC должна совпадать с зоной ноды, к которой она должна быть подключена. В случае использования нескольких зон для нод кластера и PVC вам потребуется указать в описании объектов Pod их привязку к зоне.

Манифест для создания Pod

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

Манифест для создания пода с персистентным диском:

# nginx-with-volume.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

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

Создание PVC и Pod

Для создания запроса и пода используйте:

kubectl create -f my-pv-claim.yaml
kubectl create -f nginx-with-volume.yaml

Проверьте, что диск подключен:

$ kubectl get pv
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-3a              97s