ブロックストレージ CSI

Prev Next

最新のコンテンツが反映されていません。早急にアップデート内容をご提供できるよう努めております。最新のコンテンツ内容は韓国語ページをご参照ください。

VPC環境で利用できます。

参考

使用するクラスタノードのハイパーバイザの種類に応じて XENまたは KVMのブロックストレージを提供します。
各ストレージに関する情報とパフォーマンスは、ブロックストレージの概要で確認できます。

実行中のコンテナにファイルを新たに追加する場合、それらファイルはプロセスが終了するか、Kubernetes Liveness Probeのステータスチェックに失敗してコンテナが再起動する際にすべて削除されます。このとき、ブロックストレージを使用して新たに追加されたファイルが、プロセスの終了またはコンテナの再起動の後にも維持されるように設定できます。

Kubernetesブロックストレージは、コンテナをリリースする際に PersistentVolumeClaim(PVC)を作成して追加できます。

NAVERクラウドプラットフォームの Ncloud Kubernetes Serviceは、ボリュームドライバとして Container Storage Interface(CSI)を提供します。このドライバは Kubernetesと連携してブロックストレージの作成、削除、リサイズなどの操作をサポートします。

サポートするバージョンと容量

サポートするバージョン

NAVERクラウドプラットフォームで提供する CSIバージョンと互換 Kubernetesバージョンは、次の通りです。

Ncloud CSI Driver\Kubernetes Version 1.16 1.17+
v1.2.x サポート サポートしない
v2.1.x サポートしない サポート

Kubernetesバージョンでサポートするストレージサービスは、次の通りです。

Service\Kubernetes Version 1.16+
ボリューム作成 サポート
ボリューム削除 サポート
ボリューム拡張(リサイズ) サポート
サーバにボリューム割り当て サポート
サーバにボリューム解除 サポート
スナップショット作成 サポート
スナップショット削除 サポート

割り当て可能な容量

Kubernetesブロックストレージは CSIを通じて10GB単位で容量を割り当てられます。ボリュームの容量を別途定義しない場合、デフォルト値の20GBでブロックストレージを作成します。割り当て可能な最小容量と最大容量は、次の通りです。

XEN KVM
最小 10 GB 10GB
最大 2 TB 16 TB

CSIドライバの詳細

Storage Class

Storage Classとは、各ストレージのポリシーとタイプを設定したオブジェクトです。NAVERクラウドプラットフォームでは、ブロックストレージを使用するデフォルト Storage Classを提供します。

ブロックストレージ内の Storage Classを確認するには、名前空間 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です。
モード 説明
Immediate PVCが作成される時点に動作
WaitForFirstConsumer Podが作成される時点に動作
  • reclaimPolicy: 使用が終わった PVCを削除する際に、使用中であった PersistentVolumeを再確保または削除するようにポリシーを設定します。デフォルト値は Deleteです。
ポリシー 説明
Retain PVCを削除する際に使用中であった PVは再使用できるステータスに変更され、ブロックストレージ内部のデータを維持
Delete PVCを削除する際に使用中であった PVを一緒に削除し、ブロックストレージを返却
参考

Retainポリシーを通じて再確保したブロックストレージは、NAVERクラウドプラットフォームコンソールや APIを通じて返却できます。

  • allowVolumeExpansion: 値を trueに設定して PersistentVolumeClaimを拡張できます。
  • parameters.type:: ブロックストレージのタイプを設定できます。
ハイパーバイザ 使用できるブロックストレージのタイプ
XEN SSD(Default), HDD
KVM CB1(Default), FB1, CB2, FB2
参考

CB2/FB2タイプのブロックストレージは、Kubernetes Version 1.30以上から使用できます。

Default Storage Class変更

作成した StorageClassオブジェクトのデフォルト Storage Classの内容を変更するには、Changing the default StorageClassをご参照ください。

CSI Controller

CSI Controllerとは、ボリュームの作成、削除、割り当て、割り当て解除、スナップショットなどの各種制御と管理を担当するインターフェースです。

