如何调整PromQL查询以准确获取Kubernetes节点平均CPU使用率
问题分析与修复方案
原查询的问题
你的PromQL查询存在两个关键错误,导致计算出的CPU使用率和实际值不符:
- 标签匹配语法错误:
mode!="idle|wait|iowait"无法正确排除多个mode值。PromQL中!=仅支持单个值匹配,多值正则匹配需要使用!~运算符。原写法相当于匹配mode等于字符串"idle|wait|iowait"的反向,这几乎没有排除任何数据,导致计算逻辑完全错误。 - 计算逻辑错误:
avg by (instance) (rate(...))是对每个非空闲mode的CPU使用率取平均值,而非计算节点整体的CPU使用率占比。实际CPU使用率应该是所有非空闲CPU时间总和占总CPU时间的比例。
调整后的正确查询
以下两种查询均可得到和kubectl top nodes、Azure门户对齐的节点CPU使用率:
方案1:通过排除空闲类时间计算
100 * (sum by (instance) (rate(node_cpu_seconds_total{mode!~"idle|iowait"}[5m])) / sum by (instance) (rate(node_cpu_seconds_total[5m]))) > 80
- 逻辑说明:
sum by (instance) (rate(node_cpu_seconds_total{mode!~"idle|iowait"}[5m])):求和节点所有CPU核心的非空闲(排除idle、iowait)CPU时间的每秒变化率sum by (instance) (rate(node_cpu_seconds_total[5m])):求和节点所有CPU核心的总CPU时间每秒变化率(所有mode的总和)- 两者相除后乘100得到百分比使用率,再设置>80的警报阈值
方案2:通过空闲时间反向计算
100 - (sum by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
- 逻辑说明:用100%减去节点所有核心的空闲CPU时间占比,得到实际使用率,和主流工具的计算逻辑一致。
验证方法
调整查询后,可通过Prometheus UI对比查询结果和kubectl top nodes的输出,确认数值对齐后再更新警报规则。
内容的提问来源于stack exchange,提问作者Jananath Banuka
相关产品推荐
相关产品推荐

