NAS 볼륨 CSI 예제

Prev Next

VPC 환경에서 이용 가능합니다.

NAS 볼륨 CSI에서 설명한 CSI 사용법을 바탕으로 다양한 방식을 통해 볼륨을 할당하는 예제입니다.

NAS 볼륨 추가

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

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nas-csi-pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 500Gi
  storageClassName: nks-nas-csi
  • AccessMode: NAS CSI에서는 다양한 AccessMode를 지원합니다.
모드 설명
ReadWriteOnce 하나의 노드에서 볼륨을 읽기-쓰기로 마운트
ReadOnlyMany 여러 노드에서 볼륨을 읽기 전용으로 마운트
ReadWriteMany 여러 노드에서 볼륨을 읽기-쓰기로 마운트
  • Resources: 생성할 스토리지의 크기입니다. 기본값은 500 GB이며, 최소 500 GB부터 최대 10,000 GB 사이에서 100 GB 단위로 Gi를 사용해 입력할 수 있습니다.

Pod에 단일 신규 볼륨 할당

새 NAS 볼륨을 생성하여 마운트하려면 아래 yaml 코드를 사용해 주십시오.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nas-csi-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 500Gi
  storageClassName: nks-nas-csi
---
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: nas-csi-pvc
  • Pod
    • spec.container: volumeMounts에 마운트할 스토리지 이름을 입력한 후 mountPath에 마운트 경로를 입력하십시오.
    • spec.volumes: 컨테이너에 마운트될 스토리지를 정의하기 위해 생성된 PersistentVolumeClaim의 이름을 persistentVolumeClaim.claimName에 입력하십시오.
주의

NAS 볼륨이 Pod에 마운트 된 상태에서 클러스터를 삭제하면 NAS 볼륨은 자동으로 삭제되지 않습니다. 이 경우 네이버 클라우드 플랫폼 콘솔이나 API를 통해 반납해야 합니다.

하나의 NAS 볼륨을 여러 Pod에 마운트해서 사용

하나의 신규 NAS 볼륨을 생성하고 두 개의 Pod에 마운트하여 해당 볼륨을 공유하여 사용하는 예제입니다.

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

이미 생성된 NAS 볼륨을 Pod에 마운트

NAS에서 NFS 프로토콜로 볼륨을 생성합니다.

NAS 볼륨이 생성되면 마운트 정보의 IP 및 PATH 정보를 확인합니다.

이미 생성된 NAS 볼륨를 사용하여 StorageClass을 생성한 후 Pod에 마운트하려면 아래 yaml 코드를 사용해 주십시오.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: static-nks-nas-csi
provisioner: nas.csi.ncloud.com
parameters:
  server: __NAS_IP__
  share: __NAS_PATH__
reclaimPolicy: Retain
volumeBindingMode: WaitForFirstConsumer
mountOptions:
  - hard
  - nolock
  - nfsvers=3
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: static-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 500Gi
  storageClassName: static-nks-nas-csi
---
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: static-pvc
  • kind: StorageClass
    이미 존재하는 NAS 볼륨을 Kubernetes 클러스터에서 사용할 수 있도록 정보를 입력합니다.

    • provisioner: 네이버 클라우드 플랫폼 NAS 볼륨의 Provisioner인 nas.csi.ncloud.com를 입력하십시오.
    • parameters.server: 이미 생성한 NAS 볼륨 마운트 정보의 IP를 입력하십시오.
    • parameters.path: 이미 생성한 NAS 볼륨 마운트 정보의 PATH를 입력하십시오.
    • reclaimPolicy: 사용이 끝난 PVC가 삭제될 때 NAS 볼륨이 삭제되지 않도록 반드시 Retain으로 설정합니다.
  • kind: PersistentVolumeClaim
    생성된 PersistentVolume과 바인딩되는 PersistentVolumeClaim을 생성합니다.

    • resources.storage: 필수 입력 항목으로 이미 생성한 NAS 볼륨의 크기를 입력하십시오. 하지만 PVC의 크기는 NAS 볼륨 크기에 의존하기 때문에 입력하는 값은 의미가 없습니다.
    • storageClassname: NAS 스토리지 클래스 이름인 static-nks-nas-csi를 입력하십시오.
    • volumeName: 생성한 PersistentVolume의 이름을 입력하십시오.
  • kind: Pod
    볼륨 요청인 PersistentVolumeClaim을 지정하여 사용할 볼륨을 마운트합니다.

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

