TheKoguryo's 기술 블로그

 Version 2024.05.05

Support for PVC block volume expansion

OKE에서 Block Volume을 Persistent Volume으로 사용하는 경우, 할당 받은 이후에도 사용 중인 볼륨의 크리를 확장하는 기능을 지원합니다.

Block Volume Expansion 설정 확인

클러스터 생성후 기본 구성된StorageClass를 업데이트 전후로 확인한 내용입니다.

  • 기능 업데이트 전

    oke_admin@cloudshell:~ (ap-seoul-1)$ kubectl get storageclass
    NAME            PROVISIONER                       RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    oci (default)   oracle.com/oci                    Delete          Immediate              false                  2d
    oci-bv          blockvolume.csi.oraclecloud.com   Delete          WaitForFirstConsumer   false                  2d
    
  • 업데이트 후

    ALLOWVOLUMEEXPANSION 항목이 기존 false -> true로 변경되었습니다.

    winter@cloudshell:~ (ap-chuncheon-1)$ kubectl get sc
    NAME            PROVISIONER                       RECLAIMPOLICY   VOLUMEBINDINGMODE      ALLOWVOLUMEEXPANSION   AGE
    oci (default)   oracle.com/oci                    Delete          Immediate              false                  22h
    oci-bv          blockvolume.csi.oraclecloud.com   Delete          WaitForFirstConsumer   true                   22h
    
  • 기본 구성된 oci-bv StorageClass를 사용하면 기본적으로 볼륨 사이즈 확장이 됩니다. 새롭게 Block Volume CSI Driver(provisioner: blockvolume.csi.oraclecloud.com)로 StorageClass를 생성한다고 하면 아래와 같이 allowVolumeExpansion: true 를 추가하면 됩니다.

    $ kubectl get sc oci-bv -o yaml
    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      name: oci-bv
    provisioner: blockvolume.csi.oraclecloud.com
    reclaimPolicy: Delete
    volumeBindingMode: WaitForFirstConsumer
    allowVolumeExpansion: true
    

