【问题标题】:How Kubernetes computes CPU utilization for HPA?Kubernetes 如何计算 HPA 的 CPU 利用率?
【发布时间】:2023-04-09 12:24:01
【问题描述】:

我想了解 HPA 如何跨 Pod 计算 CPU 利用率。

根据这个doc,它需要一个 pod 的 CPU 利用率平均值(过去 1 分钟的平均值)除以该 pod 请求的 CPU。然后计算所有 pod 的 CPU 的算术平均值。

不幸的是,该文档包含一些过时的信息,例如 --horizontal-pod-autoscaler-sync-period 默认设置为 30 秒,但在 the official doc 中,默认值为 15 秒。

当我测试时,我注意到 HPA 甚至在平均 CPU 达到我设置的阈值(即 90%)之前就扩大了,这让我认为它可能会占用 Pod 的最大 CPU 而不是平均值。

我的问题是在哪里可以找到更新的文档以准确了解 HPA 的工作原理?

【问题讨论】:

标签: kubernetes cpu autoscaling hpa


【解决方案1】:

请注意,我手头没有Kubernetes集群,这是基于k8s源代码的理论答案。
看看这是否真的符合你的经验。


Kubernetes 是开源的,这里好像是HPA code

函数 GetResourceReplicacalcPlainMetricReplicas(用于非利用率百分比)计算给定当前指标的副本数。
两者都使用GetMetricUtilizationRatio返回的usageRatio,这个值乘以Replica中当前就绪的pod数量得到新的pod数量:

New_number_of_pods = Old_numbers_of_ready_pods * usageRatio

有一个容差检查(即,如果usageRatio 足够接近 1,则什么都不做)并且挂起和未知状态的 pod 被忽略(考虑使用 0% 的资源),而没有指标的 pod被认为使用了 100% 的资源。

usageRatio 是由 GetResourceUtilizationRatio 计算的,它传递了 所有 pod 的指标和(资源的)请求,如下所示:

utilization = Total_sum_resource_usage_all_pods / Total_sum_resource_requests_all_pods
usageRatio = utilization * 100 / targetUtilization

targetUtilization 来自 HPA 规范。
代码比我的这个摘要更容易阅读,在这种情况下,术语请求意味着“资源请求”(这是有根据的猜测)。

所以我想说 90% 是所有 pod 的资源使用率,因为它们都是单个 pod,请求每个 pod 请求的总和,并在它们都运行时收集指标单个专用节点。

【讨论】:

    【解决方案2】:

    根据https://github.com/kubernetes/kubernetes/issues/78988#issuecomment-502106361,这取决于配置以及指标服务器和 kublet 报告的问题,HPA 应该只使用以下信息: https://kubernetes.io/docs/tasks/debug-application-cluster/resource-metrics-pipeline/#cpu

    我认为持续时间应该由 kubelet 的 --housekeeping-interval 定义,默认为 10 秒

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 2020-01-16
    • 2019-03-26
    • 2020-11-19
    • 2012-11-12
    相关资源
    最近更新 更多