Docker 内部名称解析失败

Docker 内部名称解析失败

很长一段时间以来,我成功地使用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

实际上,我不太明白为什么它需要是内部的,以及为什么它以前不起作用,但至少现在它可以起作用了。

相关内容