在CoreOS Prometheus Operator集群中获取HPA的currentCPUUtilizationPercentage指标
嘿,这个问题我碰到过,给你详细拆解一下!
首先得明确:kubectl里显示的currentCPUUtilizationPercentage并不是Prometheus里直接存在的单个指标——它是Kubernetes的HPA控制器基于Pod的CPU使用和请求指标计算出来的结果。在你的K8s 1.17.x集群+CoreOS Prometheus Operator环境下,需要通过两个核心指标组合计算得到这个值。
1. HPA CPU使用率的计算逻辑
HPA的CPU使用率公式是:
(所有就绪Pod的当前CPU使用率总和) / (所有就绪Pod的CPU请求总和) × 100
这个逻辑和kubectl展示的currentCPUUtilizationPercentage完全一致,只是kubectl直接展示了控制器计算好的结果,而Prometheus需要你用原始指标手动计算。
2. 对应的Prometheus指标及查询语句
你需要用到kube-state-metrics暴露的两个指标:
kube_pod_container_resource_usage_cpu_cores:容器的实时CPU使用量(单位:核)kube_pod_container_resource_requests_cpu_cores:容器的CPU请求值(部署Pod时定义的资源请求)
针对你的php-apache HPA,对应的PromQL查询语句如下:
# 计算php-apache Deployment下所有就绪Pod的CPU使用率百分比 sum(rate(kube_pod_container_resource_usage_cpu_cores{label_app="php-apache", container="php-apache"}[1m])) / sum(kube_pod_container_resource_requests_cpu_cores{label_app="php-apache", container="php-apache"}) * 100
对查询语句的说明:
label_app="php-apache":匹配你的Deployment对应的Pod标签(如果你的标签不是app=php-apache,换成实际的标签键值对,比如label_name="php-apache")container="php-apache":指定目标容器,避免sidecar容器(如日志、监控代理)的CPU数据干扰结果rate(...[1m]):取1分钟内的CPU使用率速率,和HPA默认的指标计算窗口(1分钟)保持一致,确保结果和kubectl展示的数值对齐sum():聚合所有符合条件的Pod的CPU数据,模拟HPA控制器的计算逻辑
3. 为什么找不到直接对应的指标?
在较新版本的kube-state-metrics(v1.8+)中,会直接暴露kube_hpa_status_current_cpu_utilization指标,这个指标就是HPA控制器计算好的CPU使用率百分比。但你的K8s 1.17.x集群搭配的CoreOS Prometheus Operator可能附带的kube-state-metrics版本较低,没有这个指标,所以只能通过原始指标组合计算。
验证小技巧
你可以把PromQL的计算结果和kubectl的输出对比,正常情况下两者的偏差会非常小(因为都是基于相同的数据源计算)。如果偏差较大,检查一下:
- PromQL里的标签是否匹配正确(比如容器名、Pod标签)
- 是否包含了未就绪的Pod(HPA只会计算就绪Pod,你可以在PromQL里加上
kube_pod_status_ready="true"的条件过滤)
内容的提问来源于stack exchange,提问作者clay

