如何用 Prometheus 计算 K8s 容器的 CPU 使用率?
K8s 容器 CPU 使用率通过 cAdvisor 暴露的 container_cpu_usage_seconds_total 指标计算:rate 后按 pod/container 分组即可。本文给出完整 PromQL、request/limit 利用率算法与常见坑。
核心公式:sum(rate(container_cpu_usage_seconds_total{container!="", image!=""}[5m])) by (pod)——对 CPU 累计秒数取速率,结果就是每个 Pod 当前占用的 CPU 核数。
指标从哪来?
kubelet 内置 cAdvisor,自动采集每个容器的 container_cpu_usage_seconds_total(CPU 累计使用秒数)。Prometheus 抓取 kubelet 的 /metrics/cadvisor 端点即可获得。
常用 PromQL
# 每个 Pod 的 CPU 使用核数
sum(rate(container_cpu_usage_seconds_total{container!="", image!=""}[5m])) by (pod)
# 换算成占 request 的百分比
sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (pod)
/ sum(kube_pod_container_resource_requests{resource="cpu"}) by (pod) * 100
# 占 limit 的百分比(快被限流的信号)
sum(rate(container_cpu_usage_seconds_total{container!=""}[5m])) by (pod)
/ sum(kube_pod_container_resource_limits{resource="cpu"}) by (pod) * 100
注意三个坑
- 过滤空标签:
container=""的序列是节点级汇总,不排除会重复计数;image=""的是 Pod 沙箱,也要排除; - 使用率 vs 核数:rate 结果是核数(0.5 = 半核),要百分比必须除以 request 或 limit;
- CPU 限流:达到 limit 会被 throttle,关注
container_cpu_cfs_throttled_seconds_total比看使用率更早发现问题。
观测云对照
观测云通过 DataKit 的容器采集器自动上报 K8s 全量指标——CPU/内存/网络/磁盘按 Pod、Deployment、命名空间维度开箱可查,内置容器监控看板,无需维护 Prometheus + cAdvisor 抓取链。
常见问题(FAQ)
Q:为什么我的查询结果为空? 检查是否抓到了 cadvisor 端点(up{job="kubelet"}),老版本 K8s 的指标名前缀可能不同。
Q:rate 窗口选多大? CPU 波动快,建议 5m;告警场景可以 [5m] 趋势 + 持续时长双条件。