본문으로 건너뛰기

블록 스토리지 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을 사용하여 배포할 수 있습니다.

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. 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에 마운트 되었음을 확인할 수 있습니다.