このページでは、Kubernetes ボリューム スナップショットを使用して Filestore ストレージをバックアップおよび復元する方法について説明します。
Kubernetes ボリューム スナップショットの作成は、Filestore バックアップの作成と同等です。詳細については、Kubernetes のボリューム スナップショットについての記事をご覧ください。
要件
GKE でボリューム スナップショットを使用するには、次の要件を満たす必要があります。
Filestore CSI ドライバをデプロイする必要があります。次の Filestore サービスティアのみがサポートされています。
- 基本 HDD(GKE バージョン 1.21 以降)
- 基本 HDD(100 GiB~63.9 TiB)(GKE バージョン 1.33 以降)
- 基本 SSD(GKE バージョン 1.21 以降)
- ゾーン(1 TiB~9.75 TiB)(GKE バージョン 1.31 以降)
- ゾーン(10 TiB~100 TiB)(GKE バージョン 1.27 以降)
- リージョン(GKE バージョン 1.33.4-gke.1172000 以降)
- エンタープライズ(GKE バージョン 1.25 以降)
コントロール プレーンのバージョン 1.17 以降を使用します。
VolumeSnapshotで Filestore CSI ドライバを使用するには、サービスティアに適用される GKE バージョン番号を使用します。
- スナップショットに使用する既存の
PersistentVolumeClaimが必要です。スナップショット ソースに使用するPersistentVolumeは、CSI ドライバによって管理される必要があります。CSI ドライバを使用しているかどうかを確認するには、PersistentVolume仕様のcsiセクションでdriver: pd.csi.storage.gke.ioまたはfilestore.csi.storage.gke.ioが指定されているかをチェックします。以降のセクションで説明するように、PersistentVolumeが CSI ドライバによって動的にプロビジョニングされていれば、CSI ドライバによって管理されています。
制限事項
スナップショット ボリュームには、通常のボリュームと同じサイズ制限があります。たとえば、Filestore スナップショットでは、基本 HDD ティアのサイズが 1 TiB 以上である必要があります。
Filestore CSI ドライバは、リージョン Filestore サービスティアの動的プロビジョニングまたはバックアップ ワークフローをサポートしていません。
一度にバックアップできるシェアは 1 つのインスタンスにつき 1 つのみです。つまり、マルチシェア バックアップを作成したり、複数の共有があるインスタンスにバックアップを復元することはできません。ただし、2 つの異なる Filestore インスタンスの 2 つの異なる共有からのバックアップ リクエストは同時に実行されます。
基本インスタンスのバックアップは、同じサービスティアのソース インスタンス、既存のインスタンス、または新しいインスタンスに復元できます。新しいインスタンスを選択する場合は、ソース インスタンスのティアに関係なく、基本 HDD インスタンスか基本 SSD インスタンスを選択できます。
ゾーン インスタンス、リージョン インスタンス、エンタープライズ インスタンスは、ソース インスタンスまたは既存のインスタンスに復元できません。新しいインスタンスにのみ復元できます。新しいインスタンスのティアは、ソース インスタンスのティアと一致している必要はありません。たとえば、リージョン インスタンスのバックアップをゾーン インスタンスに復元できます。新しいインスタンスのプロビジョニングされた容量は、ソース インスタンスのプロビジョニングされた容量以上である必要があります。
機能制限の一覧については、Filestore のバックアップ機能の制限事項をご覧ください。
始める前に
作業を始める前に、次のタスクが完了していることを確認してください。
- Google Kubernetes Engine API を有効にする。 Google Kubernetes Engine API の有効化
- このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化する。すでに gcloud CLI をインストールしている場合は、
gcloud components updateコマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。
ボリューム スナップショットの作成と使用
このドキュメントの例では、次の作業を行う方法について説明します。
PersistentVolumeClaimとDeploymentを作成する。Deploymentが使用するPersistentVolumeにファイルを追加する。VolumeSnapshotClassを作成してスナップショットを構成する。PersistentVolumeのボリューム スナップショットを作成する。- テストファイルを削除する。
- 作成したスナップショットに
PersistentVolumeを復元する。 - 復元が機能していることを確認する。
ボリューム スナップショットを使用するには、次の手順を行う必要があります。
VolumeSnapshotClassオブジェクトを作成して、スナップショットの CSI ドライバと削除ポリシーを指定します。VolumeSnapshotオブジェクトを作成して、既存のPersistentVolumeClaimのスナップショットをリクエストします。PersistentVolumeClaim内のVolumeSnapshotを参照して、そのスナップショットにボリュームを復元するか、スナップショットを使用して新しいボリュームを作成します。
PersistentVolumeClaim と Deployment を作成する
PersistentVolumeClaimオブジェクトを作成するには、次のマニフェストをmy-pvc.yamlとして保存します。Filestore
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: enterprise-rwx accessModes: - ReadWriteMany resources: requests: storage: 1Tiこの例では、エンタープライズ階層の Filestore PVC を作成します。詳細については、Filestore CSI ドライバを使用して Filestore インスタンスにアクセスするをご覧ください。
spec.storageClassNameには、サポートされている CSI ドライバを使用するストレージ クラスを指定できます。次のようにマニフェストを適用します。
kubectl apply -f my-pvc.yamlDeploymentを作成するには、次のマニフェストをmy-deployment.yamlとして保存します。apiVersion: apps/v1 kind: Deployment metadata: name: hello-app spec: selector: matchLabels: app: hello-app template: metadata: labels: app: hello-app spec: containers: - name: hello-app image: google/cloud-sdk:slim args: [ "sleep", "3600" ] volumeMounts: - name: sdk-volume mountPath: /usr/share/hello/ volumes: - name: sdk-volume persistentVolumeClaim: claimName: my-pvc次のようにマニフェストを適用します。
kubectl apply -f my-deployment.yamlDeploymentのステータスを確認します。kubectl get deployment hello-appDeploymentの準備が完了するまでに時間がかかることがあります。次のような出力が表示されるまで、上記のコマンドを実行します。NAME READY UP-TO-DATE AVAILABLE AGE hello-app 1/1 1 1 2m55s
ボリュームにテストファイルを追加する
DeploymentのPodsを一覧表示します。kubectl get pods -l app=hello-app出力は次のようになります。
NAME READY STATUS RESTARTS AGE hello-app-6d7b457c7d-vl4jr 1/1 Running 0 2m56sPodにテストファイルを作成します。kubectl exec POD_NAME \ -- sh -c 'echo "Hello World!" > /usr/share/hello/hello.txt'POD_NAMEは、Podの名前に置き換えます。ファイルが存在することを確認します。
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'出力は次のようになります。
Hello World!
VolumeSnapshotClass オブジェクトを作成する
VolumeSnapshotClass オブジェクトを作成して、ボリューム スナップショットの CSI ドライバと deletionPolicy を指定します。VolumeSnapshot オブジェクトの作成時に VolumeSnapshotClass オブジェクトを参照できます。
次のマニフェストを
volumesnapshotclass.yamlとして保存します。Filestore
apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: filestore.csi.storage.gke.io parameters: type: backup deletionPolicy: Deleteこの例では、次のようになります。
driverフィールドは、スナップショットをプロビジョニングするために CSI ドライバによって使用されます。この例では、filestore.csi.storage.gke.ioは Filestore の CSI ドライバを使用します。deletionPolicyフィールドは、バインドされたVolumeSnapshotオブジェクトの削除時に、VolumeSnapshotContentオブジェクトとその基盤となるスナップショットを GKE でどのように処理するかを指示します。VolumeSnapshotContentオブジェクトと基盤となるスナップショットを削除するには、Deleteを指定します。VolumeSnapshotContentとその基盤となるスナップショットを保持する場合は、Retainを指定します。
次のようにマニフェストを適用します。
kubectl apply -f volumesnapshotclass.yaml
VolumeSnapshot を作成する
VolumeSnapshot オブジェクトは、既存の PersistentVolumeClaim オブジェクトのスナップショットのリクエストです。VolumeSnapshot オブジェクトを作成すると、GKE はオブジェクトを自動的に作成し、VolumeSnapshotContent オブジェクト(PersistentVolume オブジェクトなどのクラスタ内のリソース)とバインドします。
次のマニフェストを
volumesnapshot.yamlとして保存します。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: persistentVolumeClaimName: my-pvc次のようにマニフェストを適用します。
kubectl apply -f volumesnapshot.yamlVolumeスナップショットを作成すると、GKE によって対応するVolumeSnapshotContentオブジェクトがクラスタ内に作成されます。このオブジェクトには、VolumeSnapshotオブジェクトのスナップショットとバインディングが格納されます。VolumeSnapshotContentsオブジェクトを直接操作することはありません。GKE が
VolumeSnapshotContentsオブジェクトを作成したことを確認します。kubectl get volumesnapshotcontents出力は次のようになります。
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
Volume スナップショットのコンテンツが作成されると、VolumeSnapshotClass で指定した CSI ドライバによって、対応するストレージ システムにスナップショットが作成されます。GKE がストレージ システムにスナップショットを作成し、クラスタ上の VolumeSnapshot オブジェクトにバインドすると、スナップショットが使用できるようになります。ステータスを確認するには、次のコマンドを実行します。
kubectl get volumesnapshot \
-o custom-columns='NAME:.metadata.name,READY:.status.readyToUse'
スナップショットを使用できる場合は、出力は次のようになります。
NAME READY
my-snapshot true
テストファイルを削除する
作成したテストファイルを削除します。
kubectl exec POD_NAME \ -- sh -c 'rm /usr/share/hello/hello.txt'ファイルが存在していないことを確認します。
kubectl exec POD_NAME \ -- sh -c 'cat /usr/share/hello/hello.txt'出力は次のようになります。
cat: /usr/share/hello/hello.txt: No such file or directory
ボリューム スナップショットを復元する
PersistentVolumeClaim の VolumeSnapshot を参照して、既存のボリュームのデータで新しいボリュームをプロビジョニングできます。
PersistentVolumeClaim で VolumeSnapshot を参照するには、PersistentVolumeClaim に dataSource フィールドを追加します。
この例では、新しい PersistentVolumeClaim で作成した VolumeSnapshot を参照して、新しいクレームを使用するように Deployment を更新します。
次のマニフェストを
pvc-restore.yamlとして保存します。Filestore
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore spec: dataSource: name: my-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: enterprise-rwx accessModes: - ReadWriteMany resources: requests: storage: 1Ti次のようにマニフェストを適用します。
kubectl apply -f pvc-restore.yaml新しい
PersistentVolumeClaimを使用するようにmy-deployment.yamlファイルを更新します。... volumes: - name: my-volume persistentVolumeClaim: claimName: pvc-restore更新されたマニフェストを適用します。
kubectl apply -f my-deployment.yaml
スナップショットが正常に復元されたことを確認する
更新された
Deployment用に GKE が作成する新しいPodの名前を取得します。kubectl get pods -l app=hello-app
テストファイルが存在することを確認します。
kubectl exec NEW_POD_NAME \
-- sh -c 'cat /usr/share/hello/hello.txt'
NEW_POD_NAME は、GKE が作成した新しい Pod の名前に置き換えます。
出力は次のようになります。
Hello World!
既存のスナップショットをインポートする
現在のクラスタの外部で作成された既存のボリューム スナップショットを使用して、VolumeSnapshotContents オブジェクトを手動でプロビジョニングできます。たとえば、別のクラスタに作成された別のGoogle Cloud リソースのスナップショットで GKE のボリュームを更新できます。
スナップショットの名前を探します。
Google Cloud コンソール
Google Cloud CLI
次のコマンドを実行します。
gcloud compute snapshots list出力は次のようになります。
NAME DISK_SIZE_GB SRC_DISK STATUS snapshot-5e6af474-cbcc-49ed-b53f-32262959a0a0 1 us-central1-b/disks/pvc-69f80fca-bb06-4519-9e7d-b26f45c1f4aa READY次の
VolumeSnapshotマニフェストをrestored-snapshot.yamlとして保存します。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: restored-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: volumeSnapshotContentName: restored-snapshot-content次のようにマニフェストを適用します。
kubectl apply -f restored-snapshot.yaml次の
VolumeSnapshotContentマニフェストをrestored-snapshot-content.yamlとして保存します。snapshotHandleフィールドは、プロジェクト ID とスナップショット名に置き換えます。双方向のバインディングを有効にするには、volumeSnapshotRef.nameとvolumeSnapshotRef.namespaceの両方が、以前に作成したVolumeSnapshotを参照している必要があります。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotContent metadata: name: restored-snapshot-content spec: deletionPolicy: Retain driver: filestore.csi.storage.gke.io source: snapshotHandle: projects/PROJECT_ID/global/snapshots/SNAPSHOT_NAME volumeSnapshotRef: kind: VolumeSnapshot name: restored-snapshot namespace: default次のようにマニフェストを適用します。
kubectl apply -f restored-snapshot-content.yaml次の
PersistentVolumeClaimマニフェストをrestored-pvc.yamlとして保存します。Kubernetes ストレージ コントローラは、restored-snapshotという名前のVolumeSnapshotを探し、データソースとしてPersistentVolumeを見つけるか、動的に作成しようとします。その後、Pod でこの PVC を使用して、復元されたデータにアクセスできます。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: restored-pvc spec: dataSource: name: restored-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: enterprise-rwx accessModes: - ReadWriteOnce resources: requests: storage: 1Gi次のようにマニフェストを適用します。
kubectl apply -f restored-pvc.yaml次の
Podマニフェストをrestored-pod.yamlとして保存し、PersistentVolumeClaimを参照します。CSI ドライバがPersistentVolumeをプロビジョニングし、スナップショットで更新します。apiVersion: v1 kind: Pod metadata: name: restored-pod spec: containers: - name: busybox image: busybox args: - sleep - "3600" volumeMounts: - name: source-data mountPath: /demo/data volumes: - name: source-data persistentVolumeClaim: claimName: restored-pvc readOnly: false次のようにマニフェストを適用します。
kubectl apply -f restored-pod.yamlファイルが復元されたことを確認します。
kubectl exec restored-pod -- sh -c 'cat /demo/data/hello.txt'
クリーンアップ
このページで使用したリソースについて、 Google Cloud アカウントに課金されないようにするには、次の手順で操作します。
VolumeSnapshotを削除します。kubectl delete volumesnapshot my-snapshotVolumeSnapshotClassを削除します。kubectl delete volumesnapshotclass my-snapshotclassDeploymentを削除します。kubectl delete deployments hello-appPersistentVolumeClaimオブジェクトを削除します。kubectl delete pvc my-pvc pvc-restore
次のステップ
- Kubernetes ボリューム スナップショットのドキュメントを読む。
- ボリュームの拡張について学習する。
- CSI ドライバを手動でインストールする方法を学習する。
- GKE のファイル ストレージ オプションとしての Filestore について学習する。