블록 스토리지 CSI 이용 가이드

시작하기 전에

모든 컨테이너들은 빌드 시점에 추가된 파일들을 가지고 구동됩니다. 이후에 컨테이너의 파일 시스템 내에 새로 추가된 파일들은 프로세스가 종료되거나 Kubernetes의 liveness Probe의 상태 체크가 실패하여 컨테이너가 재시작되는 경우 모두 제거됩니다.

컨테이너가 재시작되는 경우에도 앞서 언급한 추가된 파일들이 계속 유지되길 원하는 경우 배포 시 생성할 수 있는 PersistentVolumeClaim(PVC)을 통해 데이터 저장을 위해 생성할 수 있는 영구 저장소인 블록 스토리지를 이용할 수 있습니다.

네이버 클라우드 플랫폼의 Kubernetes Service는 볼륨 드라이버로서 Container Storage Interface(CSI)를 제공합니다. 이 볼륨 드라이버는 Kubernetes와 연동되어, 블록 스토리지 생성과 삭제 및 attaching, detaching, resizing과 같은 작업을 지원합니다.

제약 사항

지원 버전

네이버 클라우드 플랫폼의 Kubernetes Service는 블록 스토리지 볼륨 드라이버로 CSI를 제공합니다. CSI 드라이버와 Kubernetes 간 연동을 위해서는 호환되는 버전을 확인해야 합니다.

현재 네이버 클라우드 플랫폼에서 제공하고 있는 CSI 버전과 호환 Kubernetes 버전은 다음과 같습니다.

Ncloud CSI Driver\Kubernetes Version 1.16+
v1.2.x yes

Kubernetes 버전에서 지원하는 스토리지 서비스는 다음과 같습니다.

Service\Kubernetes Version 1.16
볼륨 생성 지원
볼륨 삭제 지원
볼륨 확장(리사이즈) 지원
서버에 볼륨 할당 지원
서버에 볼륨 해제 지원
스냅샷 생성 지원
스냅샷 삭제 지원

네이버 클라우드 플랫폼의 블록 스토리지는 오프라인 볼륨 리사이즈를 제공합니다. 볼륨 리사이즈를 위해서는 Pod의 Replica 수를 0으로 변경하는 작업이 필요하며 경우에 따라 서비스의 중단이 발생하므로 PVC 생성 시 충분한 크기의 볼륨 할당을 권장합니다.

할당 가능한 용량

블록 스토리지는 CSI를 통해 10GB 단위로 할당이 가능합니다. 10GB 미만의 볼륨 크기를 요청한 경우 최소 크기인 10GB로 생성됩니다. 필요한 볼륨 크기를 정의하지 않은 경우 기본값인 20GB로 생성됩니다. 블록 스토리지의 할당 가능한 최소 용량과 최대 용량은 다음과 같습니다.

  • 최소: 10GB
  • 최대: 2000GB

CSI Driver Object

Kubernetes 클러스터에서 영구 데이터(Persistent data)를 읽고 쓰는 작업이 필요할 때, CSI 드라이버를 이용하여 블록 스토리지를 컨테이너에 마운트할 수 있습니다. 필요한 스토리지 크기를 PersistentVolumeClaim(PVC)를 통해 요청할 수 있습니다. CSI 드라이버는 생성된 PVC를 확인하여, 블록 스토리지를 생성 후 할당을 요청한 컨테이너에 마운트 시킵니다.

Storage Class

Kubernetes에서 StorageClass는 성능 및 목적에 따라 다양한 스토리지들을 추상화한 개념입니다. 이를 통해 각 스토리지에 대해 임의의 정책이나 타입 등을 설정할 수 있습니다. 네이버 클라우드 플랫폼에서는 블록 스토리지를 사용하는 기본 StorageClass를 제공합니다.

Namespace kube-system 내의 StorageClass에서 nks-block-storage라는 이름의 object를 확인할 수 있습니다.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: nks-block-storage
  namespace: kube-system
  annotations:
    storageclass.kubernetes.io/is-default-class: "true"
provisioner: blk.csi.ncloud.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: true
parameters:
  type: SSD

① Default Storage Class는 annotation의 storageclass.kubernetes.io/is-default-class 값을 true로 가집니다. 다른 값이거나 annotation이 없는 경우 false로 적용됩니다.

