ブロックストレージCSI
    • PDF

    ブロックストレージCSI

    • PDF

    Article Summary

    VPC環境で利用できます。

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

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

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

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

    サポートされるバージョン

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

    Ncloud CSI Driver\Kubernetes Version1.161.17+
    v1.2.xサポート未サポート
    v2.1.x未サポートサポート

    Kubernetesバージョンでサポートするストレージサービスは以下のとおりです。

    Service\Kubernetes Version1.16+
    ボリュームの作成サポート
    ボリュームの削除サポート
    ボリュームの拡張(リサイズ)サポート
    サーバにボリュームを割り当てサポート
    サーバからボリュームを解除サポート
    スナップショットの作成サポート
    スナップショットの削除サポート

    割り当て可能な容量

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

    • 最小:10GB
    • 最大:2,000GB

    CSIドライバーの詳細

    Storage Class

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

    ブロックストレージのストレージクラスオブジェクトを確認するには、名前空間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:基本ストレージクラスの場合、trueです。 trueではない他の値を入力するか、アノテーションがない場合、falseです。
    • volumeBindingMode:ボリュームバインディングと動的プロビジョニングが動作する時点を設定できます。 デフォルト値はImmediateです。
    モード説明
    ImmediatePVCが作成される時点に動作
    WaitForFirstConsumerPodが作成される時点に動作
    • reclaimPolicy:使用が終わったPVCが削除される際に、使用中であったPersistentVolumeを再確保または削除するようにポリシーを設定できます。 デフォルト値はDeleteです。
    ポリシー説明
    RetainPVCが削除される際に使用中のPVは再使用できる状態に変更され、ストレージ内部のデータを維持
    DeletePVCが削除される際に使用中PVを一緒に削除し、ブロックストレージを返却
    • allowVolumeExpansion:値をtrueに設定してPersistentVolumeClaimを拡張することができます。
    • parameters.type::ブロックストレージのタイプをSSDHDDの中から選択できます。 デフォルト値はSSDです。
    参考情報

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

    基本ストレージクラスの変更

    作成されたStorageClassオブジェクトの基本ストレージクラス内容を変更するには、Changing the default StorageClassをご参照ください。

    CSI Controller

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

    CSI Controllerを確認するには、以下のコマンドを通じて名前空間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から最大2,000GBの間で10GB単位で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.containervolumeMountsにマウントするストレージ名を入力し、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-storageを入力します。
      • capacity.storage:既に存在するブロックストレージの容量を入力します。
      • accessModesReadWriteOnceと入力します。
      • 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クラウドプラットフォームコンソールで削除できます。

    ボリュームのリサイズ

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

    注意事項

    ボリュームをリサイズする際に、実行中の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: 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の名前を入力します。

    この記事は役に立ちましたか?

    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.