Добавить персистентный диск
Персистентный диск (PersistentVolume) используется в качестве хранилища в кластере.
В Managed Kubernetes используются сетевые диски Облачной платформы Selectel. Все созданные персистентные диски отображаются в панели управления в разделе Облачная платформа → Диски.
Персистентный диск создается через PersistentVolumeClaim — запрос на создание диска. Диск нужно создавать в пуле, в котором находится кластер.
Работа с дисками возможна только в режиме ReadWriteOnce — один диск может быть примонтирован только к одной ноде, при этом на ноде может быть заупщено несколько подов. Для работы с режимом ReadWriteMany (монтирование диска к нескольким нодам) вы можете подключить к нодам кластера Файловое хранилище Selectel.
Создание диска через механизм 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