容量缓冲区可让您主动在集群中声明活跃或备用容量缓冲区的层级,从而帮助您缩短 Google Kubernetes Engine (GKE) 工作负载的 Pod 启动延迟时间。通过提前声明备用容量,您可以经济高效地更快启动工作负载。
本文档介绍了容量缓冲区的工作原理。如需了解如何启用和使用 容量缓冲区,请参阅配置容量缓冲区。
何时使用容量缓冲区
对于对启动延迟时间敏感且需要快速扩缩的应用,请使用容量缓冲区。当流量突然增加时,活跃缓冲区会提供专为低延迟伸缩而预配的容量。当流量持续增加时,备用缓冲区会以比预配更经济实惠的方式提供 Pod 调度。
容量缓冲区具有以下优势:
- 最大限度地缩短伸缩延迟时间:活跃缓冲区提供正在运行的节点,有助于 最大限度地缩短延迟时间。备用缓冲区可快速恢复,与活跃缓冲区相比,以更低的费用提供比新节点更快的容量可用性。
- 经济高效的过度预配:容量缓冲区可帮助您维持 安全网。对于大规模工作负载,这种方法通常比其他过度预配方法(例如降低 HorizontalPodAutoscaler (HPA) 利用率目标)更 经济高效,因为其他方法可能会随着集群的增长而线性增加 空闲容量。
- 满足工作负载要求 :您可以完全控制容量缓冲区的配置。您可以选择纳入自定义守护进程集来预加载映像、调整启动时间以及控制缓冲区大小以满足您的需求。
对于需要快速纵向扩缩的延迟敏感型工作负载,我们建议使用容量缓冲区,例如 AI 代理、AI 推理、销售活动期间的零售应用或玩家活动高峰期间的游戏服务器。
容量缓冲区的工作原理
如需实现容量缓冲区,请使用 Kubernetes CapacityBuffer 自定义资源来定义备用容量缓冲区。GKE 集群自动扩缩器会监控 CapacityBuffer 资源,并将其视为待处理需求,以帮助确保备用容量可用。如果集群的容量不足以满足缓冲区中定义的资源请求,集群自动扩缩器会预配额外的节点。
当高优先级工作负载纵向扩缩时,GKE 会立即在缓冲区中的可用容量上调度工作负载。这种即时调度适用于缓冲区中预留的副本数或资源量,避免了与节点预配相关的典型延迟。当工作负载使用缓冲区单元时,集群自动扩缩器会预配一个新节点来重新填充缓冲区。
容量缓冲区策略
您可以根据对延迟时间和费用的要求,使用不同的预配策略来配置容量缓冲区。
活跃缓冲区
活跃缓冲区为适合预留容量的工作负载提供正在运行的节点,以实现低延迟伸缩。 由于节点已在运行,因此在扩缩事件期间,它们可以最大限度地缩短声明 Pod 的延迟时间。
备用缓冲区
备用缓冲区提供已暂停的节点。 与活跃策略相比,备用策略更经济实惠,但在接受工作负载之前,需要短暂延迟才能恢复节点。
费用和价格
容量缓冲区的结算方式因缓冲区类型而异:
- 活跃缓冲区:对于 GKE 维护的用于充当 活跃缓冲区容量的正在运行的虚拟机,您需要支付标准 GKE 计算 费用。在 Autopilot 上,标准 Pod 结算费率适用于正在运行的 Pod。
- 备用缓冲区:当虚拟机实例暂停时,您无需支付计算 费用(CPU 或内存)。您需要支付少量存储费用(例如虚拟机启动磁盘)以及关联资源的费用,例如静态外部 IP 地址。当 GKE 恢复备用虚拟机以托管工作负载时,将适用标准计算或基于 Pod 的结算费率。
CapacityBuffer CRD
如需配置容量缓冲区,您可以创建 CapacityBuffer CustomResourceDefinition (CRD)。您可以配置容量缓冲区以满足不同的条件:
- 固定副本:根据 引用的 Pod 模板的资源请求,指定要创建的缓冲区 Pod 的固定数量。此配置是创建已知大小的缓冲区的最简单方法。
- 资源限制:指定 缓冲区应预留的 CPU 和内存总量。控制器会根据引用的 Pod 模板的资源请求计算要创建的缓冲区 Pod 的数量。
- 基于百分比:将缓冲区空间定义为现有 可扩容对象的百分比,该对象定义了伸缩子资源(例如 Deployment、 StatefulSet、ReplicaSet 或 Job)。缓冲区空间会随着引用工作负载的扩缩而动态调整。基于百分比的容量缓冲区仅 适用于实现 Kubernetes 扩缩子资源的对象。
如需了解详情,请参阅 CapacityBuffer CRD 参考文档。
最佳实践
如需在配置容量缓冲区时优化成本效益和响应能力,请使用以下建议:
- 使用成本最优的“备用优先”策略:如果 您的工作负载可以容忍大约 30 秒的短暂扩缩延迟时间,请优先使用备用缓冲区。此策略可避免新虚拟机的冷节点启动,而无需承担活跃虚拟机的全部费用。
- 对于延迟敏感型工作负载,请使用活跃缓冲区:对于 无法容忍节点恢复时间的工作负载,请使用活跃缓冲区,因为 Pod 调度时间必须尽可能短。
- 使用混合策略来平衡性能和费用:将小型活跃 缓冲区与大型备用缓冲区相结合,以实现经济高效的设置。 GKE 会优先从备用缓冲区恢复节点(大约需要 30 秒)来重新填充活跃缓冲区,同时在后台预配新节点来回填备用缓冲区。此设置使用活跃容量来吸收初始峰值,并使用费用较低的备用容量来适应持续增长。
- 调整活跃缓冲区的大小以应对初始突发流量:定义活跃 缓冲区的大小,以涵盖您预计会遇到的初始突发副本峰值, 然后再恢复备用缓冲区节点。
- 调整备用缓冲区的大小以应对持续负载:定义足以涵盖您预计会遇到的扩展负载的备用缓冲区,以便缓冲区可以从冷启动在后台重新填充。大小足够的备用缓冲区可以将 Pod 调度的最大延迟时间缩短到恢复节点所需的时间,大约为 30 秒。当容量缓冲区开始使用并重新填充时,新的缓冲区节点会在暂停之前转换为活跃状态。此策略有助于在长时间负载期间提升活跃容量。
- 使用缓冲区模拟器:尝试使用不同的活跃和备用 缓冲区大小,以获得特定工作负载的最佳结果。使用开源 GKE 缓冲区 模拟器 (https://github.com/gke-labs/buffers-simulator) 运行工作负载伸缩行为 模拟,以微调 缓冲区大小调整规则并实现性能目标。
要求和限制
容量缓冲区具有以下要求和限制:
- 对于活跃缓冲区,容量缓冲区适用于运行 1.35.2-gke.1842000 版或更高版本的 GKE 集群;对于备用缓冲区,容量缓冲区适用于运行 1.36.0-gke.2253000 版或更高版本的 GKE 集群。
- 容量缓冲区仅支持对选择特定硬件的 Standard 节点池和 Autopilot 节点池使用 基于节点的结算模式的工作负载。容量缓冲区不支持 使用 基于 Pod 的结算模式的工作负载。
- 在 Standard 集群上,我们建议您启用 节点自动预配。借助节点自动预配,集群自动扩缩器可以根据 CapacityBuffer 中的资源请求创建新的节点池。如果您未启用节点自动预配,集群自动扩缩器只会纵向扩缩现有节点池。
- 活跃和备用容量缓冲区都会计入 Compute Engine 配额。
- 如果您的 CapacityBuffer 配置依赖项(例如 PodTemplate)选择自定义 ComputeClass,则该依赖项必须定义在预配的节点上进行调度所需的任何容忍设置、节点选择器或运行时类(例如 GKE Sandbox 的要求)。如需查看相关说明,请参阅 自定义 ComputeClass 文档。
备用缓冲区还有以下额外限制:
- 它们在启用了节点自动预配的 Standard 集群上受支持。
- 它们在运行 1.36.0-gke.2853000 版或更高版本的 Autopilot 集群上受支持。
- 不支持挂接了 GPU 或 TPU 的节点。
- 不支持本地 SSD。
- 机密 Google Kubernetes Engine 节点不受支持。
- 您应该熟悉与 Compute Engine 暂停和恢复操作相关的限制。
一些主要限制包括:
- 不支持具有客户提供的加密密钥 (CSEK) 保护的磁盘的节点。
- 不支持内存超过 208 GB 的节点。
- 不支持裸金属实例。
- 节点操作系统必须支持 ACPI S3 休眠信号。
- 暂停过程的长度与内存大小成正比。
- 恢复取决于恢复所需的基础资源的可获取性。
后续步骤
- 如需了解如何实现容量缓冲区,请参阅配置容量缓冲区。