CSI Controllerを確認するには、以下のコマンドを通じて Namespace kube-system 内の Deploymentオブジェクトを確認します。

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

CSI Node

CSIノードは、Kubernetesのワーカーノードごとに1つずつ動作するノードであり、ボリュームのフォーマット、マウント、アンマウントなどの動作を担当します。

CSI Nodeを確認するには、以下のコマンドを通じて名前空間 kube-system内の DaemonSetリソースを確認します。

$ 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: NAVERクラウドプラットフォームでは ReadWriteOnceモードのみサポートします。シングルノードがボリュームに対して読み取り/書き込みを実行できるようにマウントします。
  • Resources: 作成するストレージの容量です。デフォルト値は20GBであり、最小10GBから最大2000GBの間で、10GB単位で Giを使用して入力できます。
参考

ストレージ容量とサーバ仕様に応じて IOPSと異なるスループットが適用されます。詳細は、ストレージ仕様サーバ仕様をご参照ください。

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: NAVERクラウドプラットフォームのストレージクラスの nks-block-storagを入力します。
    • 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は削除しますが、実際のボリュームは保持します。
実際のボリュームは NAVERクラウドプラットフォームコンソールで削除可能です。

ボリュームリサイズ(XEN)

NAVERクラウドプラットフォームの XENブロックストレージは、既に作成済みのボリュームに対するリサイズ機能を提供します。

注意

ボリュームリサイズを行う際に、運用中の Podの Controllerで Replicaの数を0に調整するプロセスでアプリケーションの運用が一時的に停止する場合があります。これを防ぐため、初めてボリュームを作成するときに十分なサイズを設定し、リサイズが不要になるよう設定することをお勧めします。

ブロックストレージのボリュームをリサイズする方法は、次の通りです。以下の説明では、10GB容量のブロックストレージボリュームを例に挙げて説明します。

  1. 以下の yamlコードを使用して10GB容量の新規ブロックストレージボリュームの作成をリクエストします。

    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容量を10GBから20GBに調整します。

    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: 20Gi
      storageClassName: nks-block-storage
      volumeName: pvc-xxx
    status:
      capacity:
        storage: 10G
      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
    

ボリュームリサイズ(KVM)

NAVERクラウドプラットフォームの KVMブロックストレージは、既に作成済みのボリュームに対するオンラインリサイズ機能を提供します。

ブロックストレージのボリュームをリサイズする方法は、次の通りです。以下の説明では、10GB容量のブロックストレージボリュームを例に挙げて説明します。

  1. 以下の yamlコードを使用して10GB容量の新規ブロックストレージボリュームの作成をリクエストします。

    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. 以下のコマンドを実行して PersistentVolumeClaimの Volume Request容量を10GBから20GBに調整します。

    kubectl --kubeconfig $KUBE_CONFIG patch pvc csi-deployment-pvc -p '{"spec" :{"resources" :{"requests" :{"storage" :"20Gi" }}}}'
    
  3. (任意) 以下のコマンドを実行して PersistentVolumeClaim容量が20GBに変更されているか確認します。

    $ kubectl --kubeconfig $KUBE_CONFIG describe pvc csi-deployment-pvc
    

スナップショットの作成とボリュームの復旧

ボリュームスナップショット作成

注意

nks v1.33からは Snapshot v1をサポートし、v1beta1は deprecatedする予定です。v1.33以前バージョンでは v1beta1(snapshot.storage.k8s.io/v1beta1)を使用します。

PersistentVolumeのスナップショットを作成するには、以下のコマンドを実行します。

apiVersion: snapshot.storage.k8s.io/v1
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

作成済みのボリュームスナップショットからボリューム復旧

ボリュームスナップショットを用いてボリューム作成をリクエストする方式で、ボリュームを復旧できます。

ボリュームスナップショットを用いてボリュームを復旧するには、以下の yamコードを使用します。

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の名前を入力します。