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

pet*_*e19 6 metrics docker prometheus

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

在我们的 Win 10 x64 本地开发环境中,Docker desktop一切正常,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
Run Code Online (Sandbox Code Playgroud)

docker 指标配置/etc/docker/daemon.json

{
  "experimental": true,
  "metrics-addr": "0.0.0.0:9933"
}
Run Code Online (Sandbox Code Playgroud)

配置在/prometheus.yml

...
 - job_name: 'docker_metrics'
    metrics_path: /metrics
    static_configs:
      - targets: ['host.docker.internal:9933']
...
Run Code Online (Sandbox Code Playgroud)

docker-compose普罗米修斯容器的配置:

...

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

...
Run Code Online (Sandbox Code Playgroud)

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

当我访问Prometheusathttps://<my_ip>:9090/targets检查抓取目标的状态时,Prometheus 最终会指出:

图像

但是,单击http://host.docker.internal:9933/metrics抓取目标端点块中提供的链接实际上会列出 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Linux上的问题似乎是在自定义 Docker 网络Prometheus内无法访问主机。当我删除自定义网络并在 中设置服务时,可以抓取主机,但它无法再访问自定义网络内的其他容器。network_mode: hostPrometheusdocker-composePrometheusDocker metricsmetrics exporter

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

谢谢 !

pet*_*e19 3

弄清楚了:

在我们的例子中,UFW阻止Ubuntu来自docker0定义 Docker 网络中的容器的接口请求。

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

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

重新启用 UFW,然后...

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

networks:
  my_nw:
    driver: bridge
    driver_opts:
      com.docker.network.bridge.name: my_nw_if
Run Code Online (Sandbox Code Playgroud)

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

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

感谢这里所有插话的人!