本文档介绍了如何在 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 角色:
- Kubernetes Engine Admin (
roles/container.admin) - Kubernetes Engine Developer (
roles/container.developer)
如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
启用 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如需了解详情,请参阅配置容器级提升。
- 为整个工作负载停用提升功能:从 VerticalPodAutoscaler 对象规范中删除