Block Volume Expansion 기능 확인

  1. 아래와 같이 PV 요청 yaml을 사용하여 50Gi 사이즈로 요청합니다.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: csi-bvs-pvc
    spec:
      storageClassName: "oci-bv"
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 50Gi
    
  2. 테스트 앱 배포

    • 요청한 Persistent Volume을 컨테이너 상에 마운트한 테스트 앱
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      labels:
        app: nginx-bvs-pvc
      name: nginx-bvs-pvc
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx-bvs-pvc
      template:
        metadata:
          labels:
            app: nginx-bvs-pvc
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            volumeMounts:
            - name: data
              mountPath: /usr/share/nginx/html
          volumes:
          - name: data
            persistentVolumeClaim:
              claimName: csi-bvs-pvc
    
  3. 생성 결과

    • 아래와 같이 정상적으로 PV가 생성되고, 테스트 앱로 구동된 것을 볼 수 있습니다.
    winter@cloudshell:~ (ap-chuncheon-1)$ kubectl apply -f csi-bvs-pvc.yaml 
    persistentvolumeclaim/csi-bvs-pvc created
    winter@cloudshell:~ (ap-chuncheon-1)$ kubectl apply -f nginx-deployment-bvs-pvc.yaml 
    deployment.apps/nginx-bvs-pvc created
    winter@cloudshell:~ (ap-chuncheon-1)$ kubectl get pv
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
    csi-f0f36095-34fa-4d57-8868-a2a102a044c7   50Gi       RWO            Delete           Bound    default/csi-bvs-pvc   oci-bv                  15s
    winter@cloudshell:~ (ap-chuncheon-1)$ kubectl get pod
    NAME                             READY   STATUS    RESTARTS   AGE
    nginx-bvs-pvc-7b574c9c5c-lst4d   1/1     Running   0          72s
    
  4. PV를 사용하는 앱이 배포된 상태에서 볼륨 크기를 늘립니다. 50Gi -> 100Gi로 변경후 적용합니다.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: csi-bvs-pvc
    spec:
      storageClassName: "oci-bv"
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 100Gi
    
  5. 적용

    winter@cloudshell:~ (ap-chuncheon-1)$ kubectl apply -f csi-bvs-pvc.yaml 
    persistentvolumeclaim/csi-bvs-pvc configured
    winter@cloudshell:~ (ap-chuncheon-1)$ kubectl get pv
    NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                 STORAGECLASS   REASON   AGE
    csi-f0f36095-34fa-4d57-8868-a2a102a044c7   100Gi      RWO            Delete           Bound    default/csi-bvs-pvc   oci-bv                  4m23s
    
  6. 볼륨 확장 결과확인

    • 이벤트를 확인해 보면, 볼륨 확장이 성공했음을 알 수 있습니다. 컨테이너 재기동도 일어나지 않았습니다.
    winter@cloudshell:~ (ap-chuncheon-1)$ kubectl get events
    ...
    6m50s       Normal    Created                      pod/nginx-bvs-pvc-7b574c9c5c-lst4d    Created container nginx
    6m50s       Normal    Started                      pod/nginx-bvs-pvc-7b574c9c5c-lst4d    Started container nginx
    3m53s       Normal    Resizing                     persistentvolumeclaim/csi-bvs-pvc     External resizer is resizing volume csi-f0f36095-34fa-4d57-8868-a2a102a044c7
    3m53s       Warning   ExternalExpanding            persistentvolumeclaim/csi-bvs-pvc     Ignoring the PVC: didn't find a plugin capable of expanding the volume; waiting for an external controller to process this PVC.
    3m52s       Normal    FileSystemResizeRequired     persistentvolumeclaim/csi-bvs-pvc     Require file system resize of volume on node
    3m14s       Normal    FileSystemResizeSuccessful   persistentvolumeclaim/csi-bvs-pvc     MountVolume.NodeExpandVolume succeeded for volume "csi-f0f36095-34fa-4d57-8868-a2a102a044c7"
    3m14s       Normal    FileSystemResizeSuccessful   pod/nginx-bvs-pvc-7b574c9c5c-lst4d    MountVolume.NodeExpandVolume succeeded for volume "csi-f0f36095-34fa-4d57-8868-a2a102a044c7"
    winter@cloudshell:~ (ap-chuncheon-1)$ kubectl get pod
    NAME                             READY   STATUS    RESTARTS   AGE
    nginx-bvs-pvc-7b574c9c5c-lst4d   1/1     Running   0          4m42s
    
    • 컨테이너 내부 확인

      컨테이너 내부를 확인해 보면 PV가 마운트된 /usr/share/nginx/html의 사이즈가 99G인 것을 알 수 있습니다. 볼륨이 확장된 것을 알 수 있습니다.

    winter@cloudshell:~ (ap-chuncheon-1)$ kubectl exec -it nginx-bvs-pvc-7b574c9c5c-lst4d -- /bin/bash
    root@nginx-bvs-pvc-7b574c9c5c-lst4d:/# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    overlay          39G  6.8G   32G  18% /
    tmpfs            64M     0   64M   0% /dev
    tmpfs           7.7G     0  7.7G   0% /sys/fs/cgroup
    shm              64M     0   64M   0% /dev/shm
    tmpfs           7.7G   28M  7.7G   1% /etc/hostname
    /dev/sda3        39G  6.8G   32G  18% /etc/hosts
    /dev/sdb         99G   60M   94G   1% /usr/share/nginx/html
    tmpfs           7.7G   12K  7.7G   1% /run/secrets/kubernetes.io/serviceaccount
    tmpfs           7.7G     0  7.7G   0% /proc/acpi
    tmpfs           7.7G     0  7.7G   0% /proc/scsi
    tmpfs           7.7G     0  7.7G   0% /sys/firmware
    


이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.