准备使用 Pod 快照

了解如何在集群上启用和配置 Google Kubernetes Engine (GKE) Pod 快照,以及如何设置 Cloud Storage 来存储快照。

如需详细了解 Pod 快照的工作原理,请参阅 Pod 快照简介

准备工作

在开始之前,请确保您已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装初始化 gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。

启用 Pod 快照

如需启用 Pod 快照,请创建或更新集群并启用 Pod 快照功能。对于 Standard 集群,您还必须创建或更新节点池,以在 GKE Sandbox 中运行。Autopilot 集群默认支持 GKE Sandbox。

如需在集群上启用 Pod 快照,请根据您要使用的 GKE 运行模式完成以下步骤之一:

Autopilot

  • 如需在新集群上启用 Pod 快照,请运行以下命令:

      gcloud container clusters create-auto CLUSTER_NAME \
          --enable-pod-snapshots \
          --location=CONTROL_PLANE_LOCATION \
          --cluster-version=CLUSTER_VERSION
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • CONTROL_PLANE_LOCATION:集群控制平面的位置
    • CLUSTER_VERSION:新集群的版本,必须为 1.35.3-gke.1234000 或更高版本。
  • 如需在现有集群上启用 Pod 快照,请完成以下步骤:

    1. 将集群升级到 1.35.3-gke.1234000 版或更高版本:

        gcloud container clusters upgrade CLUSTER_NAME \
            --cluster-version=CLUSTER_VERSION \
            --location=CONTROL_PLANE_LOCATION
      

      替换以下内容:

      • CLUSTER_NAME:您的集群的名称。
      • CONTROL_PLANE_LOCATION:集群控制平面的位置
      • CLUSTER_VERSION:新集群的版本,必须为 1.35.3-gke.1234000 或更高版本。
    2. 在集群上启用 Pod 快照:

        gcloud container clusters update CLUSTER_NAME \
            --enable-pod-snapshots \
            --location=CONTROL_PLANE_LOCATION
      

    默认 whole-pod 范围 Pod 快照不支持 E2 机器类型。在 Autopilot 中,GKE 可能会默认使用不支持 Pod 快照的机器类型。如果您使用 whole-pod 范围快照,为了确保工作负载在兼容的硬件上运行,您应使用自定义 ComputeClass 来优先考虑兼容的机器系列。文件系统快照 (rootfs-only) 支持 E2 机器类型。

如需创建和使用自定义 ComputeClass,请完成以下步骤:

  1. 将以下清单保存为 non-e2-class.yaml

      apiVersion: cloud.google.com/v1
      kind: ComputeClass
      metadata:
        name: non-e2-class
      spec:
        priorities:
        - machineFamily: n2
        - machineFamily: c3
        activeMigration:
          optimizeRulePriority: false
        whenUnsatisfiable: DoNotScaleUp
    
  2. 应用清单:

      kubectl apply -f non-e2-class.yaml
    
  3. 在 Pod 规范中,使用 cloud.google.com/compute-class 节点选择器引用 ComputeClass:

      spec:
        nodeSelector:
          cloud.google.com/compute-class: non-e2-class
        ...
    

标准

  • 如需在新集群上启用 Pod 快照,请运行以下命令:

      gcloud container clusters create CLUSTER_NAME \
          --enable-pod-snapshots \
          --cluster-version=CLUSTER_VERSION \
          --workload-pool=PROJECT_ID.s3ns.svc.id.goog \
          --workload-metadata=GKE_METADATA \
          --location=CONTROL_PLANE_LOCATION
    

    替换以下内容:

    • CLUSTER_NAME:您的集群的名称。
    • CLUSTER_VERSION:新集群的版本,必须为 1.35.3-gke.1234000 或更高版本。
    • PROJECT_ID:您的项目 ID。
    • CONTROL_PLANE_LOCATION:集群控制平面的位置
  • 如需在现有集群上启用 Pod 快照,请完成以下步骤:

    1. 将集群升级到 1.35.3-gke.1234000 版或更高版本:

        gcloud container clusters upgrade CLUSTER_NAME \
            --node-pool=NODEPOOL_NAME \
            --cluster-version=CLUSTER_VERSION \
            --location=CONTROL_PLANE_LOCATION
      

      替换以下内容:

      • CLUSTER_NAME:您的集群的名称。
      • NODEPOOL_NAME:节点池的名称。
      • CLUSTER_VERSION:要将新集群更新到的版本,必须为 1.35.3-gke.1234000 或更高版本。
      • CONTROL_PLANE_LOCATION:集群控制平面的位置
    2. 在集群上启用 Pod 快照:

        gcloud beta container clusters update CLUSTER_NAME \
          --enable-pod-snapshots \
          --location=CONTROL_PLANE_LOCATION
      

      替换以下内容:

      • CLUSTER_NAME:您的集群的名称。
      • CONTROL_PLANE_LOCATION:集群控制平面的位置

