很长一段时间以来,我成功地使用docker与一个用如下compose文件定义的堆栈:
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:
Prometheus 通过其服务名称访问了导出器服务exporter
。但现在它停止工作了。我怀疑某个组件的某些更新是导致问题的根源,但无法确定是什么原因。
我已经尝试过的:
我检查了外部网络是否monitoring
同时包含以下两个服务:
docker network inspect monitoring
[
{
"Name": "monitoring",
"Id": "7bilt3qa5ij5qqk25d2j47aza",
...
"Containers": {
"056bd02a2416c879680ab09fccb7f1727fdf2f8a97ee0cea57d5f4d21faf887a": {
"Name": "monitoring_prometheus.1.oudo1n1qu5f8hqywvcfxoe4n9",
"EndpointID": "92020da01862e40a0449c919228e354f564b6abeac6337f3a15fc143e5519da1",
"MacAddress": "02:42:ac:12:00:05",
"IPv4Address": "172.18.0.5/16",
"IPv6Address": ""
},
"c92b4883fa5c7390ab44442531b18365cd8a8ab0861c275e53c32874cf9c1b04": {
"Name": "monitoring_exporter.173481td65qcdajte65b0jow0.ah2k9fl3sozmauxfge19o0ktc",
"EndpointID": "00fb1100a1b28b6cc260a1a377ce593ce5d9ee803da191f6f2cb9097fae455fb",
"MacAddress": "02:42:ac:12:00:04",
"IPv4Address": "172.18.0.4/16",
"IPv6Address": ""
},
]
}
]
但是,当我docker exec
进入prometheus
容器时,nslookup exporter
我收到错误消息
/prometheus $ nslookup exporter
Server: 127.0.0.11
Address: 127.0.0.11:53
** server can't find exporter: NXDOMAIN
*** Can't find exporter: No answer
同样,当我尝试使用完整合格的服务名称进行相同操作时monitoring_exporter
。
正如预期的那样,我也无法做到wget -O - http://monitoring_exporter:9100/metrics
——它返回一条错误消息wget: bad address 'monitoring_exporter:9100'
。
但是,如果我使用导出器容器的 IP 地址,它就可以工作!因此,这似乎不是连接问题,而是名称解析问题。
这里有人有想法吗?
答案1
再次执行所有步骤后,我终于自己找到了问题所在!如果我按如下方式创建网络internal
(请参阅docker 文档),其工作原理与预期一致:
docker network create --driver=overlay --scope=swarm --internal=true monitoring
实际上,我不太明白为什么它需要是内部的,以及为什么它以前不起作用,但至少现在它可以起作用了。