利用 CPU 启动加速功能加快应用启动速度

本文档介绍了如何在 Google Kubernetes Engine (GKE) 中将 CPU 启动加速与 Pod 纵向自动扩缩器 (VPA) 搭配使用,以在 Pod 的初始化阶段暂时增加分配给该 Pod 的 CPU 资源。

CPU 启动加速功能可在初始化期间临时增加 CPU 请求,并在适当位置将其调整回基准水平,从而加快应用启动速度并提高成本效益。本文档介绍了启动加速要求、配置(Pod 和容器级)、验证和最佳实践。

本文档适用于希望优化 GKE 中应用启动性能的 DevOps 工程师、平台工程师和应用开发者。

优势

使用 CPU 启动加速功能可带来以下好处:

  • 更快的启动速度:加快资源密集型应用的初始化速度,例如使用 Java、Node.js 或 Python 编写的应用。
  • 成本效益:避免为稳态运行过度配置 CPU,同时仍能满足启动需求。稳态运行是指应用完成初始化且资源使用量趋于稳定后的时间段。
  • 无中断:使用 Kubernetes 就地 Pod 大小调整 (IPPR) 将资源缩放回基准水平,而无需重启容器。
  • 减少人工工作量:最大限度地减少资源浪费和调整工作负载大小所需的人工工作量。

要求

如需使用 CPU 启动加速功能,您必须满足以下要求:

  • GKE 版本:对于 Standard 和 Autopilot 集群,请使用 1.36.0-gke.4447000 及更高版本。
  • 已启用 VPA:在 Standard 集群上启用 Pod 纵向自动扩缩。GKE 默认会在 Autopilot 集群上启用 VPA。您可以通过选择特定的更新模式,将 VPA 专门用于 CPU 启动加速。如需启用和配置 VPA,请参阅自动设置 Pod 资源请求。
  • 工作负载类型:使用控制器(例如 Deployment 或 StatefulSet)来管理工作负载。
  • 节点容量:确保 Standard 集群有足够的容量来支持提升的 Pod。如果容量不足,GKE 会限制提升的 Pod 请求,以适应节点。

CPU 启动加速功能的工作原理

如需详细了解加速生命周期以及 CPU 启动加速如何计算资源增加量,请参阅 CPU 启动加速的工作原理。

准备工作

在开始之前,请确保您已选择包含要提升的集群的 Google Cloud 项目,并已执行以下任务:

  • 启用 Google Kubernetes Engine API。
  • 启用 Google Kubernetes Engine API
  • 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。如果您之前安装了 gcloud CLI,请通过运行 gcloud components update 命令来获取最新版本。较早版本的 gcloud CLI 可能不支持运行本文档中的命令。
  • 配置 gcloud CLI 以使用所选项目:

    gcloud config set project PROJECT_ID
    

    将 PROJECT_ID 替换为您的项目 ID。

  • 确保您已有 GKE 集群。如果您没有集群,请参阅创建集群。

所需的角色

如需获得启用和使用 CPU 启动加速所需的权限,请让您的管理员为您授予项目的以下 IAM 角色:

如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。

您也可以通过自定义角色或其他预定义角色来获取所需的权限。

启用 CPU 启动加速

如需启用 CPU 启动加速,请向 VerticalPodAutoscaler (VPA) 清单添加 startupBoost 配置块。您可以配置提升,以应用于 Pod 中的所有容器,也可以通过指定资源增加量来针对单个容器。

配置 Pod 级强化

Pod 级提升会将相同的 CPU 资源增加量应用于工作负载中的每个容器。您可以配置 CPU 启动加速,无论是否使用 VPA 的持续资源管理功能。

如需配置 Pod 级提升,请使用以下选项之一。

方案 A:启动加速已启用,VPA 更新模式已停用

使用此选项可仅利用 VPA 的 CPU 启动加速功能,而无需实现常规 VPA 建议。以下示例应用了 2 的 CPU 倍增系数,并在 Pod 达到 Ready 状态后保持该系数 10 秒:

apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
  name: example-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: example
  updatePolicy:
    updateMode: "Off"
  startupBoost:
    cpu:
      type: "Factor"
      factor: 2
      durationSeconds: 10

方案 B:同时启用启动加速和 VPA 更新模式

如果您希望 GKE 管理启动加速,然后根据持续的用量继续自动调整 Pod 的资源请求,请使用此选项。以下示例应用了启动提升并将 updateMode 字段设置为 InPlaceOrRecreate:

apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
  name: example-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: example
  updatePolicy:
    updateMode: "InPlaceOrRecreate"
  startupBoost:
    cpu:
      type: "Factor"
      factor: 2
      durationSeconds: 10

配置容器级强化

如果您的工作负载包含不需要额外资源的边车或其他容器,您可以在 resourcePolicy 部分中指定要启动加速的具体容器。containerName 值必须与 Deployment 规范中容器的 name 字段相匹配。

如需配置容器级提升,请使用以下选项之一。

选项 A:提升特定容器(VPA 促动已停用)

使用此选项可对单个容器应用提升,同时保持 Pod 的其余资源请求不变。以下示例清单为名为 boosted-container-name 的容器的基准请求添加了两个 vCPU:

apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
  name: example-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: example
  updatePolicy:
    updateMode: "Off"
  resourcePolicy:
    containerPolicies:
    - containerName: "boosted-container-name"
      mode: "Off"
      startupBoost:
        cpu:
          type: "Quantity"
          quantity: "2"