반납보호 설정이 되어있는 NAS 볼륨의 경우, PersistentVolumeClaim은 삭제되지만 실제 볼륨은 유지됩니다.
실제 NAS볼륨은 NAS 콘솔에서 삭제 가능합니다.

볼륨 리사이징

네이버 클라우드 플랫폼의 NAS 볼륨은 이미 생성되어 있는 볼륨에 대한 리사이징 기능을 제공합니다.

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

  1. 아래 yaml 코드를 사용하여 500 GB 크기의 신규 블록 스토리지 볼륨 생성을 요청해 주십시오.
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: csi-deployment-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 500Gi
  storageClassName: nks-nas-csi
---
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
  1. 아래 명령어를 실행하여 PersistentVolumeClaim의 Volume Request 크기를 500 GB에서 600 GB로 조정해 주십시오.
kubectl --kubeconfig $KUBE_CONFIG patch pvc csi-deployment-pvc -p '{"spec":{"resources":{"requests":{"storage":"600Gi"}}}}'

reclaimPolicy가 Retain인 StorageClass 사용

reclaimPolicy가 Retain인 StorageClass는 연관 리소스가 삭제되더라도 실제 스토리지 자원이 보존되는 특징이 있어 데이터 유실을 방지하고, 수동으로 데이터를 관리하거나 복구할 수 있는 유연성을 제공합니다. StorageClass는 생성 후 설정 변경이 어렵기 때문에, 설정 변경이 필요할 경우 기존 StorageClass를 수정하는 대신 신규 StorageClass를 생성하여 사용해야 합니다. Retain 정책을 사용할 경우 삭제된 PV와 연결된 스토리지 자원을 수동으로 관리하고 정리해야 합니다.

아래 예시로 사용된 yaml 코드를 통해 reclaimPolicy가 Retain인 StorageClass를 사용할 수 있습니다.

allowVolumeExpansion: true
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nks-nas-csi-retain
mountOptions:
- hard
- nolock
- nfsvers=3
provisioner: nas.csi.ncloud.com
reclaimPolicy: Retain 
volumeBindingMode: WaitForFirstConsumer

Zone 번호가 명시된 StorageClass 사용

주의

Zone 번호가 명시된 StorageClass는 NAS CSI 버전 2.0.1 이상부터 사용 가능합니다.

NAS CSI 드라이버는 Kubernetes와 동일한 Zone에 NAS 볼륨을 생성합니다. 하지만 StorageClass에 zoneNo를 명시하여 동일 Region의 특정 Zone에 NAS 볼륨을 생성할 수 있습니다. 아래 예시로 사용된 yaml 코드를 통해 ZoneNo를 지정하여 NAS 볼륨을 생성할 수 있습니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nks-nas-csi-kr-2
mountOptions:
- hard
- nolock
- nfsvers=3
provisioner: nas.csi.ncloud.com
parameters:
  zoneNo: "3"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nas-csi-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 500Gi
  storageClassName: nks-nas-csi-kr-2
---
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: nas-csi-pvc
  • kind: StorageClass
    • parameters.zoneNo: NAS 볼륨이 생성될 ZoneNo 입력
      Region Zone ZoneNo
      한국 KR-1 2
      한국 KR-2 3
      싱가포르 SGN-4 74
      싱가포르 SGN-5 75
      일본 JPN-4 84
      일본 JPN-5 85

암호화가 적용 된 NAS 볼륨을 위한 StorageClass 사용

주의

