Docker服务名称解析故障求助:Prometheus无法访问Exporter
Docker Stack中Prometheus无法通过服务名访问Node Exporter的DNS解析问题
问题背景
原本通过以下Docker Compose文件定义的Stack服务可正常运行,Prometheus能通过服务名exporter访问Node Exporter,但近期该功能失效,怀疑是组件更新导致,已确认是DNS解析问题(容器IP可正常访问,服务名解析失败)。
version: "3.7" services: exporter: image: prom/node-exporter:latest volumes: - /sys:/host/sys:ro - /:/rootfs:ro - /proc:/host/proc:ro deploy: mode: global networks: - monitoring prometheus: image: prom/prometheus:latest volumes: - /var/apps/monitoring/prometheus-data:/prometheus:rw - /var/apps/monitoring/prometheus.yml:/etc/prometheus/prometheus.yml deploy: mode: replicated replicas: 1 networks: - monitoring networks: monitoring: external: true volumes: prometheus-data:
已完成的排查操作
- 执行
docker network inspect monitoring确认外部网络monitoring中包含两个服务的容器,结果显示容器均已加入该网络; - 进入Prometheus容器执行
nslookup exporter及nslookup monitoring_exporter均返回NXDOMAIN错误; - 使用
wget -O - http://monitoring_exporter:9100/metrics提示地址错误,但直接使用Exporter容器IP访问http://<容器IP>:9100/metrics可正常获取指标。
排查思路与解决方案
1. 修正全局服务的DNS访问规则
Docker Swarm中,全局模式(global mode)的服务没有虚拟IP(VIP),直接使用服务名exporter无法解析,必须使用tasks.<服务名>格式来获取所有实例的IP列表:
- 在Prometheus容器内执行
nslookup tasks.exporter,若能正常返回所有Exporter容器的IP,说明是服务名使用格式错误。
2. 更新Prometheus的抓取配置
修改/var/apps/monitoring/prometheus.yml中的scrape配置,改用动态DNS服务发现适配全局服务:
- 错误配置(静态服务名):
scrape_configs: - job_name: 'node_exporter' static_configs: - targets: ['exporter:9100'] - 正确配置(动态DNS发现):
配置完成后重启Prometheus服务:scrape_configs: - job_name: 'node_exporter' dns_sd_configs: - names: ['tasks.exporter'] type: 'A' port: 9100docker service update --force <你的prometheus服务名>
3. 检查Docker Swarm网络的兼容性
执行docker network inspect monitoring查看Scope字段:
- 若字段值为
local,说明该网络不是Swarm管理的overlay网络,Swarm服务发现无法在其上正常工作。需重新创建Swarm范围的外部网络:
之后重新部署Stack服务。docker network rm monitoring docker network create --driver overlay --attachable monitoring
4. 验证容器内的DNS配置
进入Prometheus容器执行cat /etc/resolv.conf,确认nameserver指向Docker内置DNS(通常为127.0.0.11):
- 若指向外部DNS服务器,会导致Swarm内部服务名无法解析,可通过重新部署服务强制刷新DNS配置。
5. 刷新Swarm服务的网络缓存
强制重启Prometheus服务,刷新其网络配置和DNS缓存:
docker service update --force <你的prometheus服务名>
内容的提问来源于stack exchange,提问作者JSchirrmacher
相关产品推荐
相关产品推荐

