從 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 快照時,系統會建立 PodSnapshot 自訂資源,用於儲存當時的 Pod 狀態。這項資源的 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 資源還原工作負載,請在工作負載 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 的命名空間。
  • KSA_NAME:KSA 名稱。

如要讓 GKE 使用指定的快照進行還原,PodSnapshot 資源狀態條件必須為 Ready,且與 Pod 位於相同命名空間。如果 PodSnapshot 不是 Ready,或不存在於與 Pod 相同的命名空間中,工作負載會執行冷啟動,而不是從快照還原。

快照比對和相容性

當 GKE 從快照還原 Pod 時,必須判斷哪個快照相容。相容性取決於選取順序、比對條件 (根據 whole-pod 與 rootfs-only 範圍) 和相符的分組規則等規則。

如要詳細瞭解比對規定、相容性條件,以及影響相容性的規格欄位,請參閱「Pod 快照比對和相容性」。

停用快照

移除 PodSnapshotPolicy CRD 後,系統就無法再為 Pod 建立快照和還原 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 快照問題。