如需在 Standard 集群上以 GKE Sandbox 运行 Pod,请创建或更新启用了 gVisor 的节点池。如需更新节点池,请使用 --sandbox type=gvisor 标志。如需创建启用 gVisor 的节点池,请运行以下命令:

gcloud container node-pools create NODE_POOL_NAME \
  --cluster=CLUSTER_NAME \
  --node-version=NODE_VERSION \
  --machine-type=MACHINE_TYPE \
  --location=CONTROL_PLANE_LOCATION \
  --image-type=cos_containerd \
  --sandbox type=gvisor

执行以下变量替换操作:

  • NODE_POOL_NAME:新节点池的名称。
  • CLUSTER_NAME:您的集群的名称。
  • NODE_VERSION:用于节点池的版本。
  • MACHINE_TYPE:用于节点的机器类型
  • CONTROL_PLANE_LOCATION:集群控制平面的位置

如需详细了解如何使用 gVisor,请参阅使用 GKE Sandbox 隔离工作负载

存储快照

Pod 快照存储在 Cloud Storage 存储桶中,其中包含内存和(可选)GPU 状态。Pod 快照需要 Workload Identity Federation for GKE 来启用并使用 Pod 的服务账号向 Cloud Storage 进行身份验证。

Pod 快照要求存储桶具有以下配置:

  • 分层命名空间:必须启用此功能,才能实现更高的每秒读写查询次数。分层命名空间还要求启用统一存储桶级访问权限
  • 软删除:由于 Pod 快照使用并行复合上传,因此您应停用软删除等数据保护功能。如果这些功能保持启用状态,则临时对象的软删除操作可能会大幅增加您的存储空间费用。
  • 位置:Cloud Storage 存储桶位置必须与 GKE 集群位置相同,因为如果跨不同区域传输快照,性能可能会受到影响。

如需同时创建必需的存储桶和权限,请完成以下步骤:

  1. 创建 Cloud Storage 存储分区。 以下命令会创建一个具有所需配置的存储桶:

    gcloud storage buckets create "gs://BUCKET_NAME" \
       --uniform-bucket-level-access \
       --enable-hierarchical-namespace \
       --soft-delete-duration=0d \
       --location="LOCATION"
    

    替换以下内容:

    • BUCKET_NAME:存储桶的名称。
    • LOCATION:存储桶的位置。

    如需查看存储桶创建的选项的完整列表,请参阅 buckets create 选项

授予工作负载对 Cloud Storage 存储桶的访问权限

默认情况下,GKE 无权访问 Cloud Storage。 如需读取和写入快照文件,您必须向工作负载 Pod 使用的 Kubernetes 服务账号 (KSA) 授予包含相应权限的 IAM 角色,或授予短期令牌

向特定 Kubernetes 服务账号授予角色

  1. 获取凭据,以便您可以使用 kubectl 命令与集群通信:

    gcloud container clusters get-credentials "CLUSTER_NAME"
    
  2. 对于每个 Pod,请完成以下步骤:

    1. 为每个 Pod 创建 KSA:

      kubectl create serviceaccount "KSA_NAME" \
          --namespace "NAMESPACE"
      

      替换以下内容:

      • KSA_NAME:您的 KSA 的名称。
      • NAMESPACE:Pod 的命名空间。
    2. 向 KSA 授予访问相应存储桶的权限:

      gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
          --role="roles/storage.bucketViewer"
      
      gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
          --role="roles/storage.objectUser"
      

      替换以下内容:

      • BUCKET_NAME:存储桶的名称。
      • PROJECT_NUMBER:您的项目编号。
      • PROJECT_ID:您的项目 ID。
      • NAMESPACE:Pod 的命名空间。
      • KSA_NAME:您的 KSA 的名称。

使用短期有效的令牌启用多租户

除了向各个 KSA 授予权限之外,您还可以通过短期、范围受限的令牌启用多租户。这种方法有助于避免与手动 IAM 绑定相关的传播延迟。 您无需向每个 KSA 授予权限,只需向 GKE 节点服务账号授予快照存储桶的 roles/storage.admin 角色一次即可。然后,节点服务账号会根据需要为特定路径创建短期有效令牌。

启用包含 Pod 快照的令牌需要使用 GKE 1.35.3-gke.1737000 版或更高版本。

