从 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 资源恢复工作负载,请将 podsnapshot.gke.io/ps-name 注解添加到工作负载 Pod 规范,并指定用于恢复工作负载的 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 停用快照和恢复功能,请运行以下命令来删除 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 快照问题。