方案 B:针对特定容器停用 Pod 级提升

如果您已配置 Pod 级提升,但想排除特定容器,请使用此选项。以下示例清单将 CPU 倍增系数 2 应用于整个 Pod,但通过将名为 disable-cpu-boost-for-this-container 的容器的系数设置为 1 来停用该容器的加速:

apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
  name: example-vpa
spec:
  targetRef:
    apiVersion: "apps/v1"
    kind: Deployment
    name: example
  updatePolicy:
    updateMode: "InPlaceOrRecreate"
  startupBoost:
    cpu:
      type: "Factor"
      factor: 2
  resourcePolicy:
    containerPolicies:
    - containerName: "disable-cpu-boost-for-this-container"
      startupBoost:
        cpu:
          type: "Factor"
          factor: 1

验证 CPU 启动加速

如需验证 Pod 是否获得了提升,请检查 VPA 配置、Pod 资源请求、Pod 注释和 VPA 事件。

验证 VPA 配置

如需查看 VerticalPodAutoscaler 对象的详细信息,请运行以下命令:

kubectl describe vpa VPA_NAME

将 VPA_NAME 替换为您的 VPA 对象名称。

检查 Pod 上提升的 CPU 请求

如需验证 Pod 的当前资源请求,请运行以下命令:

kubectl describe pod POD_NAME

将 POD_NAME 替换为您的 Pod 名称。

使用 Pod 注释验证 CPU 提升

VPA 准入网络钩子会注入容器级注解,以跟踪每个容器在提升过期时应恢复到的原始资源。如需检查这些注释,请运行以下命令:

kubectl get pod POD_NAME --output yaml

在 metadata.annotations 部分下,查找格式为 vpaCpuStartupBoost/CONTAINER_NAME 的注解。例如:

metadata:
  annotations:
    vpaCpuStartupBoost/slow-starter: '{"requests":{"cpu":"50m","memory":"64Mi"},"limits":{"cpu":"200m","memory":"128Mi"}}'

命令输出会显示以下验证结果之一:

  • 成功提升:Pod 上存在 vpaCpuStartupBoost/CONTAINER_NAME 注解。
  • 效果不佳的加推:注解完全缺失。这意味着准入控制器忽略了提升,这可能是因为节点容量限制或 Autopilot 资源限制。

检查缩减规模事件

如需验证 GKE 是否已成功将 CPU 资源分配量减少回基准值,请运行以下命令来检查集群事件:

kubectl get events --field-selector reason=InPlaceResizedByVPA

命令输出会显示以下验证结果之一:

  • 成功取消提升:您会看到一个 InPlaceResizedByVPA 事件,其中包含一条消息,表明 Pod 已由 VPA 更新程序就地调整大小。这确认了 CPU 请求已恢复到基准值,而无需重新启动容器。
  • 取消加速失败:vpaCpuStartupBoost/CONTAINER_NAME 注解在加速应该过期后仍保留在 Pod 上,并且没有 InPlaceResizedByVPA 事件。

最佳做法和限制

使用 CPU 启动加速功能时,请查看以下内容。

与 Pod 横向自动扩缩的互动

如果您将水平 Pod 自动扩缩器 (HPA) 与 CPU 启动加速功能搭配使用,请遵循以下准则:

  • 定义健康状况探测:您必须为工作负载定义 readinessProbe。
  • 配置时长延迟:您必须将 durationSeconds 参数设置为 0。此配置可防止 HPA 因启动期间 CPU 利用率过高而过早地伸缩应用。

集群自动扩缩器和逐出循环

如果您在 GKE Standard 集群上使用集群自动扩缩器,请考虑以下节点行为:

  • 可能出现逐出循环:临时 CPU 加速可能会触发节点扩容。在 Pod 准备就绪并纵向缩容后,利用率过低可能会触发节点纵向缩容并逐出 Pod,从而导致无限循环。
  • 缓解措施:我们强烈建议使用 GKE Autopilot 来缓解节点碎片整理和逐出循环问题。

容器重启次数

查看以下行为,了解容器重启如何影响 CPU 启动加速:

  • 仅在创建 Pod 期间:CPU 启动加速仅在初始 Pod 创建阶段应用。
  • 重启时无提升:如果容器重启(例如,由于 OOMKill 事件),但 Pod 保持活跃状态,GKE 不会再次应用提升。之所以会出现此行为,是因为 Pod 准入 webhook 仅在初始 Pod 创建过程中触发。

清理

由于您是在现有工作负载上配置 CPU 启动提升,因此请注意以下事项,以免工作负载中断:

  • 您无需删除任何 Kubernetes 资源。
  • 如果您的 VerticalPodAutoscaler 对象或工作负载控制器(例如 Deployment 或 StatefulSet)仍需要用于稳态运行,请勿将其删除。
  • 如果您不需要 CPU 启动加速,可以根据您的范围使用以下方法之一仅停用加速:

    • 为整个工作负载停用提升功能:从 VerticalPodAutoscaler 对象规范中删除 startupBoost 块,并将更新后的清单应用到集群。
    • 为特定容器停用提升:如需将特定容器从 Pod 级提升中排除,请在 containerPolicies 部分下添加容器政策,并将 CPU 倍增系数设置为 1。

        startupBoost:
          cpu:
            type: "Factor"
            factor: 1
      

      如需了解详情,请参阅配置容器级提升。

后续步骤