volumeBindingMode 값을 통해 볼륨 바인딩과 동적 프로비저닝(Dynamic Provisioning)이 어느 시점에 동작할지를 제어할 수 있습니다. 정의되지 않았다면 기본값은 Immediate입니다.

PersistentVolumeClaim을 통해 설정에 따라서 필요 시마다 PersistentVolume을 자동으로 생성할 수 있습니다. 이를 동적 프로비저닝(Dynamic Provisioning)이라 합니다.

Mode Description
Immediate 볼륨 바인딩과 동적 프로비저닝(provisioning)이 PVC가 생성되는 시점에 동작합니다.
WaitForFirstConsumer 볼륨 바인딩과 동적 프로비저닝(provisioning)이 PVC를 이용하는 Pod가 생성되는 시점에 동작합니다.

reclaimPolicy를 통해 사용이 끝난 PVC가 삭제될 때 사용 중이던 PersistentVolume(PV)에 대한 재확보(Reclaim) 정책을 설정할 수 있습니다. 정의되지 않았다면 기본값은 Delete입니다.

Policy Description
Retain PVC가 삭제되면 사용 중이던 PV는 재사용이 가능한 상태로 변경됩니다. 스토리지 내부의 데이터는 그대로 유지됩니다.
Delete PVC가 삭제되면 사용 중이던 PV도 삭제합니다. 연계되어 있던 블록 스토리지도 반납됩니다.

동적 프로비저닝(Dynamic Provisioning)으로 생성된 블록 스토리지가 자동으로 반납되는 것을 방지하려면 재확보 정책인 reclaimPolicyRetain으로 설정해야 합니다. 이 경우 PersistentVolumeClaim이 제거되더라도 블록 스토리지는 함께 반납되지 않으며, 존재하는 동안 요금이 청구됩니다. 이 블록 스토리지는 콘솔이나 API를 통해 수동으로 반납해야 합니다.

allowVolumeExpansion 필드가 true인 경우 PVC(PersistentVolumeClaim)를 확장할 수 있습니다.

⑤ parameters의 type을 통해 생성될 블록 스토리지의 타입을 SSDHDD 가운데 선택하여 사용할 수 있습니다. 정의되지 않았다면 기본값은 SSD입니다.

Type Description
SSD 스토리지 타입으로 고성능 I/O를 지원하는 SSD를 사용합니다. 빠른 데이터 처리가 필요할 경우 적합합니다.
HDD 스토리지 타입으로 HDD를 사용합니다.

생성된 StorageClass Object의 default storage class 내용을 변경하려면 다음 문서를 참고하십시오.

[Changing the default StorageClass]

CSI Controller

볼륨의 생성, 삭제, 할당, 할당 해제, 스냅샷 등의 컨트롤과 관리를 담당합니다. Namespace kube-system 내 statefulset에서 확인할 수 있습니다.

$ kubectl --kubeconfig $KUBE_CONFIG get statefulset -n kube-system
NAME                 DESIRED   CURRENT   AGE
csi-nks-controller   1         1         37d

CSI Node

Kubernetes 워커 노드마다 하나씩 동작하고 있으며 볼륨의 포맷, 마운트, 언마운트 등의 동작을 담당합니다. Namespace kube-system 내 daemonset에서 확인할 수 있습니다.

$ kubectl --kubeconfig $KUBE_CONFIG get daemonset -n kube-system
NAME           DESIRED   CURRENT   READY   UP-TO-DATE   AVAILABLE   NODE SELECTOR                 AGE
csi-nks-node   3         3         3       3            3           <none>                        44d

CSI를 이용한 블록 스토리지 할당

PersistentVolumeClaim

필요한 PersistentVolume(PV) 리소스는 PersistentVolumeClaim(PVC)을 통해 요청할 수 있습니다. CSI Driver는 PVC를 확인하여 필요한 PersistentVolume(PV)을 자동으로 생성합니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-pod-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: nks-block-storage

AccessMode

네이버 클라우드 플랫폼의 블록 스토리지가 지원하는 AccessMode는 다음과 같습니다.

  • ReadWriteOnce: 단일 노드가 볼륨에 대한 읽기/쓰기가 가능하도록 마운트될 수 있습니다.

이 밖에 AccessMode로 여러 노드에 의한 읽기 전용으로 마운트하는 ReadOnlyMany와, 여러 노드에 의한 읽기/쓰기 모드로 마운트하는 ReadWriteMany가 있습니다. 네이버 클라우드 플랫폼의 블록 스토리지는 이 AccessMode들을 지원하지 않습니다.

