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:
- 为kube-state-metrics添加启动参数
--metric-labels-allowlist=nodes=[*],参数中[*]代表允许暴露所有节点标签,也可以按需填写需要的标签键名 - 告警规则可直接简化为:
kube_node_status_condition{condition="Ready",status=~"unknown|false"} == 1
该写法无多指标关联开销,查询性能更好,也不会出现匹配逻辑错误。
内容的提问来源于stack exchange,提问作者DmitrySemenov
相关产品推荐
相关产品推荐

