这篇文章已有一年多历史。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已不正确。

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 对象一次所花费的时间。

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

所有指标对于 HPA 控制器的一般监控都很有用,您可以更深入地了解哪个部分有问题、在哪里花费时间、集群上在哪个时间段容易发生多少伸缩等。

另一个次要的变化是,我们修改了 SuccessfulRescale 事件的消息,以便每个人都可以检查事件是来自资源指标还是容器资源指标(请参阅相关的 PR)。

参与其中

此功能由SIG Autoscaling 管理。请加入我们并分享您的反馈。我们期待您的来信!

如何了解更多?