Resources

필요한 스토리지의 크기를 입력합니다. 입력하지 않으면 기본값 20GB로 적용됩니다. 스토리지 크기는 10GB 단위로 입력할 수 있으며, 최소 10GB에서 최대 2000GB 사이의 값이 허용됩니다.

Pod에 단일 신규 볼륨 할당

새로운 블록 스토리지를 하나 생성하여, 이를 볼륨으로 마운트합니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-pod-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: nks-block-storage
---
kind: Pod
apiVersion: v1
metadata:
  name: my-csi-app
spec:
  containers:
    - name: my-frontend
      image: busybox
      volumeMounts:
      - mountPath: "/data"
        name: my-volume
      command: [ "sleep", "1000000" ]
  volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: csi-pod-pvc

Pod

Pod의 spec.volumes에 컨테이너와 바인딩될 스토리지들을 정의할 수 있습니다. 배열의 요소로 입력하며, 스토리지 이름과 생성된 PVC의 이름을 persistentVolumeClaimclaimName에 입력합니다.

컨테이너에서 정의된 스토리지들을 마운트할 수 있습니다. spec.container에서 PersistentVolume이 필요한 컨테이너가 있다면 volumeMounts에 정의된 스토리지 이름을 입력합니다. 마운트될 경로는 mountPath에 입력합니다.

이미 생성된 블록 스토리지를 Pod에 마운트

이 방식은 사용자가 PersistentVolumeClaim(PVC)을 생성하여 필요한 스토리지 볼륨 자동 생성을 요청하는 방식이 아니라, 이미 생성되어 있는 블록 스토리지를 이용하여 PersistentVolume(PV)을 만드는 기능입니다.

이미 생성되어 있는 블록 스토리지 Instance ID를 이용하여 PersistentVolume(PV)을 만듭니다.

kind: PersistentVolume
apiVersion: v1
metadata:
  name: volume-existing-01
  annotations:
    pv.kubernetes.io/provisioned-by: blk.csi.ncloud.com # 블록 스토리지와 연동될 provisoner 이름
spec:
  storageClassName: nks-block-storage # 블록 스토리지의 스토리지 클래스 이름
  persistentVolumeReclaimPolicy: Retain
  capacity:
    storage: 10Gi # 블록 스토리지 크기
  accessModes:
    - ReadWriteOnce
  csi:
    driver: blk.csi.ncloud.com
    fsType: ext4
    volumeHandle: "952814" # Block Storage Instance ID
    volumeAttributes:
      blk.csi.ncloud.com/noformat: "true" # 블록스토리지를 포맷하지 않음
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-pod-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: nks-block-storage
  volumeName: "volume-existing-01"
---
kind: Pod
apiVersion: v1
metadata:
  name: my-csi-app
spec:
  containers:
    - name: my-frontend
      image: busybox
      volumeMounts:
      - mountPath: "/data"
        name: my-volume
      command: [ "sleep", "1000000" ]
  volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: csi-pod-pvc

PersistentVolume

이미 존재하는 블록 스토리지를 Kubernetes 클러스터에서 사용하기 위해서는 PersistentVolume 생성 시 해당 정보를 입력합니다.

  • storageClassName에 네이버 클라우드 플랫폼의 스토리지 클래스인 nks-block-storage를 입력합니다.
  • capacity.storage에 이미 존재하는 블록 스토리지의 크기를 입력합니다.
  • accessModesReadWriteOnce를 입력합니다. 블록 스토리지를 지원하는 스토리지 클래스는 해당 설정만을 지원합니다.
  • csidriver에 스토리지 클래스 드라이버 이름인 blk.csi.ncloud.com을 입력합니다.
  • csivolumeHandle에 생성되어 있는 블록 스토리지의 Instance ID를 입력합니다.
  • csivolumeAttributesblk.csi.ncloud.com/noformat: "true"를 입력합니다. 해당 설정은 포맷을 진행하지 않겠다는 의미이며, 기존에 저장된 내용을 유지한 상태로 마운트합니다.

PersistentVolumeClaim

생성된 PersistentVolume(PV)와 바인딩되는 PersistentVolumeClaim(PVC)을 생성합니다.

  • resourcesstorage에 이미 존재하는 블록 스토리지의 크기를 입력합니다.
  • storageClassName에 블록 스토리지 클래스 이름인 nks-block-storage를 입력합니다.
  • volumeName에 생성한 PersistentVolume(PV)의 이름을 입력합니다.

