Pod スナップショットからワークロードを復元する

保存した Pod スナップショットからワークロードを復元する方法、既存のスナップショットを管理する方法、Google Kubernetes Engine(GKE)Pod スナップショットを無効にする方法について説明します。

始める前に

作業を始める前に、次のタスクが完了していることを確認してください。

  • Google Kubernetes Engine API を有効にする。
  • Google Kubernetes Engine API を有効化
  • このタスクに Google Cloud CLI を使用する場合は、gcloud CLI をインストールして初期化します。gcloud CLI をインストール済みの場合は、gcloud components update コマンドを実行して最新のバージョンを取得します。以前のバージョンの gcloud CLI では、このドキュメントのコマンドを実行できない場合があります。

スナップショットを管理する

Pod スナップショットを作成すると、その時点の Pod の状態を保存するために PodSnapshot カスタム リソースが作成されます。このリソースの status フィールドは、スナップショット オペレーションが成功したかどうか、スナップショットが復元に使用できるかどうかを示します。

名前空間内のすべての PodSnapshot リソースを表示するには、次のコマンドを実行します。

kubectl get podsnapshots.podsnapshot.gke.io --namespace NAMESPACE

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

NAME                                   STATUS                  POLICY           AGE
de334898-1e7a-4cdb-9f2e-7cc2181c29e4   AllSnapshotsAvailable   example-policy   47h

スナップショットからワークロードを復元する

最新のスナップショットからワークロードを復元するには、スナップショットの取得後に既存の Pod を削除し、Pod を再デプロイします。また、同じ仕様で新しい Pod をデプロイすることもできます。GKE は、一致するスナップショットから Pod を自動的に復元します。

次の手順は、Pod を削除して再デプロイすることで、一致するスナップショットから Pod を復元する方法を示しています。

  1. Pod を削除します。

    kubectl delete -f POD_NAME.yaml
    

    POD_NAME は、Pod の名前に置き換えます(例: my-app)。

  2. Pod を再適用します。

    kubectl apply -f POD_NAME.yaml
    
  3. ログを表示して、スナップショットの復元を確認します。

    kubectl logs my-app --namespace NAMESPACE
    

    出力は、アプリケーションの構成方法によって異なります。Python アプリケーションの例では、復元オペレーションが発生すると、ログに GKE Pod Snapshot: restore が表示されます。

特定のスナップショットから復元する

デフォルトでは、GKE は Pod に一致する最新の PodSnapshot リソースからワークロードを復元します。スナップショットが作成されると、GKE は PodSnapshot リソースの一意の名前(UUID)を自動的に生成します。この名前は kubectl get podsnapshots.podsnapshot.gke.io --namespace NAMESPACE を実行して確認できます。

古い PodSnapshot リソースまたは特定の PodSnapshot リソースからワークロードを復元するには、ワークロード Pod 仕様に podsnapshot.gke.io/ps-name アノテーションを追加し、ワークロードの復元に使用する PodSnapshot リソースの名前を指定します。

apiVersion: v1
kind: Pod
metadata:
  name: my-app
  namespace: NAMESPACE
  labels:
    app: my-app
  annotations:
    podsnapshot.gke.io/ps-name: "POD_SNAPSHOT_NAME"
spec:
  serviceAccountName: KSA_NAME
  runtimeClassName: gvisor
  containers:
  ...

次のように置き換えます。

  • POD_SNAPSHOT_NAME: 復元元のスナップショットの名前。スナップショット名を取得するには、kubectl get podsnapshots.podsnapshot.gke.io --namespace NAMESPACE コマンドを実行します。
  • NAMESPACE: Pod の Namespace。
  • KSA_NAME: KSA の名前。

GKE が復元に指定されたスナップショットを使用するには、PodSnapshot リソースのステータス条件が Ready であり、Pod と同じ Namespace に存在する必要があります。PodSnapshot が Ready でない場合や、Pod と同じ Namespace に存在しない場合、ワークロードはスナップショットから復元する代わりにコールド スタートを実行します。

スナップショットの照合と互換性

GKE がスナップショットから Pod を復元するときは、互換性のあるスナップショットを特定する必要があります。互換性は、選択順序、一致条件(whole-pod と rootfs-only のスコープに基づく)、グループ化ルールの照合などのルールによって決まります。

一致要件、互換性基準、互換性に影響する仕様フィールドの詳細なリファレンスについては、Pod スナップショットのマッチングと互換性をご覧ください。

スナップショットを無効にする

PodSnapshotPolicy CRD を削除すると、Pod のスナップショット作成と復元ができなくなります。実行中の Pod は、リソースの削除の影響を受けません。ただし、Pod の保存中または復元中にポリシーを削除すると、Pod が失敗状態になることがあります。

ポリシーで管理される新しい Pod のスナップショット作成と復元を無効にするには、次のコマンドを実行して PodSnapshotPolicy を削除します。

kubectl delete podsnapshotpolicies.podsnapshot.gke.io SNAPSHOT_POLICY --namespace=NAMESPACE

SNAPSHOT_POLICY は、削除する PodSnapshotPolicy の名前に置き換えます(例: example-pod-snapshot-policy)。

特定の PodSnapshot リソースを削除して、Pod が特定のスナップショットから復元されないようにすることもできます。PodSnapshot リソースを削除すると、Cloud Storage に保存されているファイルも削除されます。

特定のスナップショットが将来の復元に使用されないようにするには、次のコマンドを実行して PodSnapshot オブジェクトを削除します。

kubectl delete podsnapshots.podsnapshot.gke.io POD_SNAPSHOT_NAME --namespace=NAMESPACE

POD_SNAPSHOT_NAME は、削除するスナップショットの名前(example-podsnapshot など)に置き換えます。

次のステップ

Pod スナップショットのトラブルシューティングの方法を確認する。