这篇文章已有一年多历史。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。
Kubernetes 1.27:HorizontalPodAutoscaler ContainerResource 类型指标进入 Beta 阶段
Kubernetes 1.20 在 HorizontalPodAutoscaler (HPA) 中引入了 ContainerResource
类型指标。
在 Kubernetes 1.27 中,此功能移至 beta 版,并且相应的特性门控 (HPAContainerMetrics
) 默认启用。
什么是 ContainerResource 类型指标
ContainerResource 类型指标允许我们根据单个容器的资源使用情况配置自动缩放。
在以下示例中,HPA 控制器会伸缩目标,以使所有 Pod 的应用程序容器中的 CPU 平均利用率保持在 60% 左右。(请参阅算法详情,了解如何精确计算所需的副本数量)
type: ContainerResource
containerResource:
name: cpu
container: application
target:
type: Utilization
averageUtilization: 60
与资源类型指标的区别
HPA 已经有一个资源类型指标。
您可以像下面这样定义目标资源利用率,然后 HPA 将根据当前的利用率来向上/向下伸缩副本。
type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 60
但是,这种资源类型指标指的是 **Pod** 的平均利用率。
如果 Pod 有多个容器,利用率的计算方式如下:
sum{the resource usage of each container} / sum{the resource request of each container}
每个容器的资源利用率可能没有直接关联,或者随着负载的变化以不同的速率增长。
例如:
- 一个 sidecar 容器仅提供辅助服务,例如日志传输。如果应用程序不频繁地记录日志,或者不在其热路径中生成日志,则日志传输器的使用率不会增长。
- 一个提供身份验证的 sidecar 容器。由于使用了大量缓存,当主容器上的负载增加时,其使用率只会略微增加。在当前混合使用率计算方法中,这通常会导致 HPA 不会扩展部署,因为混合使用率仍然很低。
- 可能会注入一个未设置资源的 sidecar 容器,这会阻止基于利用率进行扩展。在当前的逻辑中,当未设置资源请求时,HPA 控制器只能根据 Pod 的绝对资源使用量进行伸缩。
并且,在这种情况下,如果只有一个容器的资源利用率升高,则资源类型指标可能不会建议向上扩展。
因此,为了进行准确的自动伸缩,您可能希望为此类 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 管理。请加入我们并分享您的反馈。我们期待您的来信!