Pod

Pod 생성 시 볼륨 요청인 PersistentVolumeClaim(PVC)를 지정하여 사용할 볼륨을 마운트합니다.

  • specvolumes의 요소로 사용할 claimName을 입력합니다.

Kubernetes에서는 Deployment, Statefulset, DaemonSet, ReplicaSet, Job와 같은 컨트롤러가 관리하지 않는 Pod들은 종료되더라도 다시 생성되지 않습니다. 이러한 Pod들이 있다면 kubectl drain 명령어는 이를 보호하기 위해서 동작하지 않습니다. kubectl drain 명령어를 --force 옵션을 통해 실행하는 경우 이러한 Pod들은 클러스터에서 제거됩니다.

볼륨 할당 추가 예제

Pod에 복수의 볼륨을 할당

두 개의 신규 블록 스토리지를 생성하여 Pod에 마운트합니다. 생성 요청할 볼륨에 대해 각각 PersistentVolumeClaim을 작성합니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-pod-1
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: nks-block-storage
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-pod-2
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: nks-block-storage
---
kind: Pod
apiVersion: v1
metadata:
  name: my-csi-app
spec:
  containers:
    - name: my-csi-app
      image: busybox
      volumeMounts:
      - mountPath: "/data/pod-1/"
        name: my-volume-1
      - mountPath: "/data/pod-2/"
        name: my-volume-2
      command: [ "sleep", "1000000" ]
  volumes:
    - name: my-volume-1
      persistentVolumeClaim:
        claimName: csi-pod-1
    - name: my-volume-2
      persistentVolumeClaim:
        claimName: csi-pod-2

Deployment에서 PersistentVolume 이용하기

PersistentVolumeClaim(PVC)을 생성하여 신규 볼륨 생성을 요청합니다. Deploymenttemplate에서 claimName을 명시함으로써 생성된 볼륨을 마운트할 수 있습니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-deployment-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: nks-block-storage
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-csi-app
spec:
  selector:
    matchLabels:
      app: my-csi-app
  replicas: 1
  template:
    metadata:
      labels:
        app: my-csi-app
    spec:
      containers:
        - name: my-frontend
          image: busybox
          volumeMounts:
          - mountPath: "/data"
            name: my-volume
          command: [ "sleep", "1000000" ]
      volumes:
        - name: my-volume
          persistentVolumeClaim:
            claimName: csi-deployment-pvc

Statefulset에서 PersistentVolume 이용하기

Statefulset에서는 volumeClaimTemplates를 정의하여 각 replica마다 새로운 PersistentVolumeClaim(PVC)을 자동으로 생성할 수 있습니다.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: my-csi-app
spec:
  serviceName: my-csi-app
  selector:
    matchLabels:
      app: my-csi-app
  replicas: 1
  template:
    metadata:
      labels:
        app: my-csi-app
    spec:
      containers:
        - name: my-frontend
          image: busybox
          volumeMounts:
          - mountPath: "/data"
            name: my-volume
          command: [ "sleep", "1000000" ]
  volumeClaimTemplates:
    - metadata:
        name: my-volume
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 10Gi

PersistentVolumeClaim 제거

Kubernetes에서는 PersistentVolumeClaim(PVC)은 요청된 Deployment, StatefulSet, ReplicaSet, Pod와 같은 리소스를 삭제하더라도 함께 제거되지 않습니다.

PersistentVolumeClaim(PVC) 삭제를 위한 명령어는 다음과 같습니다.

# pvc 조회
$ kubectl --kubeconfig $KUBE_CONFIG get pvc
NAME          STATUS   VOLUME                           CAPACITY   ACCESS MODES   STORAGECLASS        AGE
csi-pod-pvc   Bound    pvc-084a811bac4211e9842bf220cd   10Gi       RWO            nks-block-storage   2m8s

# pvc 삭제
$ kubectl --kubeconfig $KUBE_CONFIG delete pvc csi-pod-pvc
persistentvolumeclaim "csi-pod-pvc" deleted

CSI를 이용한 볼륨 리사이즈

네이버 클라우드 플랫폼의 블록스토리지는 기존에 생성되어 있는 볼륨에 대해 오프라인 리사이징(Offline Resizing)을 제공합니다.

