본문으로 건너뛰기

블록 스토리지 CSI Provisioner 설정

클러스터에서 영구 볼륨을 사용하려면 스토리지와 PersistentVolume 객체를 구성해야 합니다. Kubernetes Engine에서는 CSI(Container Storage Interface) Provisioner를 사용해 카카오클라우드 Block Storage를 영구 볼륨으로 연결할 수 있습니다.

CSI Provisioner를 설정하면 PersistentVolumeClaim을 생성하여 영구 볼륨을 동적으로 프로비저닝할 수 있습니다. CSI Provisioner를 배포하고 동적 프로비저닝을 확인하는 방법은 다음과 같습니다.

안내

Bare Metal Server 유형의 노드 풀은 CSI Provisioner를 지원하지 않습니다.

사전 작업​

CSI Provisioner를 설정하기 위해서는 다음의 사전 작업이 필요합니다. 본 사전 작업은 클러스터당 한 번만 진행합니다.

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

  2. 생성한 클러스터에 PV 동적 배포 명령을 보내기 위한 kubectl 제어 설정을 수행합니다.

Step 1. Dynamic Volume Provisioning 설정​

PVC(PersistentVolumeClaim)를 통한 Persistent Volume 동적 프로비저닝을 위해 카카오클라우드의 CSI Provisioner를 배포합니다.

다음 두 가지 방법 중 하나를 선택하여 CSI Provisioner를 배포합니다.

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을 사용하여 동적 프로비저닝을 설정합니다.

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