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

CPU 启动加速的工作原理

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

准备工作

在开始之前,请确保您已选择包含要加速的集群的 Cloud de Confiance by S3NS 项目,并已执行以下任务:

  • 启用 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 启动加速,请将 startupBoost 配置块添加到 VerticalPodAutoscaler (VPA) 清单。您可以将加速配置为应用于 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 级加速,但想要排除特定容器,请使用此选项。以下示例清单将 2 的 CPU 乘数应用于整个 Pod,但通过将其乘数设置为 1,为名为 disable-cpu-boost-for-this-container 的容器停用了加速:

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 准入 Webhook 会注入容器范围的注解,以跟踪每个容器在加速到期时应恢复到的原始资源。 如需检查这些注解,请运行以下命令:

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
      

      如需了解详情,请参阅配置容器级加速

后续步骤