本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。

Kubernetes 1.27:HorizontalPodAutoscaler ContainerResource 类型指标进入 Beta 阶段

Kubernetes 1.20 在 HorizontalPodAutoscaler (HPA) 中引入了ContainerResource 类型的度量

在 Kubernetes 1.27 中,此功能进入 Beta 阶段,并且相应的功能门控(HPAContainerMetrics)默认启用。

什么是 ContainerResource 类型度量

ContainerResource 类型的度量允许我们根据单个容器的资源使用情况来配置自动扩缩。

在下面的示例中,HPA 控制器会扩缩目标,使所有 Pod 中 application 容器的平均 CPU 利用率维持在 60% 左右。(有关如何精确计算所需副本数的详细信息,请参阅算法细节

type: ContainerResource
containerResource:
  name: cpu
  container: application
  target:
    type: Utilization
    averageUtilization: 60

与 Resource 类型度量的区别

HPA 已经有Resource 类型的度量

你可以像下面这样定义目标资源利用率,然后 HPA 将根据当前的利用率来扩缩副本。

type: Resource
resource:
  name: cpu
  target:
    type: Utilization
    averageUtilization: 60

但是,这种 Resource 类型的度量指的是 Pod 的平均利用率。

如果一个 Pod 有多个容器,利用率的计算方式将是

sum{the resource usage of each container} / sum{the resource request of each container}

每个容器的资源利用率可能没有直接关联,或者随着负载的变化以不同的速率增长。

例如

  • 一个 Sidecar 容器仅提供辅助服务,例如日志传送。如果应用程序不经常记录日志或不在其热点路径中产生日志,那么日志传送器的使用量就不会增长。
  • 一个提供身份验证的 Sidecar 容器。由于大量缓存,当主容器上的负载增加时,其使用量只会略有增加。在当前的混合使用率计算方法中,这通常会导致 HPA 不扩容部署,因为混合使用率仍然很低。
  • 注入的 Sidecar 可能没有设置资源,这会阻止基于利用率的扩缩。在当前的逻辑中,如果未设置资源请求,HPA 控制器只能根据 Pod 的绝对资源使用量进行扩缩。

并且,在这种情况下,如果只有一个容器的资源利用率很高,Resource 类型的度量可能不会建议扩容。

因此,为了实现精确的自动扩缩,你可能希望对此类 Pod 使用 ContainerResource 类型的度量。

Beta 版本有哪些新内容?

对于 Kubernetes v1.27,如本文开头所述,ContainerResource 类型的度量默认可用。(你仍然可以通过 HPAContainerMetrics 功能门控禁用它。)

此外,我们通过从 kube-controller-manager 暴露一些度量来改进 HPA 控制器的可观测性

  • metric_computation_total:度量计算次数。
  • metric_computation_duration_seconds:HPA 控制器计算一个度量所需的时间。
  • reconciliations_total:HPA 控制器的协调次数。
  • reconciliation_duration_seconds:HPA 控制器协调一次 HPA 对象所需的时间。

这些度量具有标签 actionscale_upscale_downnone)和 errorspecinternalnone)。此外,前两个度量还有一个 metric_type 标签,对应于 HorizontalPodAutoscaler 的 .spec.metrics[*].type

所有度量对于 HPA 控制器的一般监控都很有用,你可以更深入地了解哪个部分有问题,哪里耗时,你的集群在什么时间倾向于发生多大规模的扩缩等。

另一个小改动是,我们更改了 SuccessfulRescale 事件的消息,以便每个人都可以检查事件是来自资源度量还是容器资源度量(参见相关的 PR)。

参与进来

此功能由 SIG Autoscaling 管理。请加入我们并分享你的反馈。我们期待你的回音!

我如何了解更多信息?