- 印刷する
- PDF
ブロックストレージCSI
- 印刷する
- PDF
VPC環境で利用できます。
実行中のコンテナにファイルを新たに追加する場合、それらファイルはプロセスが終了するか、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でブロックストレージが作成されます。 割り当て可能な最小容量と最大容量は以下のとおりです。
- 最小: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
です。
モード | 説明 |
---|---|
Immediate | PVCが作成される時点に動作 |
WaitForFirstConsumer | Podが作成される時点に動作 |
reclaimPolicy
:使用が終わったPVCが削除される際に、使用中であったPersistentVolume
を再確保または削除するようにポリシーを設定できます。 デフォルト値はDelete
です。
ポリシー | 説明 |
---|---|
Retain | PVCが削除される際に使用中のPVは再使用できる状態に変更され、ストレージ内部のデータを維持 |
Delete | PVCが削除される際に使用中PVを一緒に削除し、ブロックストレージを返却 |
allowVolumeExpansion
:値をtrue
に設定してPersistentVolumeClaim
を拡張することができます。parameters.type:
:ブロックストレージのタイプをSSD
とHDD
の中から選択できます。 デフォルト値は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.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-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
は削除されますが、実際のボリュームは保持されます。
実際のボリュームはNaverクラウドプラットフォームコンソールで削除できます。
ボリュームのリサイズ
NAVERクラウドプラットフォームのブロックストレージは、既に作成済みのボリュームに対するオフラインリサイズ機能を提供します。
ボリュームをリサイズする際に、実行中のPodのControllerでReplicaの数を0に調整する過程でアプリケーションの実行が一時的に停止されることがあります。 こういった停止を避けるには、リサイズが要らないように、最初にボリュームを作成する際に十分な容量に設定することをお勧めします。
ブロックストレージのボリュームをリサイズする方法は以下のとおりです。 以下では、10GB容量のブロックストレージボリュームを例に挙げて説明します。
以下の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
以下のコマンドを実行してReplicaの数を0に調整します。
$ kubectl --kubeconfig $KUBE_CONFIG scale --replicas=0 deployment/my-csi-app
以下のコマンドを実行して
PersistentVolumeClaim
のVolume Request容量を10GBから20GBに調整します。kubectl --kubeconfig $KUBE_CONFIG patch pvc csi-deployment-pvc -p '{"spec":{"resources":{"requests":{"storage":"20Gi"}}}}'
以下のコマンドを実行して、
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
以下のコマンドを実行してReplicaの数を1にして元に戻します。
$ kubectl --kubeconfig $KUBE_CONFIG scale --replicas=1 deployment/my-csi-app
(任意) 以下のコマンドを実行して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)です。 詳しい内容は以下のリンクをご参照ください。
作成されたボリュームスナップショットの確認
作成されたボリュームスナップショットを確認するには、以下のコマンドを実行してください。
$ 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
の名前を入力します。