Docker Swarm中Prometheus无法监控本机Node-Exporter问题排查
核心方向:Swarm网络隔离导致的回环访问失败
Prometheus运行在Swarm的monitnw overlay网络中,而Node-Exporter采用host网络模式监听节点的9100端口。当Prometheus容器尝试通过节点的外部/内网IP访问本机的Node-Exporter时,流量会先进入Swarm的overlay网络,再尝试回连到节点的host网络,这种跨网络的回环访问会被Swarm的网络策略拦截,导致无法建立连接。
具体排查步骤
1. 验证Prometheus容器内能否直接访问本机host端口
进入运行中的Prometheus容器,尝试用localhost访问Node-Exporter,确认容器内是否能直接触达宿主的host网络服务:
# 获取Prometheus容器ID docker ps | grep prometheus # 进入容器 docker exec -it <prometheus-container-id> sh # 尝试采集本机Node-Exporter指标 curl 127.0.0.1:9100/metrics
如果能正常返回指标数据,说明问题出在节点IP访问时的overlay网络路由;如果仍无法访问,需进一步检查容器网络栈与宿主的隔离规则。
2. 修改Prometheus配置,添加localhost:9100作为本机采集目标
因为Prometheus与Node-Exporter在同一节点,直接用localhost:9100可以绕过overlay网络的路由限制,直接访问宿主的host端口。修改prometheus.yml的采集任务:
- job_name: Node-exporter metrics static_configs: - targets: ['X.Y.Z.178:9100', 'X.Y.Z.218:9100', 'X.Y.Z.93:9100', 'localhost:9100']
更新Swarm栈使配置生效:
docker stack deploy -c <prometheus-stack-compose.yml> <stack-name>
之后查看Grafana是否能获取到本机指标,若成功则验证了网络路由的问题。
3. 检查节点防火墙的回环流量规则
虽然已配置节点间的流量允许,但需确认防火墙是否允许本机容器到本机host端口的流量。以Ubuntu的ufw为例:
# 查看当前规则 ufw status verbose # 添加允许overlay网络子网访问9100端口的规则(替换为你的monitnw子网) ufw allow in from 10.0.0.0/24 to any port 9100
4. 检查Swarm overlay网络的端点配置
查看monitnw网络的详细信息,确认Prometheus容器的网络端点是否存在路由限制:
docker network inspect monitnw
重点查看Containers下Prometheus容器的IPv4Address,以及节点的网络路由配置是否阻止了回环流量。
5. 可选方案:将Node-Exporter加入overlay网络
如果不想依赖localhost的配置,可以把Node-Exporter加入monitnw overlay网络,修改Node-Exporter的Compose文件:
version: '3' services: node_exporter: image: quay.io/prometheus/node-exporter:latest container_name: node_exporter command: - '--path.rootfs=/host' networks: - monitnw pid: host restart: unless-stopped volumes: - '/:/host:ro,rslave' ports: - "9100:9100" networks: monitnw: external: true
重启Node-Exporter后,Prometheus可以通过节点IP正常访问本机的Node-Exporter服务。
内容的提问来源于stack exchange,提问作者juan noguera

