Kubernetes
June 5, 2023

Ресайз PV в Kubernetes

В данной статье рассмотрим процесс ресайза диска, примонтированного в качестве PV к поду.

Подготовка.

У StorageClass в YC возможность изменять размер примонтированного диска есть по дефолту. За это отвечает параметр ALLOWVOLUMEEXPANSION.

kubectl get sc
NAME                           PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
yc-network-hdd (default)       disk-csi-driver.mks.ycloud.io   Delete          WaitForFirstConsumer   true                   32d
yc-network-nvme                disk-csi-driver.mks.ycloud.io   Delete          WaitForFirstConsumer   true                   32d
yc-network-ssd (default)       disk-csi-driver.mks.ycloud.io   Delete          WaitForFirstConsumer   true                   32d
yc-network-ssd-nonreplicated   disk-csi-driver.mks.ycloud.io   Delete          WaitForFirstConsumer   true                   32d

Но если, внезапно, используется другой sc, не поддерживающий изменение размера, то необходимо будет эту опцию включить.

kubectl get sc
NAME                           PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
cam-hdd-retain                 disk-csi-driver.mks.ycloud.io   Retain          WaitForFirstConsumer   false                  31d

Правим с помощью kubectl edit sc cam-hdd-retain
Добавляем в спецификацию allowVolumeExpansion: true Будет примерно так:

parameters:
  csi.storage.k8s.io/fstype: ext4
  type: network-hdd
provisioner: disk-csi-driver.mks.ycloud.io
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: WaitForFirstConsumer
#Результат применения allowVolumeExpansion
kubectl get sc
NAME                           PROVISIONER                     RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
cam-hdd-retain                 disk-csi-driver.mks.ycloud.io   Retain          WaitForFirstConsumer   true                   31d

Поехали!

cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-nginx2
  namespace: default
  labels:
    pvc: nginx
  annotations:
    author: cameda
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 6Gi
EOF
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
  name: cameda-nginx
  namespace: default
  labels:
    app: nginx
    env: prod
  annotations:
    author: cameda
spec:
  containers:
  - name: cameda-nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
    resources:
      requests:
        cpu: 300m
        memory: 300Mi
      limits:
        memory: 500Mi
    ports:
    - containerPort: 80
    - containerPort: 443
    livenessProbe:
      failureThreshold: 10
      successThreshold: 1
      httpGet:
        path: /
        port: 80
      periodSeconds: 10
      timeoutSeconds: 1
      initialDelaySeconds: 5
    readinessProbe:
      failureThreshold: 3
      successThreshold: 1
      exec:
        command:
        - curl
        - http://127.0.0.1:80
      periodSeconds: 10
      timeoutSeconds: 1
      initialDelaySeconds: 7
    volumeMounts:
    - name: cam-volume
      mountPath: /mnt/cameda
  restartPolicy: OnFailure
  volumes:
  - name: cam-volume
    persistentVolumeClaim:
      claimName: pvc-nginx2
  securityContext:
    fsGroup: 1000
    runAsUser: 0
EOF

Убиваем под и делаем ресайз PVC.

kubectl delete po cameda-nginx
kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
pvc-nginx2   Bound    pvc-5326d1ee-552a-4aa9-a2fd-b99ad6ccb19f   6Gi        RWO            yc-network-hdd   17m
kubectl edit pvc pvc-nginx2
# Изменения вносятся в поле spec.resources.requests.storage.
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 12Gi
  storageClassName: yc-network-hdd
  volumeMode: Filesystem
  volumeName: pvc-5326d1ee-552a-4aa9-a2fd-b99ad6ccb19f

kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS     REASON   AGE
pvc-5326d1ee-552a-4aa9-a2fd-b99ad6ccb19f   12Gi       RWO            Delete           Bound    default/pvc-nginx2   yc-network-hdd            14m

Создаём под по новой и проверяем его размер.

kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS     AGE
pvc-nginx2   Bound    pvc-5326d1ee-552a-4aa9-a2fd-b99ad6ccb19f   12Gi       RWO            yc-network-hdd   32m