Kubernetes ボリューム スナップショット機能は、GKE クラスタの永続ボリュームと動的プロビジョニングに使用できます。
ボリューム スナップショットを使用すると、特定の時点でのボリュームのコピーを作成できます。このコピーを使用すると、ボリュームを以前の状態に戻すことや、置換用のボリュームをプロビジョニングすることが可能です。
ボリューム スナップショットのプロビジョニングとアタッチは、次のコンポーネントで行うことができます。
要件
GKE on AWS でボリューム スナップショットを使用するには、次のものが必要です。
スナップショットをサポートし Container Storage Interface(CSI)ドライバを使用するボリューム。GKE on AWS が使用する Elastic Block Store(EBS)ドライバは、デフォルトでスナップショットをサポートしています。
スナップショットをサポートするすべての CSI ドライバの一覧については、Kubernetes ドキュメントのドライバにある「その他の機能」の列をご覧ください。
スナップショットに使用する既存の
PersistentVolumeClaim
が必要です。スナップショット ソースに使用するPersistentVolume
は、CSI ドライバによって管理される必要があります。CSI ドライバを使用していることを確認するには、PersistentVolume
仕様のcsi
セクションでdriver: ebs.csi.aws.com
が指定されていることをチェックします。クラスタが、以降のセクションで説明する CSI ドライバで PersistentVolume を動的にプロビジョニングする場合、クラスタは CSI ドライバによって管理されます。
始める前に
ボリューム スナップショットを作成して使用する
このドキュメントの例では、次の作業を行う方法について説明します。
- サンプルの
PersistentVolumeClaim
とPod
を作成する。 - VolumeSnapshot を作成する。
- ボリューム スナップショットを復元する。
- 復元が機能していることを確認する。
ボリューム スナップショットを使用するには、次の手順を完了する必要があります。
VolumeSnapshot
オブジェクトを作成して、既存の PersistentVolumeClaim のスナップショットをリクエストします。PersistentVolumeClaim
内のVolumeSnapshot
を参照して、そのスナップショットにボリュームを復元するか、スナップショットを使用して新しいボリュームを作成します。
サンプルの PersistentVolumeClaim
と Pod
を作成する
PersistentVolumeClaim
オブジェクトを作成するには、次のマニフェストをexample-pvc.yaml
として保存します。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: example-pvc spec: storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
spec.storageClassName
には、サポートされている CSI ドライバを使用するストレージ クラスを指定できます。この例では、デフォルトのstandard-rwo
ストレージ クラスを使用します。次のようにマニフェストを適用します。
kubectl apply -f example-pvc.yaml
現在の日時をボリュームに書き込む Pod を作成します。Pod を作成するには、次のマニフェストを
snapshot-shell.yaml
として保存します。apiVersion: v1 kind: Pod metadata: name: snapshot-shell spec: terminationGracePeriodSeconds: 10 containers: - name: linux image: ubuntu:bionic command: ["/bin/sh"] args: ["-c", "echo $(date -u) >> /data/out.txt"] volumeMounts: - name: snapshot-volume mountPath: /data restartPolicy: Never volumes: - name: snapshot-volume persistentVolumeClaim: claimName: example-pvc
次のようにマニフェストを適用します。
kubectl apply -f snapshot-shell.yaml
Pod のステータスを確認します。
kubectl get pod snapshot-shell
Pod が実行されて完了するまで、しばらく時間がかかることがあります。次のような出力が表示されるまで、上記のコマンドを実行します。
NAME READY STATUS RESTARTS AGE snapshot-shell 0/1 Completed 0 24s
VolumeSnapshot を作成する
VolumeSnapshot
オブジェクトは、既存の PersistentVolumeClaim
オブジェクトのスナップショットのリクエストです。VolumeSnapshot
オブジェクトを作成すると、クラスタはこのオブジェクトを自動的に作成して VolumeSnapshotContent
オブジェクト(PersistentVolume
オブジェクトなどのクラスタ内のリソース)とバインドします。
次のマニフェストを
volumesnapshot.yaml
として保存します。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: example-snapshot spec: source: persistentVolumeClaimName: example-pvc
次のようにマニフェストを適用します。
kubectl apply -f volumesnapshot.yaml
ボリューム スナップショットを作成すると、クラスタによって対応する
VolumeSnapshotContent
オブジェクトが作成されます。このオブジェクトには、VolumeSnapshot
オブジェクトのスナップショットとバインディングが格納されます。VolumeSnapshotContents
オブジェクトを直接操作することはありません。クラスタが
VolumeSnapshotContents
オブジェクトを作成したことを確認します。kubectl get volumesnapshotcontents
出力は次のようになります。
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
ボリューム スナップショットの準備が完了していることを確認する
ボリューム スナップ ショットのコンテンツが作成されると、VolumeSnapshotClass
で指定した CSI ドライバによって、対応するストレージ システムにスナップショットが作成されます。クラスタがストレージ システムにスナップショットを作成し、VolumeSnapshot
オブジェクトにバインドすると、スナップショットが使用できるようになります。ステータスを確認するには、次のコマンドを実行します。
kubectl get volumesnapshot \
-o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'
スナップショットを使用できる場合は、出力は次のようになります。
NAME READY
example-snapshot true
ボリューム スナップショットを復元する
PersistentVolumeClaim
の VolumeSnapshot
を参照して、既存のボリュームのデータで新しいボリュームをプロビジョニングできます。また、ボリュームをスナップショットでキャプチャした状態に復元することもできます。
PersistentVolumeClaim
で VolumeSnapshot
を参照するには、PersistentVolumeClaim
に dataSource
フィールドを追加します。
この例では、新しい PersistentVolumeClaim
に作成した VolumeSnapshot
を参照し、PersistentVolumeClaim
をマウントする Pod を作成します。
次のマニフェストを
pvc-restore.yaml
として保存します。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore spec: dataSource: name: example-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
次のようにマニフェストを適用します。
kubectl apply -f pvc-restore.yaml
PVC を Pod にマウントする一時的な Pod を起動し、
out.txt
の内容をログに出力します。次のマニフェストを
restore-log.yaml
として保存します。apiVersion: v1 kind: Pod metadata: name: restore-verify spec: volumes: - name: restore-data persistentVolumeClaim: claimName: pvc-restore containers: - name: shell-container image: ubuntu:bionic volumeMounts: - mountPath: "/data" name: restore-data command: [ "/bin/sh" ] args: ["-c", "cat /data/out.txt", "exit", "1"] restartPolicy: Never
次のようにマニフェストを適用します。
kubectl apply -f restore-log.yaml
スナップショットが正常に復元されたことを確認する
前のステップで作成した Pod は、スナップショットから読み取りを行います。スナップショットのデータを表示するには、kubectl logs
コマンドを使用します。
kubectl logs restore-verify
出力には、スナップショットのタイムスタンプが含まれます。
クリーンアップ
このページで使用したリソースについて課金されないようにするには、次の手順に沿って操作します。
VolumeSnapshot
を削除します。kubectl delete volumesnapshot example-snapshot
一時的な Pod を削除します。
kubectl delete -f restore-log.yaml
Pod を削除します。
kubectl delete -f snapshot-shell.yaml
PersistentVolumeClaim
オブジェクトを削除します。kubectl delete pvc example-pvc pvc-restore
次のステップ
- Kubernetes ボリューム スナップショットのドキュメントを読む。
- 追加の CSI ドライバをインストールする。