容量缓冲简介

容量缓冲区可让您主动在集群中声明分层的有效或备用容量缓冲区,从而帮助您缩短 Google Kubernetes Engine (GKE) 工作负载的 Pod 启动延迟时间。通过提前声明备用容量,您可以经济高效地更快启动工作负载。

本文档介绍了容量缓冲区的运作方式。如需了解如何启用和使用容量缓冲,请参阅配置容量缓冲

何时使用容量缓冲

对于对启动延迟敏感且需要快速扩缩的应用,请使用容量缓冲区。当流量突然增加时,有效缓冲区可提供预先配置的容量,旨在实现低延迟伸缩。当流量持续增加时,与预先配置相比,备用缓冲区可以更经济实惠地调度 Pod。

容量缓冲具有以下优势:

  • 最大限度地减少伸缩延迟时间:活跃缓冲区提供正在运行的节点,有助于最大限度地减少延迟时间。备用缓冲区可快速恢复,与全新节点相比,能以更低的成本更快地提供容量,但不如活跃缓冲区。
  • 经济高效的过度配置:容量缓冲区有助于您维持安全网。对于大规模工作负载,与其他过度配置方法(例如,降低 HorizontalPodAutoscaler (HPA) 利用率目标)相比,此方法通常更经济高效,因为随着集群规模的扩大,其他方法可能会线性增加闲置容量。
  • 满足工作负载要求:您可以完全控制容量缓冲配置。您可以选择纳入自定义 DaemonSet 来预加载映像、调整启动时间,以及控制缓冲区大小以满足您的需求。

我们建议为需要快速扩容的延迟敏感型工作负载(例如 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 scale 子资源的对象。

如需了解详情,请参阅 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 配额

备用缓冲区还存在以下限制:

  • 它们仅在启用了节点自动预配功能的 Standard 集群上受支持。
  • 不支持附加了 GPU 或 TPU 的节点。
  • 不支持本地 SSD。
  • 不支持客户管理的加密密钥 (CMEK)。
  • 不支持机密 Google Kubernetes Engine 节点
  • 您应该熟悉与 Compute Engine 暂停和恢复操作相关的限制。以下是一些主要限制:
    • 不支持具有受客户提供的加密密钥 (CSEK) 保护的磁盘的节点。
    • 不支持内存超过 208 GB 的节点。
    • 不支持裸金属实例。
    • 节点操作系统必须支持 ACPI S3 休眠信号。
    • 暂停进程的长度与内存大小成正比。
    • 恢复取决于恢复所需的基础资源是否可获取。

后续步骤