Google Kubernetes Engine (GKE) Pod 快照通过恢复正在运行的 Pod 的快照,帮助缩短工作负载启动延迟时间。Pod 快照会保存整个 Pod 状态,包括内存和文件系统更改。当您创建新副本时,它们会从快照中恢复,从而让工作负载恢复运行,而不是从新状态开始。此功能有助于横向伸缩工作负载,例如将大权重加载到内存中的 AI 推理模型或加载大量依赖项的应用。
通过本文档,您可以了解 GKE Pod 快照的工作原理,并评估您的工作负载是否可以从中受益。
平台管理员、运维人员和应用开发者可以使用本文档评估工作负载兼容性、规划快照存储政策,以及了解 GKE 如何管理检查点和恢复。如需详细了解我们在Google Cloud 内容中提及的常见角色和示例任务,请参阅常见的 GKE 用户角色和任务。
如需在集群中准备和使用 Pod 快照,请参阅以下指南:
何时使用 Pod 快照
对初始化时间较长的工作负载使用 Pod 快照。 例如,将大型模型加载到 CPU 或 GPU 内存中的 AI 推理工作负载,或加载许多库和依赖项的大型应用。启动时间已经很快的工作负载通常不会从 Pod 快照中受益。
Pod 快照的工作原理
GKE Pod 快照会存储 Pod 在特定时间的进程状态的精确副本。创建新副本时,GKE 不会从全新状态初始化 Pod,而是从快照恢复 Pod。此恢复意味着 Pod 会从拍摄快照的时间点恢复执行。
如需以声明方式配置 Pod 快照,您需要创建 Kubernetes 自定义资源来定义快照行为。在每个 GKE 节点上运行的代理会管理快照生命周期。根据您定义的政策,代理会确定何时创建新快照,以及何时使用现有快照来恢复新 Pod。在 GKE 控制平面上运行的控制器会清理过时的快照并解决问题。Cloud Storage 用于存储 Pod 快照。
快照内容
下表列出了 Pod 快照包含和不包含的内容:
| 类别 | 已包含 | 已排除 |
|---|---|---|
| 应用状态 |
|
无(所有内存中进程状态都会被捕获) |
| 文件系统 |
|
|
| 网络 |
|
|
自定义资源
如需以声明方式配置 Pod 快照,请使用以下自定义资源:
- PodSnapshotStorageConfig:指定快照的存储位置。仅支持 Cloud Storage 存储桶。
- PodSnapshotPolicy:根据 Kubernetes 标签选择器定义要创建快照的 Pod。此自定义资源包含该功能的大多数配置选项,包括快照的触发方式、快照范围和保留政策。
- PodSnapshotManualTrigger(可选):如果您不使用工作负载触发器,请定义一个手动触发器,以便为特定 Pod 创建快照。
如需了解参考规范,请参阅 PodSnapshot CustomResourceDefinition 参考文档。
快照触发器
您可以通过以下方式触发 Pod 快照:
- 工作负载触发器:Pod 内的应用向 GKE 代理发出信号,表明它已准备好创建快照。此类触发器在工作负载周期内执行一次,例如在工作负载就绪状态下执行。此方法最适合缩短横向伸缩工作负载的启动延迟时间。
- 手动触发器:您可以通过创建 PodSnapshotManualTrigger 自定义资源,按需为特定 Pod 触发快照。此类触发器可以根据需要执行任意次数。如果您无法修改应用来发出就绪信号,则此方法最适合。
快照匹配和兼容性
为确保快照与恢复的工作负载兼容,GKE 会在原始检查点 Pod 与目标 Pod 之间执行兼容性匹配。
GKE 使用以下规则来确定兼容性:
- 选择顺序:默认情况下,GKE 会从与 Pod 的命名空间和配置匹配的最新 PodSnapshot 自定义资源中恢复工作负载。
- 匹配条件:兼容性检查取决于 PodSnapshotPolicy 自定义资源(
whole-pod或rootfs-only)中配置的快照范围。
whole-pod 范围匹配(默认)
对于具有默认 whole-pod 范围的政策,GKE 会检查以下内容:
提炼的规范哈希:GKE 会根据 Pod 规范中的基本运行时字段生成唯一哈希。为了成功恢复,目标 Pod 必须从其提取的规范中生成相同的哈希。此检查会验证已设置检查点和已恢复的 Pod 在运行时配置方面是否相同。
Pod 对象中的以下字段是精简规范的一部分,会影响唯一哈希:
metadata:annotations:仅与 GKE Sandbox 相关的注解(例如以dev.gvisor.*前缀开头的注解)。labels:batch.kubernetes.io/job-completion-index
spec:volumes:name、volumeSource、hostPath、persistentVolumeClaim、configMapcontainers:nameimagecommandargsworkingDirports:name,containerPort,protocolvolumeMounts:name、readOnly、recursiveReadOnly、mountPath、subPath、mountPropagation、subPathExprvolumeDevices:namelifecycle:postStart、preStopterminationMessagePathterminationMessagePolicysecurityContext(和所有子字段)stdinstdinOncetty
initContainers:与containers相同的子字段。dnsPolicyautomountServiceAccountTokenhostNetworkhostPIDhostIPCshareProcessNamespacesecurityContextdnsConfigruntimeClassNameoshostUsers
硬件兼容性:目标 Pod 必须在与设置了检查点的 Pod 具有相同机器系列、CPU 供应商和 CPU 特征集(
CPUID标志)的节点上运行。例如,两个节点必须使用相同的 N2 或 G2 系列以及相同的 Intel 或 AMD 处理器功能。GKE Sandbox 会在恢复进程内存和 CPU 状态之前验证 CPU 功能,因此具有whole-pod范围的快照无法恢复到具有不同 CPU 功能的节点上。版本兼容性:GKE Sandbox 内核版本和 GPU 驱动程序版本必须与原始快照中捕获的版本一致。
rootfs-only 个范围匹配
使用 rootfs-only 范围(在 GKE 1.35.3-gke.1031000 版及更高版本中提供)配置政策时,匹配要求不那么严格:
- GKE 不会计算或比较提炼后的 Pod 规范哈希。通过这种宽松匹配,您可以将快照恢复到具有不同资源、环境或其他配置字段的目标 Pod。但是,底层容器映像和节点版本必须兼容。
- 由于进程内存不会恢复,因此您可以将一个机器家族上创建的快照恢复到其他机器家族(包括 E2 机器类型)。
匹配的分组规则
如果政策使用 snapshotGroupingRules 字段按特定标签值(例如租户或环境)对快照进行分组,则恢复的 Pod 必须具有匹配的标签键和值。Pod 快照控制器仅从匹配组中选择快照。如需详细了解如何设置分组标签,请参阅配置其他 Pod 快照政策设置。
恢复准备状态和后台加载
从快照恢复 Pod 时,系统会先恢复 GKE Sandbox 内核,这通常需要几秒钟的时间。为了最大限度地缩短启动延迟时间,应用会在内核恢复后立即恢复。它不会等待应用内存完全加载。应用内存会使用后台流式传输机制进行恢复。
如果应用尝试读取尚未加载的内存部分,则会发生缺页错误。GKE Sandbox 会拦截此故障,暂停应用线程,并立即从存储空间中提取所需的内存页。这种按需提取的优先级高于后台流。
由于这种后台加载,如果应用请求未流式传输的内存,则在恢复后的前几秒内,内存访问可能会出现短暂的延迟。当内存状态完全同步时,此延迟时间会消失。
这种后台加载行为也适用于 GPU 状态。例如,大语言模型 (LLM) Pod 可能会显示为 Running 状态并响应网络检查,即使其 GPU 内存仍在填充中。在 GPU 状态完全恢复之前,模型无法完全响应推理。由于存在这种延迟,因此在衡量恢复速度时,请务必在模型服务器准备好处理请求时进行衡量。您可以使用首个词元生成时间 (TTFT) 或 Pod 就绪性探测等指标来验证模型服务器就绪情况。
GPU 状态
Pod 快照支持捕获 GPU 的状态。当您为使用 GPU 的 Pod 触发快照时,NVIDIA cuda-checkpoint 工具会将 GPU 状态保存到进程内存中。此步骤有助于确保 GPU 上存储的数据(例如模型权重)包含在快照中。GKE 会暂停 Pod 并创建快照。在恢复期间,GKE 会反向执行此操作。
由于 GPU 状态会写入进程内存,因此在快照和恢复操作期间,Pod 内存用量会增加。在为 Pod 设置内存限制时,请考虑这一额外的内存要求。
恢复的 Pod 的注意事项
从 Kubernetes API 的角度来看,系统会创建一个新的 Pod 对象。 Pod 启动时,如果 Pod 有对应的快照,则 GKE 会从该快照恢复 Pod,包括原始内存和进程状态。不过,Pod 状态的某些方面必须发生变化,才能作为新的唯一实例运行。
请考虑恢复后的以下状态变化:
- 网络接口:恢复的 Pod 会收到新的 IP 地址。所有接口和路由都会重新配置。在恢复时,快照时存在的活动网络连接会关闭。监听套接字、环回连接和 Unix 网域套接字连接会继续运行。
- 主机名:恢复的 Pod 会采用新身份并接收新主机名。
- 实际用时:实际用时会跳到当前时间。
- 应用状态:每个 Pod 的应用状态必须是唯一的(例如实验 ID 或随机数种子),并且必须在恢复后重新初始化。
- Secret:必须重新创建在创建快照之前创建的加密密钥和证书。
- 环境变量:您可以在快照和恢复之间更改环境变量。不过,由于环境变量存储在应用内存中,因此 GKE Sandbox 无法可靠地找到并替换它们。如果您的工作负载在恢复后依赖于新的环境变量,则 Pod 必须手动刷新这些变量。新环境变量可在
/proc/gvisor/spec_environ文件中找到。文件格式与/proc/<pid>/environ相同。
多租户和身份
Pod 快照需要为每个 Pod 的 Kubernetes ServiceAccount 对象手动绑定 Identity and Access Management (IAM),才能使用 Cloud Storage。手动 IAM 绑定可能需要一些时间才能传播,如果您需要在创建 Pod 后立即创建快照,这可能会是一个问题。
为了解决延迟问题并简化多租户管理,您可以使用 GKE 节点服务账号按需创建短期令牌,而不是手动将 IAM 绑定到 ServiceAccount 对象。如需使用此方法配置 Pod 快照,请在 PodSnapshotStorageConfig 自定义资源中使用 tokenSource 字段,并指定以下值之一:
podKSA(默认):在 Pod 的 ServiceAccount 对象和 Cloud Storage 存储桶之间使用手动 IAM 绑定。federatedP4SA:使用由节点服务账号创建的路径专用令牌。
要求
如需使用 GKE Pod 快照,请确保您满足以下要求:
- Pod 必须在 GKE Sandbox 中运行,因为 Pod 快照依赖于 GKE Sandbox 提供的隔离环境。
- 对于默认的
whole-pod快照范围,Pod 恢复到的节点必须与创建快照的节点具有相同的机器系列、CPU 供应商和 CPU 功能。仅限 CPU 的工作负载可以使用 GKE Sandbox 支持的任何非 E2 机器系列,只要满足这些硬件兼容性要求即可。如需了解详情,请参阅限制。 - 如需将 GPU 与 Pod 快照搭配使用,您还必须满足以下要求:
- 单 GPU Pod 在单 GPU 节点和多 GPU 节点上均受支持。
- 只有 L4 GPU(
g2-standard-*机器类型)支持多 GPU Pod。 - 在 GKE 1.35.0-gke.1738000 版及更早版本中,在多 GPU 节点上运行的 Pod 必须使用该节点上可用的所有 GPU。在 1.35.0-gke.1738000 及更高版本中,Pod 可以使用节点上的部分 GPU。
- 对于 GPU 工作负载,您必须使用以下受支持的 GPU 机器类型之一:
g2-standard-4(1 x L4)g2-standard-8(1 x L4)g2-standard-12(1 x L4)g2-standard-16(1 x L4)g2-standard-32(1 x L4)g2-standard-48(4 x L4)g2-standard-96(8 x L4)a2-highgpu-1g(1 x A100-40GB)a2-ultragpu-1g(1 x A100-80GB)a3-highgpu-1g(1 x H100-80GB)
限制
GKE Pod 快照存在以下限制:
- 使用默认
whole-pod快照范围时,快照无法恢复到 CPU 功能(CPUID标志)与创建快照的虚拟机不同的 Compute Engine 虚拟机上:- 具有
whole-pod范围的 Pod 快照不支持 E2 机器系列,也不支持动态混合 Intel 和 AMD 处理器或 CPU 代系的其他机器系列。文件系统快照(rootfs-only范围)支持 E2 机器系列。 - 即使在同一非 E2 机器系列和 CPU 供应商中,Compute Engine 也可能会预配具有不同 CPU 平台或每个虚拟机 CPU 特征集的虚拟机。如果 Pod 被调度到 CPU 特征不匹配的节点上,则恢复具有
whole-pod范围的快照会失败。
- 具有
- 不支持通过多实例 GPU (MIG) 进行 GPU 共享。
- Pod 快照不支持 Cloud Storage FUSE CSI 驱动程序边车容器。
- Pod 快照不支持 TPU。
后续步骤
- 了解如何为 Pod 快照做好准备。