【问题标题】:Cannot Scrape exposed Docker Metrics from Prometheus container when in custom network (on Linux Host)在自定义网络中(在 Linux 主机上)时,无法从 Prometheus 容器中抓取暴露的 Docker 指标
【发布时间】:2021-10-29 19:52:15
【问题描述】:

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

在我们在 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

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

{
  "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 链接实际上会列出 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

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

/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自定义 Docker 网络 内时无法访问主机。当我删除自定义网络并在docker-compose 中的Prometheus 服务上设置network_mode: host 时,Prometheus 能够抓取主机Docker metrics 但它无法再访问自定义网络内的其他metrics exporter 容器.

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

谢谢!

【问题讨论】:

  • 您使用的是Docker-for-Linux 还是普通的包管理器docker daemon 安装?您还使用什么发行版?只是为了澄清一下,在windows docker desktop 中是否有相同的确切撰写文件?也尝试使用--network=host
  • 您认为这对您的设置非常特殊吗?我刚刚尝试运行 Ubuntu,安装 docker/docker compose 并使用完全相同的配置启动 prom/prometheus,一切正常。我想知道您的设置是否易于重现(以某种方式无法正常工作)。
  • @NoamYizraeli:这是一台运行 Ubuntu 18.04 的 Digital Ocean 服务器,预装了 dockerdocker-compose。各自的版本都在 OP 中说明。如 OP 中所述,本地开发环境(因此不是 DO 服务器)是使用 Linux 容器运行 Docker Desktop 的 Win10 x64,并且一切正常。您究竟希望我在哪里实现 --network=host ?
  • @jabbson:这正是问题所在;-) 这是否特定于我的设置,如果是这样,罪魁祸首是什么?我已经在 OP 中说明了所有配置。
  • 显然是这样,因为在 GCP 中运行相同的 k8s 设置并没有给我带来任何问题,我认为它与 DO 基础设施有关(你尝试过他们的支持吗?)或与您如何配置事物有关,如果是这样,则它与此处解释的配置和设置以外的其他所有事物有关,因为遗憾的是,我可以复制但我尝试过。

标签: docker prometheus metrics


【解决方案1】:

想通了:

在我们的例子中,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 容器在该端口上抓取主机上的指标。

感谢所有参与进来的人!

【讨论】:

    猜你喜欢
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    • 2018-12-20
    • 2016-12-28
    • 1970-01-01
    • 2016-02-16
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多