암호화가 적용된 NAS 볼륨을 위한 StorageClass는 NAS CSI 버전 2.0.2 이상부터 사용 가능합니다.

NAS CSI 드라이버는 기본적으로 볼륨 암호화가 적용되지 않은 NAS 볼륨을 생성합니다. 하지만 StorageClass에 encryption을 명시하여 볼륨 암호화가 적용된 NAS 볼륨을 생성할 수 있습니다. 아래 예시로 사용된 yaml 코드를 통해 볼륨 암호화가 적용된 NAS 볼륨을 생성할 수 있습니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nks-nas-csi-encryption
mountOptions:
- hard
- nolock
- nfsvers=3
provisioner: nas.csi.ncloud.com
parameters:
  encryption: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nas-csi-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 500Gi
  storageClassName: nks-nas-csi-encryption
---
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: nas-csi-pvc

PersistentVolumeClaim 제거

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

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

  • PVC 조회
$ kubectl --kubeconfig $KUBE_CONFIG get pvc
  • PVC 삭제
$ kubectl --kubeconfig $KUBE_CONFIG delete pvc static-pvc

NAS를 파드에서 바로 접근하기

만약 NAS-CSI를 통하지 않고 NAS에 직접 접근하고자 하는 경우, 아래와 같이 NFS를 사용하여 파드에서 NAS를 직접 마운트할 수 있습니다. 아래 예시에서는 nfs 볼륨 타입을 사용하여 NAS 서버를 직접 마운트합니다. server 필드에 NAS의 IP 주소를, path 필드에 NAS의 경로를 입력하여 사용합니다. volumeMounts를 통해 컨테이너 내부에서 사용할 경로를 지정할 수 있습니다.

주의

NAS-CSI 를 사용하지 않으므로 NAS ACL을 수동으로 등록해야 합니다.

kind: Deployment
metadata:
  name: my-csi-app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: my-csi-app 
  template:
    metadata:
      labels:
        app: my-csi-app
    spec:
      containers:
      - name: my-csi-app 
        image: nginx 
        volumeMounts:
        - name: web
          mountPath: /web
        - name: was
          mountPath: /was
      volumes:
      - name: web
        nfs:
          server: __NAS_IP__
          path: __NAS_PATH__/web
          readOnly: false
      - name: was
        nfs:
          server: __NAS_IP__
          path: __NAS_PATH__/was 
          readOnly: false

SubDir를 사용한 NAS 볼륨 공유 [NAS CSI v2.2.0+]

하나의 NAS 볼륨 내에 서브디렉터리를 생성하여, 여러 PVC가 동일한 NAS 볼륨을 공유할 수 있습니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nks-nas-csi-subdir
mountOptions:
- hard
- nolock
- nfsvers=3
provisioner: nas.csi.ncloud.com
parameters:
  csi.storage.k8s.io/provisioner-secret-name: mount-options
  csi.storage.k8s.io/provisioner-secret-namespace: kube-system
  server: __NAS_IP__
  share: __NAS_PATH__
  subDir: my-app-data
  deleteOnlySubdir: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nas-csi-subdir-pvc
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 500Gi
  storageClassName: nks-nas-csi-subdir
---
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: nas-csi-subdir-pvc
  • parameters.subDir: 생성할 서브디렉터리 이름을 입력합니다.
  • parameters.deleteOnlySubdir: "true"로 설정하면 PVC 삭제 시 서브디렉터리만 삭제되고 NAS 볼륨은 보존됩니다.
주의

parameters.subDir 값에 # 문자는 사용할 수 없습니다.

참고

parameters.deleteOnlySubdir은 reclaimPolicy가 Delete 인 경우에만 유효합니다.
NAS 볼륨과 서브디렉터리를 모두 유지하려면 StorageClass의 reclaimPolicy를 Retain으로 설정하세요.

PVC/PV 메타데이터를 활용한 동적 SubDir 생성 [NAS CSI v2.2.0+]

