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

Prometheus NodeExporter NodePort访问异常:请求被负载至其他节点

问题解答

这是Kubernetes NodePort服务的默认行为,不是bug——不管你访问哪个节点的NodePort端口,kube-proxy都会把请求负载均衡到所有匹配该Service标签的后端Pod上,哪怕当前节点上就有node-exporter的Pod,也会被随机转发到集群里任意一个节点的Pod。

解决方法

推荐用下面两种简单直接的方案:

1. 开启hostNetwork让Pod直接使用节点网络

这是最适合DaemonSet+外部监控的方案,让node-exporter直接绑定节点的端口,绕过Service的负载均衡:

  • 修改helm chart的values配置:
hostNetwork: true
hostPort: 9100  # node-exporter默认的指标采集端口
service:
  enabled: false  # 不需要Service,直接通过节点IP+端口访问即可

重新部署后,每个节点的9100端口都会被本地的node-exporter Pod占用,外部Prometheus配置节点IP:9100就能精准抓取到对应节点的指标,不会被转发到其他节点。

2. 利用Prometheus自动发现Pod目标(适合不想修改Pod网络的场景)

如果不想调整Pod的网络配置,可以通过Prometheus的Kubernetes服务发现功能,直接抓取每个node-exporter Pod的IP+端口:

  • 保持NodePort Service不变,同时部署kube-state-metrics,让Prometheus通过Kubernetes API自动发现所有node-exporter的Pod,直接抓取Pod的IP和容器端口(默认9100),绕开NodePort的负载均衡逻辑。
  • 这种方式不需要手动维护节点IP列表,Pod重建后也能自动更新抓取目标。

补充说明

NodePort本质是ClusterIP服务的扩展,kube-proxy会在所有节点上配置iptables/ipvs规则,把NodePort的流量转发到Service的ClusterIP,再由ClusterIP负载均衡到后端Pod。所以不管你访问哪个节点的NodePort,流量都会进入集群的Service负载均衡池,这就是为什么会出现“访问A节点的端口却拿到B节点指标”的情况。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 14:24:29