在自定义网络中(在 Linux 主机上)无法从 Prometheus 容器中抓取公开的 Docker 指标

Cannot Scrape exposed Docker Metrics from Prometheus container when in custom network (on Linux Host)

我们在 自定义 docker 网络 中有一个 Prometheus 容器和各种其他服务以及 metrics exporter 个容器 运行。

在我们使用 Docker desktop 的 Win 10 x64 本地开发环境中,一切正常,Prometheus 容器可以抓取自定义网络中的 metrics exporter 容器以及暴露的 Docker metrics 来自主机 (Win 10)。

在我们的 Ubuntu 18.04 Linux 主机上,最新的 Prometheus 2.30.3 容器可以很好地抓取自定义网络中的指标导出器容器,但无法抓取暴露的 Docker metrics来自楼主。

这些是 Ubuntu 主机的规格和配置:

OS: Ubuntu 18.04.1 LTS
Prometheus: 2.30.3 (latest)
Docker: 20.10.10 (latest, allows to add extra hosts to container, see below)
Docker-compose: 2.0.1

docker /etc/docker/daemon.json

中的指标配置
{
  "experimental": true,
  "metrics-addr": "0.0.0.0:9933"
}

配置在/prometheus.yml:

...
 - job_name: 'docker_metrics'
    metrics_path: /metrics
    static_configs:
      - targets: ['host.docker.internal:9933']
...

docker-compose Prometheus 容器配置:

...

prometheus:
    container_name: prom_test
    image: prom/prometheus:v2.30.3
    restart: unless-stopped
    command: "--config.file=/etc/prometheus/prometheus.yml
                  --storage.tsdb.path=/prometheus
                  --storage.tsdb.retention.time=45d"
    ports:
      - 9090:9090
    volumes:
      - ./data/prometheus:/prometheus
      - ./config/prometheus.yml:/etc/prometheus/prometheus.yml:ro
    extra_hosts:
      host.docker.internal: host-gateway
    networks:
      - test-network

...

我们通过 host.docker.internal: host-gateway 在容器配置中指定 extra hosts,这会将 Linux 主机的 IP 地址添加到容器的 /etc/hosts 文件中。

当我在 https://<my_ip>:9090/targets 访问 Prometheus 以检查抓取目标的状态时,Prometheus 最终声明:

但是,单击抓取目标端点块中提供的 http://host.docker.internal:9933/metrics link 实际上会列出 Docker 指标

跳入运行Prometheus容器并在容器内执行cat /etc/hosts表明extra host添加正确

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.1      host.docker.internal
172.22.0.2      fa87b35d3923

运行 wget 在 Docker 指标端点上的 Prometheus 容器内导致超时:

/prometheus $ wget host.docker.internal:9933/metrics
Connecting to host.docker.internal:9933 (172.17.0.1:9933)
wget: can't connect to remote host (172.17.0.1): Connection timed out

Linux 上的问题 - 似乎是 Prometheus 自定义 [=94] 中时无法访问主机=]网络。当我删除自定义网络并在 docker-compose 中的 Prometheus 服务上设置 network_mode: host 时,Prometheus 可以抓取主机 Docker metrics 但它无法访问自定义网络内的其他 metrics exporter 个容器。

如何从 metrics exporter 容器(在自定义网络中)收集指标以及在 Linux 上收集主机 Docker metrics

谢谢!

想通了:

在我们的案例中,Ubuntu 上的 UFW 阻止了来自 自定义 docker 网络中的容器对 docker0 接口的请求.

您可以通过检查 UFW 日志看到这一点,您将看到它如何在指定的指标端口上阻止对 172.17.0.1 (--> host.docker.internal) 的请求。

暂时禁用 UFW 使其工作,Prometheus 现在可以抓取主机上的 Docker 指标。

重新启用 UFW,然后...

(1) 为我的自定义 docker 网络提供了自定义接口名称

networks:
  my_nw:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: my_nw_if

(2) 添加了 UFW 规则以允许自定义网络接口上的流量用于指标端口解决了这个问题 sudo ufw allow in on <custom_interface_name> to any port <port>

这现在允许 Prometheus 容器在该端口上抓取主机上的指标。

感谢这里的每一位参与进来的人!