동적 프로비저닝을 사용하면서 CSI 를 준수하는 벤더의 드라이버가 볼륨 resize 를 지원하는 경우에는 PVC 조정을 통해 볼륨 확장이 가능하다. 아래와 같이 실습을 진행해보자.

 

1. 스토리지 클래스 생성

다음과 같이 allowVolumeExpansion: true 를 지정하여 스토리지 클래스를 생성한다. 스토리지 클래스에 해당 항목을 지정하더라도, 실제 사용하는 볼륨 플러그인 드라이버 구현에서 지원해야 볼륨 확장이 가능한 점에 유의하자.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: sample-block-storageclass-resize
provisioner: local.csi.openebs.io
parameters:
  storage: "lvm"
  volgroup: "lvmvg"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

 

2. PVC 생성

PVC 는 특별한 설정이 필요 없다. Static NFS 는 이미 존재하는 디렉토리를 스토리지로 사용하고, k8s 가 용량을 제어하지 않기 때문에 확장이 불가능하여 Block 스토리지로 사용하였다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sample-block-pvc-resize
spec:
  storageClassName: sample-block-storageclass-resize
  volumeMode: Block
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 500Mi

 

3. Pod 생성

위 PVC 를 사용하는 파드를 생성하여 동적 프로비저닝이 일어나도록 한다. 블록 장치 연결 위치는 /dev/sample-block 이다.

apiVersion: v1
kind: Pod
metadata:
  name: sample-block-pod-resize
spec:
  containers:
    - name: nginx-container
      image: nginx:1.27
      volumeDevices:
        - name: nginx-pvc
          devicePath: /dev/sample-block
  volumes:
    - name: nginx-pvc
      persistentVolumeClaim:
        claimName: sample-block-pvc-resize

 

4. 볼륨 크기 확인

동적 프로비저닝이 정상적으로 수행되었는지, 생성된 영구 볼륨의 크기는 몇인지, 실제 파드 연결된 볼륨의 크기는 몇인지 확인해본다.

$ kubectl get pvc sample-block-pvc-resize
NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                       VOLUMEATTRIBUTESCLASS   AGE
sample-block-pvc-resize   Bound    pvc-2d5bf77e-956e-4e38-9517-bb8f4da44ca4   500Mi      RWO            sample-block-storageclass-resize   <unset>                 115s

# PV 용량 확인
$ kubectl get pv pvc-2d5bf77e-956e-4e38-9517-bb8f4da44ca4
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                             STORAGECLASS                       VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-2d5bf77e-956e-4e38-9517-bb8f4da44ca4   500Mi      RWO            Delete           Bound    default/sample-block-pvc-resize   sample-block-storageclass-resize   <unset>                          9s

# 파드에 연결된 볼륨 용량 확인
$ kubectl exec -it sample-block-pod-resize -- blockdev --getsize64 /dev/sample-block
524288000

 

5. 볼륨 크기 확장

이제 아래처럼 PVC 매니페스트의 spec.resources.requests.storage 를 이전보다 더 크게 수정/적용한 후 볼륨 사이즈를 확인해본다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sample-block-pvc-resize
spec:
  storageClassName: sample-block-storageclass-resize
  volumeMode: Block
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 800Mi # 여기를 수정한 후, 다시 kubectl apply 한다.

apply 후 실제 적용은 최대 1분까지 소요된다.

$ kubectl apply -f sample-block-pvc-resize.yaml
persistentvolumeclaim/sample-block-pvc-resize configured

$ kubectl get pvc sample-block-pvc-resize
NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS                       VOLUMEATTRIBUTESCLASS   AGE
sample-block-pvc-resize   Bound    pvc-2d5bf77e-956e-4e38-9517-bb8f4da44ca4   800Mi      RWO            sample-block-storageclass-resize   <unset>                 13m

$ kubectl get pv pvc-2d5bf77e-956e-4e38-9517-bb8f4da44ca4
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                             STORAGECLASS                       VOLUMEATTRIBUTESCLASS   REASON   AGE
pvc-2d5bf77e-956e-4e38-9517-bb8f4da44ca4   800Mi      RWO            Delete           Bound    default/sample-block-pvc-resize   sample-block-storageclass-resize   <unset>                          11m

$ kubectl exec -it sample-block-pod-resize -- blockdev --getsize64 /dev/sample-block
838860800

같은 디스크에서 용량만 800Mi 로 증가된 것을 확인할 수 있다.

 

단, 아래처럼 볼륨 사이즈 축소는 불가한 점에 유의하자.

# PVC 의 spec.resources.requests.storage 를 축소한 후 적용시
$ kubectl apply -f sample-block-pvc-resize.yaml
The PersistentVolumeClaim "sample-block-pvc-resize" is invalid: spec.resources.requests.storage: Forbidden: field can not be less than previous value

 

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,