블록 스토리지 CSI 예제

Prev Next

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

블록 스토리지 CSI에서 설명한 CSI 사용법을 바탕으로 다양한 방식으로 볼륨을 할당하는 예제입니다.

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을 생성하여 신규 볼륨 생성을 요청할 때, Deployment의 template에서 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을 자동으로 생성하는 예제는 다음과 같습니다.

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

특정 Zone에 볼륨 할당

주의

allowedTopologies는 Kubernetes 1.33 버전 이상에서 사용할 수 있습니다.

StorageClass의 allowedTopologies 설정을 통해 Multi-Zone 클러스터 환경에서 볼륨이 생성될 Zone을 제한할 수 있습니다. 다음 예시로 사용된 yaml 코드를 통해 허용할 Zone을 지정하여 블록 스토리지 볼륨을 생성할 수 있습니다.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: nks-block-storage-zone
provisioner: blk.csi.ncloud.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: true
parameters:
  type: CB1
allowedTopologies:
  - matchLabelExpressions:
    - key: topology.kubernetes.io/zone
      values:
        - "2"
        - "3"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: block-csi-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  storageClassName: nks-block-storage-zone
---
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: block-csi-pvc
필드 설명
allowedTopologies.matchLabelExpressions.key topology.kubernetes.io/zone 입력
allowedTopologies.matchLabelExpressions.values 볼륨 생성을 허용할 Zone 번호 입력(여러 Zone 지정 가능)

클러스터에서 사용 가능한 Zone 번호를 확인하려면 다음 명령어를 실행해 주십시오.

kubectl get nodes -L topology.kubernetes.io/zone
참고

volumeBindingMode가 WaitForFirstConsumer인 경우 Pod가 스케줄링된 노드의 Zone이 allowedTopologies에 포함돼 있어야 합니다. 해당 Zone에 노드가 없으면 Pod가 Pending 상태로 대기할 수 있습니다.

XFS 파일 시스템 타입으로 PersistentVolume 이용

참고

XFS 파일 시스템은 Kubernetes 1.33 버전 이상에서 사용할 수 있습니다.

네이버 클라우드 플랫폼은 NAVIX 환경에서 XFS 파일 시스템 사용을 권장합니다. 다음 예시의 StorageClass로 XFS 타입 파일 시스템 볼륨을 생성할 수 있습니다.

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:
  name: nks-block-storage-xfs
provisioner: blk.csi.ncloud.com
volumeBindingMode: WaitForFirstConsumer
reclaimPolicy: Delete
allowVolumeExpansion: true
parameters:
  type: CB1
  csi.storage.k8s.io/fstype: xfs
mountOptions:
- nouuid
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: block-csi-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 20Gi
  storageClassName: nks-block-storage-xfs
---
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: block-csi-pvc
필드 설명
parameters.csi.storage.k8s.io/fstype XFS 입력
mountOptions 마운트 옵션 지정. XFS 파일 시스템은 nouuid 옵션을 사용하여 UUID 중복 문제 예방