容量缓冲简介

容量缓冲区可让您主动在集群中声明活跃或备用容量缓冲区的层级,从而帮助您缩短 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 休眠信号。
    • 暂停过程的长度与内存大小成正比。
    • 恢复取决于恢复所需的基础资源的可获取性。

后续步骤