You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

EKS中Prometheus Node NotReady告警返回全量节点问题排查

问题描述

在EKS 1.22集群中使用的Prometheus相关组件镜像版本如下:

alertmanager:v0.23.0
kube-state-metrics:v2.4.1
prometheus/node-exporter:v1.3.0
prometheus:v2.34.0

需求为获取处于NotReady状态的节点标签以配置告警,但实际告警触发时,Slack通知返回了集群内所有节点信息,实际环境中仅单个节点被标记为NotReady状态,节点状态查询结果如下:

kubectl get nodes
NAME                           STATUS      ROLES    AGE     VERSION
ip-10-110-0-102.ec2.internal   NotReady    <none>   17h     v1.22.9-eks-810597c
ip-10-110-1-79.ec2.internal    Ready       <none>   2d16h   v1.22.9-eks-810597c
ip-10-110-3-243.ec2.internal   Ready       <none>   2d16h   v1.22.9-eks-810597c
ip-10-110-4-137.ec2.internal   Ready       <none>   2d14h   v1.22.9-eks-810597c
...

当前配置的告警规则如下:

(kube_node_status_condition{condition="Ready",status=~"unknown|false"} == 1) 
  * on(node) group_right() kube_node_labels

异常现象:Slack通知展示了全集群所有节点的条目:
异常截图

问题原因

告警规则的多指标匹配逻辑存在错误:

  • kube_node_labels指标会为集群内所有节点各生成一条时间序列,每条序列携带对应节点的全量标签
  • 现有规则仅指定on(node)作为关联匹配字段,搭配group_right()做右连接时,没有对右侧的kube_node_labels指标做范围过滤,两侧标签维度不对齐导致结果膨胀,最终把全量节点的信息都带到了告警结果里。
修复方案

以下两种方案任选其一即可:

方案1:修正现有join匹配逻辑

对右侧的kube_node_labels按node维度做聚合,去除多余干扰标签,保证每个节点仅对应一条序列后再做关联,修改后的规则如下:

(kube_node_status_condition{condition="Ready",status=~"unknown|false"} == 1)
* on(node) group_right()
max by (node) (kube_node_labels)

修改后仅会关联左侧匹配到的异常节点标签,不会再带出全集群节点信息。

方案2:移除多余join操作(推荐)

你使用的kube-state-metrics v2.4.1版本已经支持在kube_node_status_condition指标上直接携带节点标签,不需要额外关联kube_node_labels:

  1. 为kube-state-metrics添加启动参数--metric-labels-allowlist=nodes=[*],参数中[*]代表允许暴露所有节点标签,也可以按需填写需要的标签键名
  2. 告警规则可直接简化为:
kube_node_status_condition{condition="Ready",status=~"unknown|false"} == 1

该写法无多指标关联开销,查询性能更好,也不会出现匹配逻辑错误。

内容的提问来源于stack exchange,提问作者DmitrySemenov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 09:06:21