如何用Prometheus v2.1.0获取K8s v1.9.2中Pod的毫核CPU使用率?
从Prometheus指标计算Pod/容器实际CPU毫核使用量
嘿,刚好我维护K8s集群时也碰到过这个需求——得把Prometheus采集的CPU时长指标转换成实际毫核使用率,用来对比部署配置里的CPU请求和限额。给你一步步梳理下怎么做:
核心原理
container_cpu_usage_seconds_total是一个累计计数器,记录容器从启动到当前总共消耗的CPU秒数。它的每秒变化率,就等于当前实际使用的CPU核数(因为1核CPU每秒会产生1秒的使用时长)。把这个数值乘以1000,就能转换成你需要的**毫核(m)**单位。
关键指标与PromQL查询
1. 单容器的实际CPU毫核使用量
用rate函数计算1分钟内的时长变化率(你可以根据监控粒度调整窗口,比如5m),再转成毫核:
rate(container_cpu_usage_seconds_total{container!="POD"}[1m]) * 1000
- 过滤
container!="POD"是为了排除K8s的pause基础设施容器,它的资源使用一般不需要统计。 - 结果单位是毫核/秒,也就是当前容器实际占用的CPU毫核数。
2. 整个Pod的总CPU毫核使用量
把同一个Pod下所有业务容器的使用量求和:
sum by (pod, namespace) (rate(container_cpu_usage_seconds_total{container!="POD"}[1m]) * 1000)
这样得到的是每个Pod整体的实际CPU毫核使用量,方便和Pod级的资源请求/限额做对比。
3. 对比实际使用与配置的请求/限额
如果你想直接看实际使用占请求或限额的比例,可以结合K8s资源指标:
- CPU请求指标:
kube_pod_container_resource_requests_cpu_cores - CPU限额指标:
kube_pod_container_resource_limits_cpu_cores
比如,计算实际使用占CPU请求的百分比:
( sum by (pod, namespace) (rate(container_cpu_usage_seconds_total{container!="POD"}[1m]) * 1000) / sum by (pod, namespace) (kube_pod_container_resource_requests_cpu_cores * 1000) ) * 100
如果结果大于100%,说明Pod实际使用的CPU超过了配置的请求值;如果接近或超过1000%(对应1核限额),说明触达了CPU限额。
注意事项
- 窗口选择:
rate函数的时间窗口不要太小(比如10s),否则会因为指标采集波动导致结果不稳定;一般1m或5m是比较合适的。 - 指标来源:确保Prometheus已正确采集cAdvisor的
container_*开头指标,以及kube-state-metrics提供的kube_pod_container_resource_*指标。 - 验证结果:可以用
kubectl top pod <pod-name>的输出和Prometheus查询结果对比,确认计算逻辑正确。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