parameters.subDir 파라미터에 메타데이터 치환 패턴을 사용하면, PVC/PV 정보를 기반으로 서브디렉터리를 동적으로 생성할 수 있습니다.
이를 통해 네임스페이스와 PVC 이름 기반의 자동 디렉터리 구조를 만들 수 있습니다.

사용 가능한 치환 패턴

패턴 설명
${pvc.metadata.name} PVC 이름으로 치환
${pvc.metadata.namespace} PVC 네임스페이스로 치환
${pv.metadata.name} PV 이름으로 치환

아래 예제에서 PVC 이름이 app-data이고 네임스페이스가 production이면, 서브디렉터리는 production-app-data로 자동 생성됩니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nks-nas-csi-dynamic-subdir
mountOptions:
- hard
- nolock
- nfsvers=3
provisioner: nas.csi.ncloud.com
parameters:
  csi.storage.k8s.io/provisioner-secret-name: mount-options
  csi.storage.k8s.io/provisioner-secret-namespace: kube-system
  server: __NAS_IP__
  share: __NAS_PATH__
  subDir: ${pvc.metadata.namespace}-${pvc.metadata.name}
  deleteOnlySubdir: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: app-data
  namespace: production
spec:
  accessModes:
  - ReadWriteMany
  resources:
    requests:
      storage: 500Gi
  storageClassName: nks-nas-csi-dynamic-subdir
---
kind: Pod
apiVersion: v1
metadata:
  name: my-csi-app
  namespace: production
spec:
  containers:
    - name: my-frontend
      image: busybox
      volumeMounts:
      - mountPath: "/data"
        name: my-volume
      command: [ "sleep", "1000000" ]
  volumes:
    - name: my-volume
      persistentVolumeClaim:
        claimName: app-data
참고

메타데이터 치환은 볼륨 생성 시점에 한 번 수행됩니다. 이후 PVC 이름이나 네임스페이스가 변경되더라도 서브디렉터리 이름은 변경되지 않습니다.

동적 프로비저닝에서 SubDir 사용 [NAS CSI v2.2.0+]

NAS 볼륨을 동적으로 프로비저닝하면서 서브디렉터리를 지정할 수 있습니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nks-nas-csi-dynamic-subdir
mountOptions:
- hard
- nolock
- nfsvers=3
provisioner: nas.csi.ncloud.com
parameters:
  csi.storage.k8s.io/provisioner-secret-name: mount-options
  csi.storage.k8s.io/provisioner-secret-namespace: kube-system
  subDir: ${pvc.metadata.namespace}-${pvc.metadata.name}
  deleteOnlySubdir: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

정적 프로비저닝에서 용도별 SubDir 분리 [NAS CSI v2.2.0+]

이미 생성된 NAS 볼륨에 여러 서브디렉터리를 만들어 용도별로 분리할 수 있습니다.
StorageClass의 servershare에 동일한 NAS 볼륨 정보를 입력하고, parameters.subDir 값을 다르게 설정한 StorageClass를 각각 생성합니다.

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nks-nas-csi-subdir-logs
mountOptions:
- hard
- nolock
- nfsvers=3
provisioner: nas.csi.ncloud.com
parameters:
  csi.storage.k8s.io/provisioner-secret-name: mount-options
  csi.storage.k8s.io/provisioner-secret-namespace: kube-system
  server: __NAS_IP__
  share: __NAS_PATH__
  subDir: logs
  deleteOnlySubdir: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: nks-nas-csi-subdir-config
mountOptions:
- hard
- nolock
- nfsvers=3
provisioner: nas.csi.ncloud.com
parameters:
  csi.storage.k8s.io/provisioner-secret-name: mount-options
  csi.storage.k8s.io/provisioner-secret-namespace: kube-system
  server: __NAS_IP__
  share: __NAS_PATH__
  subDir: config
  deleteOnlySubdir: "true"
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
allowVolumeExpansion: true

각 PVC에서 해당 StorageClass를 지정하면, 동일한 NAS 볼륨 안에 logs와 config 서브디렉터리가 생성됩니다.