블록 스토리지 CSI Provisioner 설정
클러스터에서 영구 볼륨을 사용하기 위해 일반적으로 스토리지와 PersistentVolume 객체를 직접 구성해야 합니다. Kubernetes Engine에서는 CSI(Container Storage Interface) Provisioner를 설정하여 카카오클라우드 Block Storage를 영구 볼륨으로 사용할 수 있습니다. 클러스터에 CSI Provisioner를 설정하면, 간단하게 PersistentVolumeClaim 을 생성하여 영구 볼륨을 생성할 수 있습니다.
CSI Provisioner를 설정하는 방법은 다음과 같습니다.
Bare Metal Server 유형의 노드 풀은 CSI Provisioner를 지원하지 않습니다.
Step 1. 사전 작업하기
CSI Provisioner를 설정하기 위해서는 다음의 사전 작업이 필요합니다. 본 사전 작업은 클러스터당 한 번만 진행합니다.
-
PV를 동적 배포할 클러스터를 생성합니다.(클러스터 생성 문서 참고)
-
생성한 클러스터에 PV 동적 배포 명령을 보내기 위한 kubectl 제어 설정을 수행합니다.
Step 2. Dynamic Volume Provisioning 설정하기
PVC(PersistentVolumeClaim)를 통한 Persistent Volume 동적 프로비저닝 설정을 위해 카카오클라우드의 CSI Provisioner를 배포합니다. YAML 파일 또는 Helm을 사용하여 배포할 수 있습니다.
kr-central-2 리전에서 노드 풀이 서로 다른 AZ에서 실행되는 Multi-AZ 클러스터를 생성한 후 블록스토리지 CSI Provisioner를 배포하면, 노드 풀이 실행되는 모든 AZ( kr-central-2-a
, kr-central-2-b
)에 각각 PersistentVolumeClaim이 생성됩니다.
YAML 파일로 CSI Provisioner 배포
다음의 명령어를 터미널에 입력하여 CSI Provisioner를 설치합니다.
kubectl --kubeconfig=$KUBE_CONFIG apply -f https://raw.githubusercontent.com/kakaoicloud-guide/kubernetes-engine/main/guide-samples/dynamicPV/cinder-csi.yaml
Helm을 사용하여 CSI Provisioner 배포
쿠버네티스 패키지 관리 도구인 Helm을 사용하여 Dynamic Volume Provisioning 설정합니다.
-
Dynamic Volume Provisioning 설정하기 전, Helm client를 설치합니다. 운영체제별 Helm 설치에 대한 자세한 설명은 Helm 공식 문서 > 헬름 설치하기를 참고하시기 바랍니다.
-
다음의 명령어를 실행하여 공식 Helm chart repository를 먼저 추가합니다.
Helm chart repository 추가 명령어$ helm repo add cpo https://kubernetes.github.io/cloud-provider-openstack
"cpo" has been added to your repositories
$ helm repo update
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "cpo" chart repository
Update Complete. ⎈Happy Helming!⎈ -
다음의 명령어를 터미널에 입력하여 CSI Provisioner를 클러스터에 배포합니다. 이 경우, CSI Provisioner에 대한 네임스페이스와 서비스 등 리소스들이 한 번에 배포됩니다.
Helm CSI Provisioner 배포 명령어$ helm install cinder-csi cpo/openstack-cinder-csi \
--version 2.3.0 \
--set secret.enabled=true \
--set secret.name=cloud-config \
--namespace kube-system
NAME: cinder-csi
LAST DEPLOYED: Mon Mar 13 14:05:04 2023
NAMESPACE: kube-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Use the following storageClass csi-cinder-sc-retain and csi-cinder-sc-delete only for RWO volumes.
Step 3. CSI Provisioner 배포 확인
CSI Provisioner를 배포한 후, 리소스가 잘 생성되었는지 확인하기 위해 다음의 명령어를 실행합니다.
kubectl --kubeconfig=$KUBE_CONFIG get ds,deploy -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
daemonset.apps/openstack-cinder-csi-nodeplugin 1 1 1 1 1 `<none>` 3m5s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/openstack-cinder-csi-controllerplugin 1/1 1 1 3m5s
Step 4. (선택) Multi-AZ 클러스터의 특정 AZ에만 CSI Provisioner 배포
Multi-AZ를 지원하는 kr-central-2 리전에서 생성한 클러스터의 노드 풀이 서로 다른 AZ에서 실행될 때, 특정 AZ에만 PersistentVolumeClaim을 생성할 수 있습니다.
StorageClass에 PersistentVolumeClaim을 생성할 특정 AZ 정보를 입력하고, 변경한 StorageClass YAML 파일을 적용합니다.
-
CSI Provisioner를 배포한 후, StorageClass 리소스가 생성되었는지 확인합니다.
StorageClass 리소스 확인 명령어kubectl --kubeconfig=$KUBE_CONFIG get StorageClass -n kube-system
실행 결과NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION
csi-cinder-sc-delete cinder.csi.openstack.org Delete Immediate true
csi-cinder-sc-retain cinder.csi.openstack.org Retain Immediate true -
StorageClass에
allowedTopologies
항목을 추가하고, allowedTopologies 하위matchLabelExpressions
설정값을 추가해야 합니다. YAML 파일에서 아래의 설정 항목을 확인합니다.- matchLabelExpressions의
key: topology.cinder.csi.openstack.org/zone
values
설정값으로 PVC를 생성할 특정 AZ 정보를 입력
항목 설정값 allowedTopologies
설정값: matchLabelExpressions
allowedTopologies 하위의 matchLabelExpressions
설정값
-key: topology.cinder.csi.openstack.org/zone
values:
-kr-central-2-a
또는kr-central-2-b
- matchLabelExpressions의
-
StorageClass를 변경 배포하는 아래의 YAML 파일을 로컬에 다운로드하고, 2단계에서 안내한 항목을 추가하여 YAML 파일을 설정합니다.
- CSI Provisioner를 배포한 후 생성되어있는 2개의 StorageClass 리소스 (csi-cinder-sc-delete, csi-cinder-sc-retain) 모두
allowedTopologies
항목을 추가해야 합니다.
Multi-AZ 클러스터 특정 AZ의 PVC 생성을 위한 StorageClass 변경 YAML# edit-storageclass.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-cinder-sc-delete
provisioner: cinder.csi.openstack.org
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
allowedTopologies:
- matchLabelExpressions:
- key: topology.cinder.csi.openstack.org/zone
values:
- "{kr-central-2-a 또는 kr-central-2-b}"
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: csi-cinder-sc-retain
provisioner: cinder.csi.openstack.org
reclaimPolicy: Retain
volumeBindingMode: Immediate
allowVolumeExpansion: true
allowedTopologies:
- matchLabelExpressions:
- key: topology.cinder.csi.openstack.org/zone
values:
- "{kr-central-2-a 또는 kr-central-2-b}" - CSI Provisioner를 배포한 후 생성되어있는 2개의 StorageClass 리소스 (csi-cinder-sc-delete, csi-cinder-sc-retain) 모두
-
StorageClass를 변경하는 YAML 파일을 실행하기 위해 다음의 명령어를 실행합니다.
- YAML 파일 적용 시, 로컬에 저장한 실제 YAML 파일명으로 적용해야 합니다.
StorageClass 변경 배포 명령어kubectl --kubeconfig=$KUBE_CONFIG apply -f {YAML 파일명}.yaml
실행결과storageclass.storage.k8s.io/csi-cinder-sc-delete configured
storageclass.storage.k8s.io/csi-cinder-sc-retain configured -
정상적으로 StorageClass 리소스가 변경된 것을 확인할 수 있습니다.
Step 5. PersistentVolume 동적 프로비저닝 테스트하기
PVC(PersistentVolumeClaim) 를 적용해서 PV(PersistentVolume) 가 동적으로 생성되는 것을 확인하고, 파드에 연결하는 테스트를 수행합니다.
PVC 적용 및 PV 생성 확인
-
PVC(PersistentVolumeClaim) 를 생성하기 위하여 아래 YAML을 배포합니다.
PVC 생성 예제 파일# pvc-test.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc-test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: csi-cinder-sc-deletePVC 배포 명령어kubectl --kubeconfig=$KUBE_CONFIG apply -f pvc-test.yaml
-
PVC(PersistentVolumeClaim) 에 맞게 PV(PersistentVolume) 가 동적으로 생성된 것을 확인할 수 있습니다.
PV, PVC 상태 확인 명령어kubectl --kubeconfig=$KUBE_CONFIG get pv,pvc // PV, PVC 확인
실행 결과NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
persistentvolume/pvc-c2456546-ddc2-4bd6-9d79-35f6ba53e7fc 10Gi RWO Delete Bound default/pvc-test csi-cinder-sc-delete 16s
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
persistentvolumeclaim/pvc-test Bound pvc-c2456546-ddc2-4bd6-9d79-35f6ba53e7fc 10Gi RWO csi-cinder-sc-delete 16s
PVC를 사용하는 파 드 생성
앞에서 생성한 PV를 사용하는 파드를 배포하는 예제입니다.
-
파드를 생성하기 위한 YAML을 배포합니다.
파드 배포 예제 파일# task-pv-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: task-pv-pod
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: pvc-test
containers:
- name: task-pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: task-pv-storage파드 배포 명령어kubectl --kubeconfig=$KUBE_CONFIG apply -f task-pv-pod.yaml
-
다음의 명령어를 실행하여 PV가 파드에 잘 마운트 되었는지 확인합니다.
파드 확인 명령어kubectl --kubeconfig=$KUBE_CONFIG get pods // 파드 확인
kubectl --kubeconfig=$KUBE_CONFIG exec -ti task-pv-pod -- df -h // 조회한 파드의 컨테이너를 조회실행 결과NAME READY STATUS RESTARTS AGE
task-pv-pod 1/1 Running 0 53s
Filesystem Size Used Avail Use% Mounted on
/dev/vdb 9.8G 24K 9.8G 1% /usr/share/nginx/html -
정상적으로 파드가 생성되어 PV에 마운트 되었음을 확인할 수 있습니다.