在自定义网络中(在 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
容器在该端口上抓取主机上的指标。
感谢这里的每一位参与进来的人!
我们在 自定义 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
容器在该端口上抓取主机上的指标。
感谢这里的每一位参与进来的人!