Постоянные тома
Подключение постоянных томов (PV) на базе сетевых дисков облачной платформы недоступно в кластерах Managed Kubernetes на выделенных серверах.
Постоянный том (Persistent Volume) используется для длительного хранения данных в кластере Managed Kubernetes. Для управления постоянными томами в Kubernetes используются объекты PersistentVolume (PV), PersistentVolumeClaim (PVC) и StorageClass.
Для постоянных томов в Managed Kubernetes рекомендуем использовать сетевые диски облачной платформы Selectel. Вы можете создать постоянный том на локальном диске, но при удалении ноды данные будут удалены.
После создания постоянного тома вы можете его увеличить и удалить.
Все постоянные тома отображаются в панели управления в разделе Облачная платформа → Диски.
Создать постоянный том
Создание через механизм Topology-Aware Volume Provisioning недоступно.
- Создайте StorageClass или используйте существующий StorageClass.
- Создайте PersistentVolumeClaim.
- Создайте под с постоянным томом.
1. Создать StorageClass
Для создания PersistentVolume используется объект StorageClass. StorageClass позволяет заранее описать конфигурацию постоянных томов, которые понадобятся в работе кластера.
При создании кластера будет автоматически создан один StorageClass с быстрым (fast) сетевым д иском в том пуле, в котором расположена группа нод кластера.
-
Создайте 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.
-
Примените манифест:
kubectl apply -f <storage-class.yaml>
Укажите
<storage-class.yaml>
— имя yaml-файла с манифестом для создания нового StorageClass. -
Убедитесь, что создан объект 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:
Например, для создания быстрого диска в сегменте пула ru-1a в описании StorageClass необходимо добавить:
parameters:
type: fast.ru-1a
availability: ru-1a
2. Создать PersistentVolumeClaim
Работа с томами возможна только в режиме ReadWriteOnce — один том может быть примонтирован только к одной ноде, при этом к постоянному тому может быть подключен только один под. При подключении нескольких подов к одному PV данные могут быть повреждены. Для работы с режимом ReadWriteMany (монтирование тома к нескольким нодам) вы можете подключить к нодам кластера файловое хранилище.
-
Создайте 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 их привязку к пулу.
-
Примените манифест:
kubectl apply -f <pvc.yaml>
Укажите
<pvc.yaml>
— имя yaml-файла с манифестом для создания нового PersistentVolumeClaim.
3. Создать под с постоянным томом
Если вы создаете под (Pod) с постоянным томом, то том сохраняется при удалении пода.
-
Создайте 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
. -
Примените манифест:
kubectl apply -f <pod-with-pv.yaml>
Укажите
<pod-with-pv.yaml>
— имя yaml-файла с манифестом для создания нового пода с постоянным томом. -
Проверьте, что 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
Увеличить постоянный том
- Проверьте объем занятого пространства в PersistentVolumeClaim.
- Убедитесь, что квот достаточно для увеличения PersistentVolume.
- Разрешите увеличение тома в настройках StorageClass.
- Удалить поды с томом, размер которого нужно увеличить.
- Измените манифест 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. Удалить поды с томом, размер которого нужно увеличить
-
Проверьте, какие поды используют PVC:
kubectl describe pvc <pvc_name>
Укажите
<pvc_name>
— имя PersistentVolumeClaim. -
Удалите поды, которые используют PVC:
kubectl delete pod <pod_name>
Укажите
<pod_name>
— имя пода.
5. Изменить манифест PersistentVolumeClaim
-
Откройте yaml-файл с манифестом для PersistentVolumeClaim и измените параметр
storage
:apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: my-pv-claim
spec:
storageClassName: fast.ru-1a
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi -
Создайте PersistentVolumeClaim — примените манифест:
kubectl apply -f <pvc_name>
Укажите
<pvc_name>
— имя PersistentVolumeClaim. -
Запустите под с использованием этого 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 -
Проверьте, что PersistentVolumeClaim создан:
kubectl get pvc
Удалить постоянный том
Если вам больше не нужен постоянный том, удалите PersistentVolumeClaim, который использовался для создания этого тома.
PV будет сразу удален, если в манифесте PVC указан параметр persistentVolumeReclaimPolicy: Delete
. Подробнее о политике возврата (Reclaim policy) в статье Reclaiming документации Kubernetes.
-
Проверьте, какие поды привязаны к PVC:
kubectl describe pvc <pvc_name>
Укажите
<pvc_name>
— имя PersistentVolumeClaim. -
Удалите поды, которые используют PVC:
kubectl delete pod <pod_name>
Укажите
<pod_name>
— имя пода. -
Удалите PVC, к которому привязан PV:
kubectl delete pvc <pvc_name>
Укажите
<pvc_name>
— имя PersistentVolumeClaim.