如何用 Prometheus 计算 K8s 容器的 CPU 使用率?

K8s 容器 CPU 使用率通过 cAdvisor 暴露的 container_cpu_usage_seconds_total 指标计算:rate 后按 pod/container 分组即可。本文给出完整 PromQL、request/limit 利用率算法与常见坑。

最佳实践
如何用 Prometheus 计算 K8s 容器的 CPU 使用率?封面

核心公式: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

注意三个坑

  1. 过滤空标签container="" 的序列是节点级汇总,不排除会重复计数;image="" 的是 Pod 沙箱,也要排除;
  2. 使用率 vs 核数:rate 结果是核数(0.5 = 半核),要百分比必须除以 request 或 limit;
  3. 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] 趋势 + 持续时长双条件。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台