首页 > 解决方案 > 为什么 k8s 部署 hpa 不计算 istio/sidecar 的 cpu 请求

问题描述

我为我的部署/应用程序设置了 hpa,例如 CPU 80%。

我的应用部署有两个容器,一个是用于流量的应用,另一个是自动注入的 istio-proxy。

当我在运行流量期间获得 hpa 时,我发现 hpa 结果出乎意料。

istio-proxy 的 cpu 请求是 2G。app的cpu请求是4G。istio-proxy 消耗的 cpu 为 1G。app消耗的cpu是4G。

所以,我预计这个吊舱(包括 2 个容器)的 hpa 是 (1+2)/(2+4) = 50%。

但实际结果接近 (1+2)/4 = 75%。

似乎 istio-proxy 的 cpu 请求被排除在计算 hpa 的 cpu 利用率之外。

据我所知,k8s 从部署中获取 cpu 请求,但实际上对于这个 sidecar 自动注入案例,部署 yaml 没有任何 istio-proxy 容器信息。

我想这就是排除 istio-proxy cpu 请求的原因。但这是预期的行为还是错误?

标签: kubernetescpucode-injectionhpa

解决方案


我认为从 1.19 开始,hpa 对 pod 中所有容器的平均值起作用。确切的逻辑在这里:https ://github.com/kubernetes/kubernetes/blob/v1.9.0/pkg/controller/podautoscaler/metrics/utilization.go#L49

currentUtilization = int32((metricsTotal * 100) / requestsTotal)

根据上述逻辑,HPA 计算 pod cpu 利用率为 pod 中所有容器的总 cpu 使用率除以总请求数


推荐阅读