Google Kubernetes Engine(GKE)の Kubernetes ボリューム スナップショット機能は、GKE クラスタ内の永続ボリュームで使用できます。
ボリューム スナップショットを使用すると、特定の時点でのボリュームのコピーを作成できます。このコピーを使用して、ボリュームを以前の状態に戻すことができます。また、新しいボリュームをプロビジョニングすることもできます。
GKE バージョン 1.17 以降では、次のコンポーネントを使用してボリューム スナップショットをプロビジョニングしてアタッチできます。
要件
GKE でボリューム スナップショットを使用するには、次の要件を満たす必要があります。
スナップショットをサポートする CSI ドライバを使用します。in-tree の永続ディスク ドライバはスナップショットをサポートしていません。
- GKE バージョン 1.18.10-gke.2100 以降、またはバージョン 1.19.3-gke.2100 を実行する新しい Linux クラスタには、Compute Engine 永続ディスクの CSI ドライバがデフォルトでインストールされます。また、既存のクラスタで Compute Engine 永続ディスクの CSI ドライバを有効にすることもできます。
- Filestore CSI ドライバを自動的にデプロイすることもできます。スナップショットをサポートするすべての CSI ドライバの一覧については、Kubernetes ドキュメントのドライバにある「その他の機能」の列をご覧ください。
コントロール プレーンのバージョン 1.17 以降を使用します。Compute Engine 永続ディスクの CSI ドライバを使用するには、VolumeSnapshot で GKE バージョン 1.17.6-gke.4 以降を使用します。VolumeSnapshot で Filestore CSI ドライバを使用するには、GKE バージョン 1.21 以降を使用します。
スナップショットに使用する既存の
PersistentVolumeClaim
がある。スナップショット ソースに使用するPersistentVolume
は、CSI ドライバによって管理される必要があります。CSI ドライバを使用しているかどうかを確認するには、PersistentVolume
仕様のcsi
セクションでdriver: pd.csi.storage.gke.io
またはfilestore.csi.storage.gke.io
が指定されているかをチェックします。以降のセクションで説明のとおり、PersistentVolume が CSI ドライバによって動的にプロビジョニングされると、CSI ドライバによって管理されます。
始める前に
作業を始める前に、次のことを確認してください。
- Google Kubernetes Engine API が有効になっていることを確認します。 Google Kubernetes Engine API の有効化
- Google Cloud CLI がインストールされていることを確認します。
- 次のいずれかの方法で、プロジェクトにデフォルトの Google Cloud CLI 設定をセットアップします。
- プロジェクトのデフォルトの設定全般を確認する場合は、
gcloud init
を使用します。 gcloud config
を使用して、プロジェクト ID、ゾーン、リージョンを個別に設定します。-
gcloud init
を実行して、次の操作を行います。gcloud init
リモート サーバーで SSH を使用している場合は、
--console-only
フラグを指定して、コマンドがブラウザを起動しないようにします。gcloud init --console-only
- Google Cloud アカウントを使用できるように、gcloud CLI の承認手順を行います。
- 新しい構成を作成するか、既存の構成を選択します。
- Google Cloud プロジェクトを選択します。
- デフォルトの Compute Engine ゾーンを選択します。
- デフォルトの Compute Engine リージョンを選択します。
- デフォルトのプロジェクト ID を設定します。
gcloud config set project PROJECT_ID
- デフォルトの Compute Engine リージョン(例:
us-central1
)を設定します。gcloud config set compute/region COMPUTE_REGION
- デフォルトの Compute Engine ゾーン(例:
us-central1-c
)を設定します。gcloud config set compute/zone COMPUTE_ZONE
gcloud
を最新バージョンに更新します。gcloud components update
gcloud init
gcloud config
デフォルトの場所を設定することで、gcloud CLI のエラー(One of [--zone, --region] must be supplied: Please specify location
など)を防止できます。
ボリューム スナップショットの作成と使用
このドキュメントの例では、次の作業を行う方法について説明します。
PersistentVolumeClaim
と Deployment を作成する。- Deployment が使用する PersistentVolume にファイルを追加する。
VolumeSnapshotClass
を作成してスナップショットを構成する。- PersistentVolume のボリューム スナップショットを作成する。
- テストファイルを削除する。
- 作成したスナップショットに
PersistentVolume
を復元する。 - 復元が機能していることを確認する。
ボリューム スナップショットを使用するには、次の手順を行う必要があります。
VolumeSnapshotClass
オブジェクトを作成して、スナップショットの CSI ドライバと削除ポリシーを指定します。VolumeSnapshot
オブジェクトを作成して、既存の PersistentVolumeClaim のスナップショットをリクエストします。PersistentVolumeClaim
内のVolumeSnapshot
を参照して、そのスナップショットにボリュームを復元するか、スナップショットを使用して新しいボリュームを作成します。
PersistentVolumeClaim と Deployment を作成する
PersistentVolumeClaim
オブジェクトを作成するには、次のマニフェストをmy-pvc.yaml
として保存します。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: my-pvc spec: storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
spec.storageClassName
には、サポートされている CSI ドライバを使用するストレージ クラスを指定できます。この例では、Compute Engine 永続ディスクの CSI ドライバとともにデフォルトでインストールされたstandard-rwo
ストレージ クラスを使用します。詳細については、Compute Engine 永続ディスクの CSI ドライバの使用をご覧ください。次のようにマニフェストを適用します。
kubectl apply -f my-pvc.yaml
Deployment を作成するには、次のマニフェストを
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.yaml
Deployment のステータスを確認します。
kubectl get deployment hello-app
Deployment の準備が完了するまでに時間がかかることがあります。次のような出力が表示されるまで、上記のコマンドを実行します。
NAME READY UP-TO-DATE AVAILABLE AGE hello-app 1/1 1 1 2m55s
ボリュームにテストファイルを追加する
Deployment 内の Pod を一覧表示します。
kubectl get pods -l app=hello-app
出力は次のようになります。
NAME READY STATUS RESTARTS AGE hello-app-6d7b457c7d-vl4jr 1/1 Running 0 2m56s
Pod にテストファイルを作成します。
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
として保存します。v1
バージョン 1.21 以降を実行しているクラスタには、
v1
API バージョンを使用します。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: pd.csi.storage.gke.io deletionPolicy: Delete
v1beta1
バージョン 1.21 以前を実行しているクラスタには、
v1beta1
API バージョンを使用します。apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass driver: pd.csi.storage.gke.io deletionPolicy: Delete
この例では以下の情報が表示されます。
driver
フィールドは、スナップショットをプロビジョニングするために CSI ドライバによって使用されます。この例で、pd.csi.storage.gke.io
は Compute Engine 永続ディスクの CSI ドライバを使用します。deletionPolicy
フィールドは、バインドされたVolumeSnapshot
オブジェクトの削除時に、VolumeSnapshotContent
オブジェクトとその基盤となるスナップショットを GKE でどのように処理するかを指示します。VolumeSnapshotContent
オブジェクトと基盤となるスナップショットを削除するには、Delete
を指定します。VolumeSnapshotContent
とその基盤となるスナップショットを保持する場合は、Retain
を指定します。
カスタムのストレージ ロケーションを使用するには、
storage-locations
パラメータをスナップショット クラスに追加します。このパラメータを使用するには、クラスタでバージョン 1.21 以降を使用する必要があります。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshotClass metadata: name: my-snapshotclass parameters: storage-locations: us-east2 driver: pd.csi.storage.gke.io deletionPolicy: Delete
次のようにマニフェストを適用します。
kubectl apply -f volumesnapshotclass.yaml
VolumeSnapshot を作成する
VolumeSnapshot
オブジェクトは、既存の PersistentVolumeClaim
オブジェクトのスナップショットのリクエストです。VolumeSnapshot
オブジェクトを作成すると、GKE はオブジェクトを自動的に作成し、VolumeSnapshotContent
オブジェクト(PersistentVolume
オブジェクトなどのクラスタ内のリソース)とバインドします。
次のマニフェストを
volumesnapshot.yaml
として保存します。v1
バージョン 1.21 以降を実行しているクラスタには、
v1
API バージョンを使用します。apiVersion: snapshot.storage.k8s.io/v1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: persistentVolumeClaimName: my-pvc
v1beta1
バージョン 1.21 以前を実行しているクラスタには、
v1beta1
API バージョンを使用します。apiVersion: snapshot.storage.k8s.io/v1beta1 kind: VolumeSnapshot metadata: name: my-snapshot spec: volumeSnapshotClassName: my-snapshotclass source: persistentVolumeClaimName: my-pvc
次のようにマニフェストを適用します。
kubectl apply -f volumesnapshot.yaml
ボリューム スナップショットを作成すると、GKE がクラスタに対応する
VolumeSnapshotContent
オブジェクトを作成します。このオブジェクトには、VolumeSnapshot
オブジェクトのスナップショットとバインディングが格納されます。VolumeSnapshotContents
オブジェクトを直接操作することはありません。GKE が
VolumeSnapshotContents
オブジェクトを作成したことを確認します。kubectl get volumesnapshotcontents
出力は次のようになります。
NAME AGE snapcontent-cee5fb1f-5427-11ea-a53c-42010a1000da 55s
ボリューム スナップ ショットのコンテンツが作成されると、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
として保存します。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-restore spec: dataSource: name: my-snapshot kind: VolumeSnapshot apiGroup: snapshot.storage.k8s.io storageClassName: standard-rwo accessModes: - ReadWriteOnce resources: requests: storage: 1Gi
次のようにマニフェストを適用します。
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
は、作成した新しい Pod GKE の名前に置き換えます。
出力は次のようになります。
Hello World!
クリーンアップ
このページで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、次の手順を行います。
VolumeSnapshot
を削除します。kubectl delete volumesnapshot my-snapshot
VolumeSnapshotClass
を削除します。kubectl delete volumesnapshotclass my-snapshotclass
Deployment を削除します。
kubectl delete deployments hello-app
PersistentVolumeClaim
オブジェクトを削除します。kubectl delete pvc my-pvc pvc-restore
次のステップ
- Kubernetes ボリューム スナップショットのドキュメントを読む。
- ボリュームの拡張について学習する。
- CSI ドライバを手動でインストールする方法を学習する。