本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
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 对象所需的时间。
这些度量具有标签 action
(scale_up
、scale_down
、none
)和 error
(spec
、internal
、none
)。此外,前两个度量还有一个 metric_type
标签,对应于 HorizontalPodAutoscaler 的 .spec.metrics[*].type
。
所有度量对于 HPA 控制器的一般监控都很有用,你可以更深入地了解哪个部分有问题,哪里耗时,你的集群在什么时间倾向于发生多大规模的扩缩等。
另一个小改动是,我们更改了 SuccessfulRescale
事件的消息,以便每个人都可以检查事件是来自资源度量还是容器资源度量(参见相关的 PR)。
参与进来
此功能由 SIG Autoscaling 管理。请加入我们并分享你的反馈。我们期待你的回音!