如需启用多租户,请完成以下步骤:

  1. 如需向节点服务账号授予访问相应存储桶的权限,请运行以下命令:

    gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \
        --member="serviceAccount:service-PROJECT_NUMBER@gcp-sa-gkenode.s3ns-system.iam.gserviceaccount.com" \
        --role="roles/storage.admin"
    
  2. 为快照配置存储空间时,将 tokenSource 字段的值设置为 federatedP4SA

向 Pod 快照控制器授予对 Cloud Storage 存储桶的访问权限

为了允许 Pod 快照控制器删除 Cloud Storage 存储桶中的快照,需要向 GKE 服务代理授予项目的 Storage Object User (roles/storage.objectUser) 角色。通过运行以下命令来授予 roles/storage.objectUser 角色:

gcloud projects add-iam-policy-binding "PROJECT_ID" \
  --member="serviceAccount:service-PROJECT_NUMBER@container-engine-robot.s3ns-system.iam.gserviceaccount.com" \
  --role="roles/storage.objectUser" \
  --condition="expression=resource.name.startsWith(\"projects/_/buckets/BUCKET_NAME\"),title=restrict_to_bucket,description=Restricts access to one bucket only"

替换以下内容:

  • PROJECT_NUMBER:您的项目编号。
  • PROJECT_ID:您的项目 ID。
  • BUCKET_NAME:存储桶的名称。

(可选)为 Cloud Storage 存储桶创建托管式文件夹

创建文件夹可让您隔离互不信任的 Pod 的快照权限,这在多租户使用情形中非常有用。如需设置受管理的文件夹,请完成以下步骤:

  1. 创建一个自定义 IAM 角色,其中仅包含 Pod 快照所需的必要权限:

    gcloud iam roles create podSnapshotGcsReadWriter \
        --project="PROJECT_ID" \
        --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"
    
  2. 向目标命名空间中的所有 KSA 授予 roles/storage.bucketViewer 角色。此角色允许 KSA 读取存储桶元数据,但不授予对存储桶中对象的读取或写入权限。

    gcloud storage buckets add-iam-policy-binding "gs://BUCKET_NAME" \
        --member="principalSet://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/namespace/NAMESPACE" \
        --role="roles/storage.bucketViewer"
    

    替换以下内容:

    • BUCKET_NAME:存储桶的名称。
    • PROJECT_NUMBER:您的项目编号。
    • PROJECT_ID:您的项目 ID。
    • NAMESPACE:Pod 的命名空间。
  3. 对于需要存储 Pod 快照的每个 KSA,请完成以下步骤:

    1. 为 KSA 创建一个受管理的文件夹:

      gcloud storage managed-folders create "gs://BUCKET_NAME/FOLDER_PATH/"
      

      替换以下内容:

      • BUCKET_NAME:存储桶的名称。
      • FOLDER_PATH:受管理的文件夹的路径,例如 my-app-snapshots
    2. 向 KSA 授予受管文件夹的自定义 podSnapshotGcsReadWriter 角色:

      gcloud storage managed-folders add-iam-policy-binding "gs://BUCKET_NAME/FOLDER_PATH/" \
          --member="principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.s3ns.svc.id.goog/subject/ns/NAMESPACE/sa/KSA_NAME" \
          --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"
      

      替换以下内容:

      • BUCKET_NAME:存储桶的名称。
      • FOLDER_PATH:受管理的文件夹的路径,例如 my-app-snapshots
      • PROJECT_NUMBER:您的项目编号。
      • PROJECT_ID:您的项目 ID。
      • NAMESPACE:Pod 的命名空间。
      • KSA_NAME:您的 KSA 的名称。

为快照配置存储空间

如需指定快照文件的存储位置,请创建 PodSnapshotStorageConfig 资源。

  1. 以下示例将 GKE 配置为将 Pod 快照存储在 Cloud Storage 存储桶 BUCKET_NAME 内的 FOLDER_PATH/ 路径中。将以下清单保存为 example-pod-snapshot-storage-config

    apiVersion: podsnapshot.gke.io/v1
    kind: PodSnapshotStorageConfig
    metadata:
      name: example-pod-snapshot-storage-config
    spec:
      snapshotStorageConfig:
        gcs:
          bucket: "BUCKET_NAME"
          path: "FOLDER_PATH"
          tokenSource: "TOKEN_SOURCE"
    

    替换以下内容:

    • BUCKET_NAME:Cloud Storage 存储桶的名称。
    • FOLDER_PATH:Cloud Storage 受管文件夹的路径。
    • TOKEN_SOURCE:用于访问的身份提供方。使用 podKSA(默认)或 federatedP4SA 实现多租户。
  2. 应用清单:

    kubectl apply -f example-pod-snapshot-storage-config.yaml
    

后续步骤