Prometheus查询K8s集群节点CPU利用率报错:多对多匹配不允许
解决Prometheus查询K8s节点CPU利用率的多对多匹配错误
错误原因
错误的核心是:查询右侧的machine_cpu_cores指标经label_join生成kubernetes_node标签后,存在**多个时间序列对应同一个kubernetes_node**的情况。Prometheus的二元运算(如除法)要求匹配标签至少在一侧是唯一的,否则会触发多对多匹配的禁止报错。
修正后的查询语句
方案1:保留kubernetes_node标签匹配
sum by (kubernetes_node) (rate(node_cpu_seconds_total{mode!~"idle|wait|iowait"}[5m])) / on (kubernetes_node) max by (kubernetes_node) (label_join(machine_cpu_cores, "kubernetes_node", "", "kubernetes_io_hostname")) * 100 > 80
方案2:直接使用node标签匹配(更简洁,推荐)
如果node_cpu_seconds_total本身带有node标签(kubelet暴露的指标通常默认包含),可以跳过label_join,直接用node标签关联:
sum by (node) (rate(node_cpu_seconds_total{mode!~"idle|wait|iowait"}[5m])) / on (node) max by (node) (machine_cpu_cores) * 100 > 80
关键修改说明
- 对右侧的
machine_cpu_cores用max by (标签名)聚合:每个节点的CPU核心数是固定值,同一节点下的多个machine_cpu_cores序列值完全一致,聚合后每个节点仅保留一个时间序列,满足Prometheus对匹配标签唯一性的要求。 - 可选添加
group_left():若需明确指定左连接(左侧每个序列匹配右侧一个序列),可在on (标签名)后补充该指令,示例:sum by (node) (rate(node_cpu_seconds_total{mode!~"idle|wait|iowait"}[5m])) / on (node) group_left() max by (node) (machine_cpu_cores) * 100 > 80
内容的提问来源于stack exchange,提问作者Jananath Banuka
相关产品推荐
相关产品推荐