주의
볼륨 리사이즈는 운영 중인 Pod를 제어하는 Controller에서 Replica의 수를 0으로 조정하는 것이 필요합니다.
이 과정은 운영 중인 앱의 순단을 발생하므로 초기 볼륨 생성 시 충분한 크기로 생성할 것을 권장합니다.

① 애플리케이션 배포

다음과 같이 10GiB 크기의 신규 블록 스토리지 볼륨 생성을 요청합니다.

각 리소스의 이름은 다음과 같습니다.

  • Deployment: my-csi-app
  • PersistentVolumeClaim: csi-deployment-pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-deployment-pvc
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: nks-block-storage
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-csi-app
spec:
  selector:
    matchLabels:
      app: my-csi-app
  replicas: 1
  template:
    metadata:
      labels:
        app: my-csi-app
    spec:
      containers:
        - name: my-frontend
          image: busybox
          volumeMounts:
          - mountPath: "/data"
            name: my-volume
          command: [ "sleep", "1000000" ]
      volumes:
        - name: my-volume
          persistentVolumeClaim:
            claimName: csi-deployment-pvc

② Replica 수를 0으로 조정

생성한 Deployment인 my-csi-app 의 Replica 수를 0으로 변경합니다.

$ kubectl --kubeconfig $KUBE_CONFIG scale --replicas=0 deployment/my-csi-app
deployment.apps/my-csi-app scaled

PersistentVolumeClaim의 Volume Request 크기 조정

생성한 PersistentVolumeClaim인 csi-deployment-pvc 의 요청 볼륨 사이즈를 10Gi에서 20Gi로 변경합니다.

kubectl --kubeconfig $KUBE_CONFIG patch pvc csi-deployment-pvc -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'

④ Replica 수 원복

생성한 Deployment인 my-csi-app 의 Replica 수를 기존에 사용하던 값인 1로 변경합니다.

$ kubectl --kubeconfig $KUBE_CONFIG scale --replicas=1 deployment/my-csi-app
deployment.apps/my-csi-app scaled

볼륨 리사이즈 완료 후 Pod의 STATUS가 Running으로 변경됩니다.

$ kubectl --kubeconfig $KUBE_CONFIG get po
NAME                          READY   STATUS    RESTARTS   AGE
my-csi-app-6dc78bf856-dzrhf   1/1     Running   0          24s

CSI를 이용하여 Snapshot 생성 및 볼륨 복구

볼륨 Snapshot 생성

VolumeSnapshot은 CSI에서 정의한 사용자 지정 리소스(Custom Resource Definition, CRD)입니다. 자세한 내용은 다음 링크를 참고하세요.

[Snapshot-Restore-Feature]

PersistentVolume(PV)과 바인딩되어 있는 PersistentVolumeClaim(PVC)을 이용하여 VolumeSnapshot을 생성합니다.

apiVersion: snapshot.storage.k8s.io/v1alpha1
kind: VolumeSnapshot
metadata:
  name: csi-nks-test-snapshot # 신규 생성될 VolumeSnapShot이 사용할 이름을 입력
spec:
  source:
    name: csi-pod-pvc # Snapshot을 생성할 PV와 바인딩 되어 있는 PVC의 이름을 입력
    kind: PersistentVolumeClaim
  • metadataname에 새롭게 생성될 VolumeSnapShot이 사용할 이름을 입력합니다.
  • specsource.name에 snapshot을 생성할 PV와 바인딩되어 있는 PVC 이름을 입력합니다.
  • specsource.kind에는 PersistentVolumeClaim을 입력합니다.

생성된 볼륨 snapshot 확인

생성된 볼륨 snapshot을 확인하기 위해 다음의 kubectl 명령어를 이용합니다. 볼륨 snapshot의 resource 이름은 VolumeSnapShot입니다.

$ kubectl --kubeconfig $KUBE_CONFIG get volumesnapshot
NAME                    AGE
csi-nks-test-snapshot   17h

생성된 볼륨 snapshot 삭제

생성된 볼륨 snapshot을 확인하기 위해 다음의 kubectl 명령어를 이용합니다. 삭제할 볼륨 snapshot의 이름을 이용하여 해당 resource를 삭제합니다.

$ kubectl --kubeconfig $KUBE_CONFIG get volumesnapshot
NAME                    AGE
csi-nks-test-snapshot   17h

