借助 Google Kubernetes Engine (GKE) Pod 快照,您可以保存和恢复正在运行的 Pod 状态,从而缩短工作负载启动延迟时间。在捕获工作负载的快照之前,您必须准备好集群和存储环境。
本文档介绍了如何在集群上启用和配置 Pod 快照,以及如何设置 Cloud Storage 来存储快照。如需详细了解 Pod 快照的工作原理,请参阅 GKE Pod 快照简介。
平台管理员和运维人员以及应用开发者可以使用本文档来配置集群、创建存储桶以及为 Pod 快照设置访问权限。如需详细了解我们在 内容中提及的常见角色和 Cloud de Confiance by S3NS 示例任务,请参阅 常见的 GKE 用户角色和 任务。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,
安装并
初始化
gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行
gcloud components update命令来获取最新 版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
启用 Pod 快照
您可以在新集群或现有集群上启用 Pod 快照。Pod 快照 需要 GKE Sandbox 和 Workload Identity Federation for GKE。 Autopilot 集群默认启用这两项功能。对于 Standard 集群,您必须在集群上启用 Workload Identity Federation for GKE,并配置节点池以在 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.35.3-gke.1234000 版或更高版本:
gcloud container clusters upgrade CLUSTER_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATION替换以下内容:
CLUSTER_NAME:您的 集群的名称。CLUSTER_VERSION:要将集群升级到的版本,必须为 1.35.3-gke.1234000 或更高版本。CONTROL_PLANE_LOCATION:集群控制平面的 位置。
在集群上启用 Pod 快照:
gcloud container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION替换以下内容:
CLUSTER_NAME:您的 集群的名称。CONTROL_PLANE_LOCATION:集群控制平面的 位置。
具有默认 whole-pod 范围的 Pod 快照不支持 E2 机器类型,而文件系统快照 (rootfs-only) 支持。在 Autopilot 集群中,GKE 可能会默认将 Pod 调度到 E2 节点。如果您使用 whole-pod 范围,请使用
ComputeClass 自定义资源,以确保工作负载在
兼容的硬件上运行。
如需创建和使用 ComputeClass 自定义资源,请按照以下步骤操作:
将以下清单保存为
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应用清单:
kubectl apply -f non-e2-class.yaml在 Pod 规范中,引用 ComputeClass 自定义资源 ,方法是使用
cloud.google.com/compute-class节点选择器:spec: nodeSelector: cloud.google.com/compute-class: non-e2-class # Multiple lines are omitted here
标准版
如需在新集群上启用 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.35.3-gke.1234000 版或更高版本:
gcloud container clusters upgrade CLUSTER_NAME \ --node-pool=NODE_POOL_NAME \ --cluster-version=CLUSTER_VERSION \ --location=CONTROL_PLANE_LOCATION替换以下内容:
CLUSTER_NAME:您的 集群的名称。NODE_POOL_NAME:您的 节点池的名称。CLUSTER_VERSION:要将集群升级到的版本,必须为 1.35.3-gke.1234000 或更高版本。CONTROL_PLANE_LOCATION:集群控制平面的 位置。
在集群上启用 Pod 快照:
gcloud beta container clusters update CLUSTER_NAME \ --enable-pod-snapshots \ --location=CONTROL_PLANE_LOCATION替换以下内容:
CLUSTER_NAME:您的 集群的名称。CONTROL_PLANE_LOCATION:集群控制平面的 位置。
如需在 Standard 集群上的 GKE Sandbox 中运行 Pod,您必须创建或更新启用了 GKE Sandbox 的节点池。如需更新节点池,请使用 --sandbox type=gvisor 标志。如需创建启用了 GKE Sandbox 的节点池,请运行以下命令:
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:集群控制平面的位置 。
如需详细了解 GKE Sandbox,请参阅 利用 GKE Sandbox 强化工作负载隔离。
存储快照
GKE 会将 Pod 快照存储在 Cloud Storage 存储桶中。每个快照都包含应用内存,还可以选择包含 Pod 的 GPU 状态。如需向 Cloud Storage 进行身份验证,Pod 快照会使用 Pod 的 ServiceAccount 对象,这需要 Workload Identity Federation for GKE。
Pod 快照需要以下存储桶配置:
- 分层命名空间:您必须启用分层命名空间 以支持更高的每秒读写查询次数。分层 命名空间还需要您启用 统一存储桶级访问权限。
- 软删除:由于 Pod 快照使用 并行复合上传,因此请停用软删除等数据保护功能。如果您保留启用这些功能,则临时对象的软删除可能会大幅增加您的存储空间费用。
- 位置:Cloud Storage 存储桶位置必须与 GKE 集群位于 同一位置,因为跨不同区域传输 快照可能会影响性能。
如需创建具有所需配置的存储桶,请运行以下命令:
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 快照,您必须向工作负载 Pod 使用的 Kubernetes ServiceAccount 对象授予包含相应权限的 IAM 角色 ,或者使用 短期有效令牌启用多租户。
向特定 Kubernetes ServiceAccount 对象授予角色
如需向特定 Kubernetes ServiceAccount 对象授予角色,请按照以下步骤操作:
如需使用
kubectl命令与集群通信,请获取集群的凭据:gcloud container clusters get-credentials CLUSTER_NAME \ --location=CONTROL_PLANE_LOCATION替换以下内容:
CLUSTER_NAME:集群的名称。CONTROL_PLANE_LOCATION:集群控制平面的位置 。
对于每个 Pod,请按照以下步骤操作:
创建 ServiceAccount 对象:
kubectl create serviceaccount SERVICEACCOUNT_NAME \ --namespace=NAMESPACE替换以下内容:
SERVICEACCOUNT_NAME:ServiceAccount 对象的名称。NAMESPACE:Pod 的命名空间。
如需让 ServiceAccount 对象读取存储桶元数据,请向其授予 Storage Bucket Viewer 角色 (
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/SERVICEACCOUNT_NAME" \ --role="roles/storage.bucketViewer"替换以下内容:
BUCKET_NAME:存储桶的名称。PROJECT_NUMBER:您的项目编号。PROJECT_ID:您的项目 ID。NAMESPACE:Pod 的命名空间。SERVICEACCOUNT_NAME:ServiceAccount 对象的名称。
如需让 ServiceAccount 对象读取和写入 存储桶中的快照对象,请向其授予 Storage Object User 角色 (
roles/storage.objectUser):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/SERVICEACCOUNT_NAME" \ --role="roles/storage.objectUser"
使用短期有效令牌启用多租户
除了向各个 ServiceAccount 对象授予权限之外,您还可以使用短期有效且范围受限的令牌启用多租户。这种方法有助于避免与手动 IAM 绑定相关的传播延迟。您无需向每个
ServiceAccount 对象授予权限,只需向 GKE 节点服务帐号授予快照存储桶的
Storage Admin 角色 (roles/storage.admin) 即可。然后,节点服务帐号会根据需要为特定路径创建短期有效令牌。
如需使用 Pod 快照启用令牌,您需要使用 GKE 1.35.3-gke.1737000 版或更高版本。
如需启用多租户,请按照以下步骤操作:
如需授予节点服务帐号使用存储桶的权限,请运行以下命令:
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"替换以下内容:
BUCKET_NAME:存储桶的名称。PROJECT_NUMBER:您的项目编号。
在为快照配置存储空间时,请将
tokenSource字段的值设置为federatedP4SA。
授予 Pod 快照控制器对 Cloud Storage 存储桶的访问权限
如需让 Pod 快照控制器删除
Cloud Storage 存储桶中的快照,您必须向
项目中的
GKE 服务代理授予Storage Object User 角色 (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_ID:您的项目 ID。PROJECT_NUMBER:您的项目编号。BUCKET_NAME:存储桶的名称。
可选:为 Cloud Storage 存储桶创建托管式文件夹
如需将快照的权限与互不信任的 Pod 隔离(这在多租户用例中非常有用),请创建托管式文件夹。如需设置托管式文件夹,请按照以下步骤操作:
创建一个自定义 IAM 角色,其中仅包含 Pod 快照所需的权限:
gcloud iam roles create podSnapshotGcsReadWriter \ --project=PROJECT_ID \ --permissions="storage.objects.get,storage.objects.create,storage.objects.delete,storage.folders.create"将
PROJECT_ID替换为您的项目 ID。向目标命名空间中的所有 ServiceAccount 对象授予 Storage Bucket Viewer 角色 (
roles/storage.bucketViewer) 。借助此角色,ServiceAccount 对象可以读取存储桶元数据,但无法读取或写入存储桶中的对象。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 的命名空间。
对于需要存储 Pod 快照的每个 ServiceAccount 对象,请按照以下步骤操作:
为 ServiceAccount 对象创建托管式文件夹:
gcloud storage managed-folders create gs://BUCKET_NAME/FOLDER_PATH/替换以下内容:
BUCKET_NAME:存储桶的名称。FOLDER_PATH:托管式文件夹的路径(例如my-app-snapshots)。
向 ServiceAccount 对象授予托管式文件夹的自定义
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/SERVICEACCOUNT_NAME" \ --role="projects/PROJECT_ID/roles/podSnapshotGcsReadWriter"替换以下内容:
BUCKET_NAME:存储桶的名称。FOLDER_PATH:托管式文件夹的路径(例如my-app-snapshots)。PROJECT_NUMBER:您的项目编号。PROJECT_ID:您的项目 ID。NAMESPACE:Pod 的命名空间。SERVICEACCOUNT_NAME:ServiceAccount 对象的名称。
为快照配置存储空间
如需指定 Pod 快照的存储位置,请创建 PodSnapshotStorageConfig 自定义资源:
将以下清单保存为
example-pod-snapshot-storage-config.yaml。此示例将 GKE 配置为将 Pod 快照存储在FOLDER_PATH/路径中,该路径位于 Cloud Storage 存储桶BUCKET_NAME内: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。
应用清单:
kubectl apply -f example-pod-snapshot-storage-config.yaml
后续步骤
了解如何触发 Pod 快照。