最新のコンテンツが反映されていません。早急にアップデート内容をご提供できるよう努めております。最新のコンテンツ内容は韓国語ページをご参照ください。
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を使用して入力できます。
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容量のブロックストレージボリュームを例に挙げて説明します。
-
以下の 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: 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 -
以下のコマンドを実行して Replicaの数を1に復元します。
$ kubectl --kubeconfig $KUBE_CONFIG scale --replicas=1 deployment/my-csi-app -
(任意) 以下のコマンドを実行して Podの STATUSが Runningに正常に変更されているか確認します。
$ kubectl --kubeconfig $KUBE_CONFIG get po
ボリュームリサイズ(KVM)
NAVERクラウドプラットフォームの KVMブロックストレージは、既に作成済みのボリュームに対するオンラインリサイズ機能を提供します。
ブロックストレージのボリュームをリサイズする方法は、次の通りです。以下の説明では、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 -
以下のコマンドを実行して PersistentVolumeClaimの Volume Request容量を10GBから20GBに調整します。
kubectl --kubeconfig $KUBE_CONFIG patch pvc csi-deployment-pvc -p '{"spec" :{"resources" :{"requests" :{"storage" :"20Gi" }}}}' -
(任意) 以下のコマンドを実行して 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)です。詳細は、以下のリンクをご参照ください。
作成済みのボリュームスナップショットの確認
作成済みのボリュームスナップショットを確認するには、以下のコマンドを実行します。
$ 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の名前を入力します。