$ kubectl --kubeconfig $KUBE_CONFIG delete volumesnapshot csi-nks-test-snapshot
volumesnapshot.snapshot.storage.k8s.io "csi-nks-test-snapshot" deleted

생성된 볼륨 snapshot으로부터 볼륨 복구

볼륨 snapshot을 이용하여 신규 볼륨 생성을 요청합니다. 생성된 snapshot의 내용이 신규 볼륨으로 복제됩니다.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-nks-test-pvc-restore
spec:
  dataSource:
    name: csi-nks-test-snapshot # 복구할 볼륨 snapshot의 이름
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi
  storageClassName: nks-block-storage
---
kind: Pod
apiVersion: v1
metadata:
  name: csi-restore-app
spec:
  containers:
    - name: my-frontend
      image: busybox
      volumeMounts:
        - mountPath: "/data"
          name: my-volume
      command: [ "sleep", "1000000" ]
  volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: csi-nks-test-pvc-restore

PersistentVolumeClaim

볼륨 snapshot으로부터 볼륨을 복구하기 위해서는 spec.dataSource에 대상 정보를 입력합니다.

  • dataSource.name에 복구할 볼륨 snapshot의 이름을 입력합니다.
  • dataSource.kind에 복구 대상의 resource 이름인 VolumeSnapshot을 입력합니다.
  • dataSource.apiGroup에 snapshot의 apiGroup인 snapshot.storage.k8s.io를 입력합니다.
  • resources.requests.storage에 볼륨 snapshot의 크기와 동일한 값을 입력합니다.

Pod

요청한 볼륨 정보인 PersistentVolumeClaim(PVC)의 이름을 claimName에 입력합니다.


문제 해결

다음 절에서는 CSI가 삭제됐거나 신규인 경우 설치하는 방법을 설명합니다.

CSI 시작하기(미설치 클러스터용)

이 절은 Container Storage Interface(CSI)를 Kubernetes 클러스터에 설치하는 방법을 다룹니다. CSI가 이미 설치되어 있는 경우에는 아래의 작업들을 수행하지 않아도 됩니다.

요구 사항

  • Kubernetes 클러스터의 버전과 호환되는 CSI 드라이버 배포
  • 각 워커 노드의 kubelet에 --allow-privileged 플래그(flag)를 true로 설정
  • 각 워커 노드의 kubelet에 --feature-gates=VolumeSnapshotDataSource=true 값의 feature gate 플래그(flag)를 설정

Kubernetes 클러스터에 CSI Driver 배포하기

인증을 위한 토큰 획득

인증 토큰을 발급받기 위한 페이지로 이동합니다.

  • API Gateway 상품으로 이동합니다.
  • API Gateway상품의 Published APIs 를 선택합니다.
  • Product 이름이 Kubernetes Service인 행을 선택합니다.
  • 테이블 위에 활성화된 Catalog 버튼을 클릭합니다.
  • token행을 클릭하고, API 설명서 아래의 v1 버튼을 클릭합니다.

토큰 발급을 위해서는 인증키가 필요합니다. 인증키는 포털 > 마이페이지 > 인증키 관리에서 확인할 수 있습니다.

  1. 토큰 발급 페이지 상단의 Authorize 버튼을 클릭합니다.
  2. 포털에서 발급받은 인증키를 Access Key, Secret Key 필드에 입력합니다. API Key 필드는 비워둡니다. 입력 후 아래의 Authorize 버튼을 클릭합니다. 인증키가 입력된 것을 확인한 후, Done을 클릭합니다.
  3. 인증키 입력 후 /auth/token/issue 항목을 클릭합니다. 다음 화면에서 Try it out을 클릭합니다.
  4. 아래 "endpoint"의 key에 해당하는 value에 Kubernetes Service에서 구동 중인 클러스터의 endpoint를 입력합니다. endpoint 값은 Kubernetes Service의 페이지에서 구동 중인 클러스터 항목을 클릭하면 확인할 수 있습니다.
  5. endpoint 입력 후 Execute 버튼을 클릭합니다. 작업이 성공하였다면 아래 Response에서 발급된 토큰을 확인할 수 있습니다.
  6. 발급된 토큰이 유효한지는 여부는 /auth/token/validate 항목에서 확인할 수 있습니다.

CSI Driver 배포

① 발급받은 토큰으로 Secret을 생성합니다. 아래 Secret 예제의 access-token key의 value에 발급받은 토큰을 입력하고, secret.yml라는 이름으로 저장합니다.

