ボリューム スナップショットの使用

Google Kubernetes Engine(GKE)の Kubernetes ボリューム スナップショット機能は、GKE クラスタ内の永続ボリュームで使用できます。

ボリューム スナップショットを使用すると、特定の時点でのボリュームのコピーを作成できます。このコピーを使用して、ボリュームを以前の状態に戻すことができます。また、新しいボリュームのプロビジョニングもできます。

バージョン 1.17 以降では、次のコンポーネントを使用してボリューム スナップショットをプロビジョニングしてアタッチできます。

要件

GKE でボリューム スナップショットを使用する場合、次の要件があります。

  • スナップショットをサポートする CSI ドライバをインストールする必要があります。スナップショットは、ツリー内の永続ディスク ドライバではサポートされません。Compute Engine 永続ディスクの CSI ドライバを使用している場合は、ドライバを自動的にデプロイして管理オーバーヘッドを削減することをおすすめします。スナップショットをサポートするすべての CSI ドライバの一覧については、Kubernetes ドキュメントのドライバにある「その他の機能」の列をご覧ください。

  • GKE バージョン 1.17 以降のバージョンのコントロール プレーン(マスター)を使用する必要があります。Compute Engine 永続ディスクの CSI ドライバを使用するには、VolumeSnapshot で GKE バージョン 1.17.6-gke.4 以降を使用します。

  • スナップショットを作成するには、既存の PersistentVolumeClaim が必要です。スナップショット ソースに使用する PersistentVolume は、CSI ドライバによって管理される必要があります。CSI ドライバを使用しているかどうかを確認するには、PersistentVolume の仕様の csi セクションで driver: pd.csi.storage.gke.io が指定されているかを確かめます。以降のセクションで説明のとおり、PersistentVolume が CSI ドライバによって動的にプロビジョニングされると、CSI ドライバによって管理されます。

VolumeSnapshotClass の作成

VolumeSnapshotClass を作成して、ボリューム スナップショットの CSI ドライバと deletionPolicy を決定します。VolumeSnapshot で VolumeSnapshotClass を参照できます。

次に、VolumeSnapshotClass の例として snapshot-class-example.yaml という名前のマニフェストを示します。

# snapshot-class-example.yaml
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshotClass
metadata:
  name: snapshot-class
driver: csi-driver
deletionPolicy: Delete

以下を置き換えます。

  • snapshot-class は、VolumeSnapshotClass の名前です。
  • csi-driver で、スナップショットのプロビジョニングに使用する CSI ドライバを指定します。たとえば、Compute Engine 永続ディスクの CSI ドライバを使用するように pd.csi.storage.gke.io を追加できます。
  • Delete を指定すると、バインドされている VolumeSnapshot が削除された際に、VolumeSnapshotContent オブジェクトが削除されます。また、基となるストレージ システムのスナップショットも削除されます。VolumeSnapshotContent を保持する場合は、この値を Retain に設定します。

VolumeSnapshotClass を作成するには、ファイルの作成後に次のコマンドを実行します。

kubectl apply -f snapshot-class-example.yaml

VolumeSnapshot の作成

VolumeSnapshot は、既存の PersistentVolumeClaim のスナップショットのリクエストです。

次に、VolumeSnapshot の例として snapshot-example.yaml という名前のマニフェストを示します。

#snapshot-example.yaml
apiVersion: snapshot.storage.k8s.io/v1beta1
kind: VolumeSnapshot
metadata:
  name: snapshot
spec:
  volumeSnapshotClassName: snapshot-class
  source:
    persistentVolumeClaimName: pvc

以下を置き換えます。

  • snapshot は VolumeSnapshot の名前です。
  • snapshot-class で、参照する VolumeSnapshotClass の名前を指定します。値を指定しない場合、デフォルトの VolumeSnapshotClass が使用されます(使用可能な場合)。
  • pvc は、スナップショットを取得する既存の PersistentVolumeClaim の名前です。

VolumeSnapshot を作成するには、ファイルの作成後に次のコマンドを実行します。

kubectl apply -f snapshot-example.yaml

VolumeSnapshot の作成の確認

ボリューム スナップショットを作成すると、対応する VolumeSnapshotContent オブジェクトがクラスタ内に作成されます。このオブジェクトには、VolumeSnapshot オブジェクトのスナップショットとバインディングが格納されます。VolumeSnapshotContents オブジェクトを直接操作することはありません。

VolumeSnapshotContents が作成されているかどうかを確認するには、次のコマンドを実行します。

kubectl get volumesnapshotcontents

出力は次のようになります。

NAME                                               AGE
snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da   55s

ボリューム スナップ ショットのコンテンツが作成されると、VolumeSnapshotClass で指定した CSI ドライバによって、対応するストレージ システムにスナップショットが作成されます。GKE がストレージ システムにスナップショットを作成し、クラスタ上のボリューム スナップショット オブジェクトにバインドすると、スナップショットが使用できるようになります。ステータスを確認するには、次のコマンドを実行します。

kubectl get volumesnapshot \
  -o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'

使用する準備ができている場合、出力は次のようになります。

NAME               READY
snapshot-example   true

VolumeSnapshot を使用したボリュームのプロビジョニングと復元

PersistentVolumeClaim で VolumeSnapshot を参照すると、既存のボリュームのデータで新しいボリュームをプロビジョニングしたり、スナップショットでキャプチャした状態にボリュームを復元したりできます。

PersistentVolumeClaim で VolumeSnapshot を参照するには、dataSource フィールドを PersistentVolumeClaim に追加します。

次に、dataSource フィールドの追加方法の例として pvc-demo.yaml というマニフェストを示します。

# pvc-demo.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-demo
spec:
  dataSource:
    name: snapshot-name
    kind: VolumeSnapshot
    apiGroup: snapshot.storage.k8s.io
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 30Gi

dataSource に次のフィールドが含まれていることを確認してください。

  • snapshot-name は、使用する VolumeSnapshot の名前です。
  • kindVolumeSnapshot でなければなりません。
  • apiGroupsnapshot.storage.k8s.io でなければなりません。

PersistentVolumeClaim に変更を適用するには、次のコマンドを実行します。

kubectl apply -f pvc-demo.yaml

VolumeSnapshot の削除

VolumeSnapshot を削除するには、次のコマンドを実行します。

kubectl delete volumesnapshot snapshot-example

ボリューム スナップショットの VolumeSnapshotClassdeletionPolicy:Delete が含まれる場合、対応する VolumeSnapshotContent とストレージ システムの物理スナップショットも削除されます。deletionPolicy:Retain がある場合、GKE は物理スナップショットを保持します。

次のステップ