1.2.3.1 Block Volume 사용하기
컨테이너의 내부 스토리지는 기본적으로 컨테이너가 삭제, 종료되면 사라집니다. 데이터가 사라지는 것을 막고 보존이 필요한 데이터를 저장하기 위해 별도의 Persistent Volume을 사용합니다. Block Volume을 Persistent Volume으로 사용되는 방법을 알아봅니다.
기본 설치된 Persistent Volume을 위한 StorageClass 확인
OKE는 OCI IaaS를 기반으로 제공되는 서비스로 OCI Block Volume 서비스를 이용하여 Persistent Volume을 제공합니다. 현 버전 기준으로 FlexVolume 볼륨 플러그인과 CSI(Container Storage Interface) 볼륨 플러그인의 두 가지를 사용하고 있습니다.
-
기본 StorageClass 확인
- oci: OCI Block Volume 서비스를 위한 FlexVolume 플러그인 사용
- oci-bv: OCI Block Volume 서비스를 위한 CSI 볼륨 플러그인 사용, OKE 디폴트 StorageClass
$ kubectl get storageclass NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE oci oracle.com/oci Delete Immediate false 158m oci-bv (default) blockvolume.csi.oraclecloud.com Delete WaitForFirstConsumer true 158m
-
CSI 볼륨 플러그인
- FlexVolume 플러그인 방식이 Kubernetes 1.2 버전때 부터 사용되어 더 오래되었지만, 업스트림 Kubernetes에서 이제는 CSI 볼륨 플러그인 방식을 사용하는 흐름입니다.
- OKE에서도 Release Note 2020년 8월 1일, Support for the Container Storage Interface (CSI) volume plug-in 에 나와 있는 것처럼 OKE에서도 신규 기능은 CSI 볼륨 플러그인에만 추가할 예정이며, FlexVolume 플러그인은 유지 보수만 할 계획입니다. 그래서 이하 설명에서는 CSI 볼륨 플러그인을 사용하는 oci-bv storageclass를 사용하겠습니다.
- FlexVolume 플러그인을 사용하는 oci storageclass에 대한 사항은 공식 문서를 참조바랍니다.
OCI Block Volume용 CSI 볼륨 플러그인을 사용하여 Persistent Volume 만들어 사용하기
-
아래와 같이 PV 요청 yaml을 사용하여 요청합니다.
# csi-bvs-pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: csi-bvs-pvc spec: storageClassName: "oci-bv" accessModes: - ReadWriteOnce resources: requests: storage: 50Gi # Block Volume 최소 사이즈
-
테스트 앱 배포
- 요청한 Persistent Volume을 컨테이너 상에 마운트한 테스트 앱
# nginx-deployment-bvs-pvc.yaml 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
-
생성 결과
- 아래와 같이 정상적으로 PV 요청에 따라 PV가 생성되고, 테스트 앱로 구동된 것을 볼 수 있습니다.
$ kubectl apply -f csi-bvs-pvc.yaml persistentvolumeclaim/csi-bvs-pvc created $ kubectl apply -f nginx-deployment-bvs-pvc.yaml deployment.apps/nginx-bvs-pvc created $ kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE csi-d4b81253-13ee-45e1-98f9-8b84b7970439 50Gi RWO Delete Bound default/csi-bvs-pvc oci-bv 45s $ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-bvs-pvc-5fd5849fd4-tvsx9 1/1 Running 0 75s
-
Block Volume
OCI 서비스 콘솔에서 Storage > Block Volumes 화면에서 보면 아래와 같이 PV용 Block Volume 만들어 졌으며, 구동된 Pod가 있는 Worker Node에 부착된 걸 알 수 있습니다.
-
테스트
-
아래와 같이 컨테이너 내부로 들어가 마운트 된 Persistent Volume내에 파일을 씁니다.
$ kubectl exec -it nginx-bvs-pvc-5fd5849fd4-tvsx9 -- bash root@nginx-bvs-pvc-5fd5849fd4-tvsx9:/# echo "Hello PV" >> /usr/share/nginx/html/hello_world.txt root@nginx-bvs-pvc-5fd5849fd4-tvsx9:/# cat /usr/share/nginx/html/hello_world.txt Hello PV root@nginx-bvs-pvc-5fd5849fd4-tvsx9:/# exit
-
POD 삭제 후 재생성
- Persistent Volume이 유지되는 것을 확인하기 위해 기존 POD를 삭제하고 재생성되도록 합니다.
- 재생성되는 위치가 이전과 같은 Worker Node에 만들어 질 수도 있고, 그렇지 않을 수도 있습니다. Block Volume은 RWO 모드만 지원하여, 여러 Node에서 동시에 쓰기를 할 수 없습니다. 다른 Node에생성되는 경우, Multi-Attach error가 일시적으로 발생합니다. 기존 POD가 삭제되었다는 것을 인지하는 데 시간이 걸리며, POD가 생성후 Running 상태가 되기 까지 약간 시간이 걸립니다.
$ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-bvs-pvc-5fd5849fd4-tvsx9 1/1 Running 0 6m41s $ kubectl delete pod nginx-bvs-pvc-5fd5849fd4-tvsx9 pod "nginx-bvs-pvc-5fd5849fd4-tvsx9" deleted $ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-bvs-pvc-5fd5849fd4-jst2z 0/1 ContainerCreating 0 1s $ kubectl get pod NAME READY STATUS RESTARTS AGE nginx-bvs-pvc-5fd5849fd4-jst2z 1/1 Running 0 6s
-
신규 POD에서 Persistent Volume 확인
앞서 변경한 파일을 신규 POD에서 다시 조회해 보면 기존 내용이 남아 있는 걸 확인할 수 있습니다.
kildong@cloudshell:~ (ap-chuncheon-1)$ kubectl exec -it nginx-bvs-pvc-5fd5849fd4-jst2z -- cat /usr/share/nginx/html/hello_world.txt Hello PV
-
-
참고사항
- 앞선 테스트에서 처럼 ReadWriteOnce 접근 모드에서는 동시에 단일 Kubernetes Node에 있는 POD만 붙여서 사용할 수 있습니다. 다른 Node에 있는 POD에서 동일한 PV를 사용하려고 하면, 컨테이너 기동시 Multi-Attach 오류가 발생하며, 컨테이너가 기동이 되지 않습니다.
- 또한 Self-Healing으로 POD 재기동시 기존 POD는 종료되고, 새로운 POD가 다른 Worker Node에서 기동한 경우에, 기존 사용중인 POD가 없음을 인지하는 데 약간의 시간이 걸려 일시적으로 Multi-Attach 오류가 발생할 수 있습니다.
ReadWriteMany 지원 여부
현재 버전 기준 CSI Driver for OCI Block Volume Service는 ReadWriteOnce만 지원합니다. 그래서 단일 Node에 멀티 Pod까지만 지원됩니다. 또한 위 작업 내용을 accessMode를 ReadWriteMany로 변경후 동일하게 수행하면 pod가 생성되지 않고 아래와 같이 에러가 나게 됩니다.
$ kubectl get events --sort-by=.metadata.creationTimestamp
LAST SEEN TYPE REASON OBJECT MESSAGE
...
1s Warning ProvisioningFailed persistentvolumeclaim/csi-bvs-pvc-2 failed to provision volume with StorageClass "oci-bv": rpc error: code = InvalidArgument desc = invalid volume capabilities requested. Only SINGLE_NODE_WRITER is supported ('accessModes.ReadWriteOnce' on Kubernetes)
...
이 글은 개인으로서, 개인의 시간을 할애하여 작성된 글입니다. 글의 내용에 오류가 있을 수 있으며, 글 속의 의견은 개인적인 의견입니다.