apiVersion: v1
kind: Secret
metadata:
  name: nks-access-token
  namespace: kube-system
stringData:
  access-token: "eyJhbGciO__REPLACE_ME____f9hJtQa4rb7A"

저장한 파일과 kubectl 명령어로 Secret을 생성합니다.

$ kubectl --kubeconfig $KUBE_CONFIG create -f ./secret.yml
secret "nks-access-token" created

Namespace kube-system에 생성된 Secert을 확인할 수 있습니다.

$ kubectl --kubeconfig $KUBE_CONFIG get secrets -n kube-system
NAME                  TYPE                                  DATA      AGE
nks-access-token      Opaque                                1         1m

② CSI 구동을 위한 configmap 생성

다음의 명령어를 통해 kube-system namespace에 ncloud-config 이름을 가지는 configmap을 조회합니다.

$ kubectl --kubeconfig $KUBE_CONFIG get configmap ncloud-config -n kube-system
NAME            DATA   AGE
ncloud-config   9      131m

$ kubectl --kubeconfig $KUBE_CONFIG get configmap ncloud-config -n kube-system -o yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: ncloud-config
  namespace: kube-system
data:
  acgNo: "12345"
  apiUrl: https://nks.apigw.ntruss.com
  basePath: /ncloud-api/v1
  lbSubnetNo: "12345"
  regionCode: FKR
  regionNo: "11"
  vpcNo: "12345"
  zoneNo: "110"

위 명령어의 ncloud-config 이름을 가지는 configmap이 조회되지 않았다면, 아래의 내용을 ncloud-config.yml이름의 파일로 작성합니다.

apiVersion: v1
kind: ConfigMap
metadata:
  name: ncloud-config
  namespace: kube-system
data:
  acgNo: "12345"
  apiUrl: https://nks.apigw.ntruss.com
  basePath: /ncloud-api/v1
  lbSubnetNo: "12345"
  regionCode: FKR
  regionNo: "11"
  vpcNo: "12345"
  zoneNo: "110"
  • data.acgNo: 쿠버네티스 워커 노드의 eth0 인터페이스에 할당된 acg의 instanceID를 입력합니다.
  • data.apiUrl: https://nks.apigw.ntruss.com를 입력합니다.
  • data.basePath: /ncloud-api/v1를 입력합니다.
  • data.lbSubnetNo: 쿠버네티스 워커 노드가 할당된 VPC내 로드밸런서 전용 서브넷의 SubnetID를 입력합니다.
  • data.regionCode: 쿠버네티스 워커 노드가 위치한 리전 코드를 입력합니다. (예: "FKR")
  • data.regionNo: 쿠버네티스 워커 노드의 리전 번호를 입려합니다. (예: "11")
  • data.vpcNo: 쿠버네티스 워커 노드가 할당된 VPC의 VPC ID를 입력합니다.
  • data.zoneNo: 쿠버네티스 워커 노드가 위치한 존 번호를 입력합니다. (예: "110")

일부 필드는 cloud-controller-manager를 위한 값으로 사용됩니다. 아래의 링크에서 관련 내용을 확인할 수 있습니다.
[cloud controller manager]

입력 완료 후, ncloud-config.yml 이름으로 저장합니다. 아래의 명령어를 입력하여 configmap을 생성합니다.

kubectl --kubeconfig $KUBE_CONFIG apply -f ncloud-config.yml

CSI 드라이버 및 Sidecar 배포

  1. CSI 드라이버 및 Sidecar들을 배포합니다. 운영되고 있는 Kubernetes Cluster와 호환되는 버전의 CSI 드라이버를 배포해야 합니다. 호환되는 버전의 목록은 제약 사항에서 확인할 수 있습니다.

k8s 1.16 버전에서 배포

kubernetes 1.16버전은 CSI v1.2와 호환됩니다.

$ kubectl --kubeconfig $KUBE_CONFIG apply -f https://nks.apigw.ntruss.com/static/v1/csi/pub/1.2/latest/csi-nks-driver.yaml

이 파일들은 최신의 안정 버전을 가리킵니다. 설치 과정 중 문제가 생긴 경우 kubectl apply -f 명령을 다시 실행하여 누락된 리소스가 다시 반영되도록 합니다.

""에 대한 건이 검색되었습니다.

    ""에 대한 검색 결과가 없습니다.

    처리중...