블록 스토리지 CSI
    • PDF

    블록 스토리지 CSI

    • PDF

    기사 요약

    구동 중인 컨테이너에 파일을 새로 추가할 경우, 해당 파일들은 프로세스가 종료되거나 Kubernetes Liveness Probe의 상태 체크에 실패하여 컨테이너가 재시작될 때 모두 삭제됩니다. 이 때 블록 스토리지를 사용하여 새로 추가된 파일들이 프로세스 종료 또는 컨테이너 재시작 후에도 유지되도록 설정할 수 있습니다.

    Kubernetes 블록 스토리지는 컨테이너를 배포할 때 PersistentVolumeClaim(PVC)를 생성하여 추가할 수 있습니다.

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

    지원되는 버전 및 용량

    지원되는 버전

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

    Ncloud CSI Driver\Kubernetes Version1.161.17+
    v1.2.x지원미지원
    v2.1.x미지원지원

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

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

    할당 가능한 용량

    Kubernetes 블록 스토리지는 CSI를 통해 10 GB 단위로 용량을 할당할 수 있습니다. 볼륨 크기를 별도로 정의하지 않는 경우 기본값인 20 GB로 블록 스토리지가 생성됩니다. 할당 가능한 최소 용량과 최대 용량은 다음과 같습니다.

    • 최소: 10 GB
    • 최대: 2,000 GB

    CSI 드라이버 상세 사항

    Storage Class

    Storage Class는 각 스토리지의 정책과 타입을 설정한 오브젝트입니다. 네이버 클라우드 플랫폼에서는 블록 스토리지를 사용하는 기본 Storage Class를 제공합니다.

    블록 스토리지의 Storage Class 오브젝트를 확인하려면 Namespace kube-system 내의 StorageClass 중 nks-block-storage 이름을 가진 오브젝트를 확인해 주십시오. 아래와 같이 표시됩니다.

    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
    
    • Annotations: storageclass.kubernetes.io/is-default-class: 기본 Storage Class일 경우 true 값을 가집니다. true가 아닌 다른 값을 입력하거나 어노테이션이 없는 경우 false 값을 가집니다.
    • volumeBindingMode: 볼륨 바인딩과 동적 프로비저닝이 동작하는 시점을 설정할 수 있습니다. 기본값은 Immediate입니다.
    모드설명
    ImmediatePVC가 생성되는 시점에 동작
    WaitForFirstConsumerPod가 생성되는 시점에 동작
    • reclaimPolicy: 사용이 끝난 PVC가 삭제될 때 사용 중이던 PersistentVolume을 재확보 또는 삭제하도록 정책을 설정할 수 있습니다. 기본값은 Delete입니다.
    정책설명
    RetainPVC가 삭제될 때 사용 중인 PV는 재사용이 가능한 상태로 변경되며, 블록 스토리지 내부 데이터를 유지
    DeletePVC가 삭제될 때 사용 중인 PV를 함께 삭제하며, 블록 스토리지를 반납
    • allowVolumeExpansion: 값을 true로 설정하여 PersistentVolumeClaim을 확장할 수 있습니다.
    • parameters.type:: 블록 스토리지의 타입을 SSDHDD 중에서 선택할 수 있습니다. 기본값은 SSD입니다.
    참고

    Retain 정책을 통해 재확보한 블록 스토리지는 네이버 클라우드 플랫폼 콘솔이나 API를 통해 반납할 수 있습니다.

    Default Storage Class 변경

    생성된 StorageClass 오브젝트의 기본 Storage Class 내용을 변경하려면 Changing the default StorageClass를 참조해 주십시오.

    CSI Controller

    CSI Controller는 볼륨의 생성, 삭제, 할당, 할당 해제, 스냅샷 등 각종 제어와 관리를 담당하는 인터페이스입니다.

    CSI Controller를 확인하려면 아래 명령어를 통해 Namespace kube-system 내의 StatefulSet 오브젝트를 확인해 주십시오.

    $ kubectl --kubeconfig $KUBE_CONFIG get statefulset -n kube-system
    

    CSI Node

    CSI 노드는 Kubernetes의 워커 노드마다 하나씩 동작하는 노드로, 볼륨의 포맷, 마운트, 언마운트 등의 동작을 담당합니다.

    CSI Node를 확인하려면 아래 명령어를 통해 Namespace kube-system 내의 DdaemonSet 리소스를 확인해 주십시오.

    $ kubectl --kubeconfig $KUBE_CONFIG get daemonset -n kube-system
    

    CSI 드라이버 사용

    블록 스토리지 추가

    CSI 드라이버를 통해 블록 스토리지를 추가하려면 아래 yaml 코드를 통해 PersistentVolumeClaim(PVC)을 요청해 주십시오. CSI 드라이버가 해당 PVC를 확인하여 필요한 PersistentVolume(PV)를 자동으로 생성합니다.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: csi-pod-pvc
    spec:
      accessModes:
      - ReadWriteOnce
      resources:
        requests:
          storage: 10Gi
      storageClassName: nks-block-storage
    
    • AccessMode: 네이버 클라우드 플랫폼에서는 ReadWriteOnce 모드만 지원됩니다. 단일 노드가 볼륨에 대해 읽기/쓰기 작업을 수행할 수 있도록 마운트합니다.
    • Resources: 생성할 스토리지의 크기입니다. 기본값은 20 GB이며, 최소 10 GB부터 최대 2,000 GB 사이에서 10 GB 단위로 Gi를 사용해 입력할 수 있습니다.

    Pod에 단일 신규 볼륨 할당

    새 블록 스토리지를 생성하여 마운트하려면 아래 yaml 코드를 사용해 주십시오.

    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
      • spec.container: volumeMounts에 마운트할 스토리지 이름을 입력한 후 mountPath에 마운트 경로를 입력하십시오.
      • spec.volumes: 컨테이너에 마운트될 스토리지를 정의하기 위해 생성된 PersistentVolumeClaim의 이름을 persistentVolumeClaim.claimName에 입력하십시오.

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

    이미 생성된 블록 스토리지가 있을 경우, 해당 스토리지를 사용하여 PersistentVolume을 생성한 후 마운트할 수 있습니다.

    이미 생성된 블록 스토리지를 사용하여 PersistentVolume을 생성한 후 Pod에 마운트하려면 아래 yaml 코드를 사용해 주십시오.

    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
    
    • kind: PersistentVolume
      이미 존재하는 블랙 스토리지를 Kubernetes 클러스터에서 사용할 수 있도록 정보를 입력합니다.

      • storageClassname: 네이버 클라우드 플랫폼의 스토리지 클래스인 nks-block-storage를 입력하십시오.
      • capacity.storage: 이미 존재하는 블록 스토리지의 크기를 입력하십시오.
      • accessModes: ReadWriteOnce를 입력하십시오.
      • csi.driver: 스토리지 클래스 드라이버 이름인 blk.csi.ncloud.com을 입력하십시오.
      • csi.volumeHandle: 생성되어 있는 블록 스토리지의 인스턴스 ID를 입력하십시오.
      • csi.volumeAttributes: 포맷을 진행하지 않고 기존에 저장된 내용을 유지한 상태로 마운트하도록 blk.csi.ncloud.com/noformat: "true"를 입력하십시오.

    • kind: PersistentVolumeClaim
      생성된 PersistentVolume과 바인딩되는 PersistentVolumeClaim을 생성합니다.

      • resources.storage: 이미 존재하는 블록 스토리지의 크기를 입력하십시오.
      • storageClassname: 블록 스토리지 클래스 이름인 nks-block-storage를 입력하십시오.
      • volumeName: 생성한 PersistentVolume의 이름을 입력하십시오.
    • kind: Pod
      볼륨 요청인 PersistentVolumeClaim을 지정하여 사용할 볼륨을 마운트합니다.

      • volumes.persistentVolumeClaim.claimName: 지정할 PersistentVolumeClaim의 이름을 입력합니다.

    PersistentVolumeClaim 제거

    Kubernetes의 PersistentVolumeClaim은 Deployment, StatefulSet, ReplicaSet, Pod 등 요청된 리소스를 삭제하더라도 함께 삭제되지 않으므로, 삭제하려면 별도의 명령어가 필요합니다.

    PersistentVolumeClaim을 확인한 후 제거하려면 다음 명령어를 각각 사용해 주십시오.

    • PVC 조회
    $ kubectl --kubeconfig $KUBE_CONFIG get pvc
    
    • PVC 삭제
    $ kubectl --kubeconfig $KUBE_CONFIG delete pvc csi-pod-pvc
    
    주의

    반납보호 설정이 되어있는 볼륨의 경우, PersistentVolumeClaim은 삭제되지만 실제 볼륨은 유지됩니다.
    실제 볼륨은 네이버 클라우드 플랫폼 콘솔에서 삭제할 수 있습니다.

    볼륨 리사이징

    네이버 클라우드 블랫폼의 블록 스토리지는 이미 생성되어 있는 볼륨에 대한 오프라인 리사이징 기능을 제공합니다.

    주의

    볼륨 리사이징을 수행할 때, 운영 중인 Pod의 Controller에서 Replica의 수를 0으로 조정하는 과정에서 애플리케이션의 운영이 일시적으로 중단될 수 있습니다. 이러한 중단을 피하려면 처음 볼륨을 생성할 때 충분한 크기로 설정하여 리사이징이 필요하지 않도록 하는 것을 권장합니다.

    블록 스토리지의 볼륨을 리사이징하는 방법은 다음과 같습니다. 아래 설명에서는 10 GB 크기의 블록 스토리지 볼륨을 예시로 들어 설명합니다.

    1. 아래 yaml 코드를 사용하여 10 GB 크기의 신규 블록 스토리지 볼륨 생성을 요청해 주십시오.

      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
      
    2. 아래 명령어를 실행하여 Replica의 수를 0으로 조정해 주십시오.

      $ kubectl --kubeconfig $KUBE_CONFIG scale --replicas=0 deployment/my-csi-app
      
    3. 아래 명령어를 실행하여 PersistentVolumeClaim의 Volume Request 크기를 10 GB에서 20 GB로 조정해 주십시오.

      kubectl --kubeconfig $KUBE_CONFIG patch pvc csi-deployment-pvc -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
      
    4. 아래 명령어를 실행하여 PersistentVolumeClaim의 Condition이 FileSystemResizePending 상태인지 확인하십시오.

      ~> kubectl get pvc csi-deployment-pvc -o yaml
      apiVersion: v1
      kind: PersistentVolumeClaim
      metadata:
        name: csi-deployment-pvc
        namespace: default
        uid: 02d4aa83-83cd-11e8-909d-42010af00004
      spec:
        accessModes:
        - ReadWriteOnce
        resources:
          requests:
            storage: 14Gi
        storageClassName: standard
        volumeName: pvc-xxx
      status:
        capacity:
          storage: 9G
        conditions:
        - lastProbeTime: null
          lastTransitionTime: 2018-07-11T14:51:10Z
          message: Waiting for user to (re-)start a pod to finish file system resize of
            volume on node.
          status: "True"
          type: FileSystemResizePending
        phase: Bound
      
    5. 아래 명령어를 실행하여 Replica의 수를 1로 원복해 주십시오.

      $ kubectl --kubeconfig $KUBE_CONFIG scale --replicas=1 deployment/my-csi-app
      
    6. (선택) 아래 명령어를 실행하여 Pod의 STATUS가 Running으로 정상 변경되었는지 확인해 주십시오.

      $ kubectl --kubeconfig $KUBE_CONFIG get po
      

    스냅샷 생성 및 볼륨 복구

    볼륨 스냅샷 생성

    PersistentVolume의 스냅샷을 생성하려면 아래 명령어를 실행해 주십시오.

    apiVersion: snapshot.storage.k8s.io/v1beta1
    kind: VolumeSnapshot
    metadata:
      name: csi-nks-test-snapshot
    spec:
      source:
        persistentVolumeClaimName: csi-pod-pvc 
    
    • metadata.name: 생성할 스냅샷의 이름을 입력하십시오.
    • spec.source.persistentVolumeClaimName: 스냅샷을 생성할 PersistentVolume과 바인딩되어 있는 PersistentVolumeClaim의 이름을 입력하십시오.
    참고

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

    Snapshot-Restore-Feature

    생성된 볼륨 스냅샷 확인

    생성된 볼륨 스냅샷을 확인하려면 아래 명령어를 실행해 주십시오.

    $ kubectl --kubeconfig $KUBE_CONFIG get volumesnapshot
    

    생성된 볼륨 스냅샷 삭제

    생성된 볼륨 스냅샷을 확인한 후 삭제하려면 아래 명령어를 실행해 주십시오.

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

    생성된 볼륨 스냅샷으로부터 볼륨 복구

    볼륨 스냅샷을 이용하여 볼륨 생성을 요청하는 방식으로 볼륨을 복구할 수 있습니다.

    볼륨 스냅샷을 이용하여 볼륨을 복구하려면 아래 yaml 코드를 사용해 주십시오.

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: csi-nks-test-pvc-restore
    spec:
      dataSource:
        name: csi-nks-test-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
      • spec.datasource.name: 복구할 볼륨 스냅샷의 이름을 입력하십시오.
      • spec.datasource.kind: 복구할 볼륨 스냅샷의 리소스 이름인 VolumeSnapshot을 입력하십시오.
      • spec.datasource.apiGroup: 스냅샷의 apiGroup인 snapshot.storage.k8s.io를 입력합니다.
      • resources.request.storage: 볼륨 스냅샷의 크기와 동일한 값을 입력하십시오.
    • Pod
      • 'claimName': 요청한 볼륨 정보인 PersistentVolumeClaim의 이름을 입력하십시오.

    이 문서가 도움이 되었습니까?

    What's Next
    Changing your password will log you out immediately. Use the new password to log back in.
    First name must have atleast 2 characters. Numbers and special characters are not allowed.
    Last name must have atleast 1 characters. Numbers and special characters are not allowed.
    Enter a valid email
    Enter a valid password
    Your profile has been successfully updated.