Skip to main content

블록 스토리지 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를 설정하기 위해서는 다음의 사전 작업이 필요합니다. 본 사전 작업은 클러스터당 한 번만 진행합니다.

  1. PV를 동적 배포할 클러스터를 생성합니다.(클러스터 생성 문서 참고)

  2. 생성한 클러스터에 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 설정합니다.

  1. Dynamic Volume Provisioning 설정하기 전, Helm client를 설치합니다. 운영체제별 Helm 설치에 대한 자세한 설명은 Helm 공식 문서 > 헬름 설치하기를 참고하시기 바랍니다.

  2. 다음의 명령어를 실행하여 공식 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!
  3. 다음의 명령어를 터미널에 입력하여 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 파일을 적용합니다.

  1. 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
  2. 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
  3. 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}"
  4. 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
  5. 정상적으로 StorageClass 리소스가 변경된 것을 확인할 수 있습니다.

Step 5. PersistentVolume 동적 프로비저닝 테스트하기

PVC(PersistentVolumeClaim) 를 적용해서 PV(PersistentVolume) 가 동적으로 생성되는 것을 확인하고, 파드에 연결하는 테스트를 수행합니다.

PVC 적용 및 PV 생성 확인

  1. 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-delete
    PVC 배포 명령어
    kubectl --kubeconfig=$KUBE_CONFIG apply -f pvc-test.yaml
  2. 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를 사용하는 파드를 배포하는 예제입니다.

  1. 파드를 생성하기 위한 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
  2. 다음의 명령어를 실행하여 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
  3. 정상적으로 파드가 생성되어 PV에 마운트 되었음을 확인할 수 있습니다.