【发布时间】: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 服务器,预装了
docker和docker-compose。各自的版本都在 OP 中说明。如 OP 中所述,本地开发环境(因此不是 DO 服务器)是使用 Linux 容器运行 Docker Desktop 的 Win10 x64,并且一切正常。您究竟希望我在哪里实现 --network=host ? -
@jabbson:这正是问题所在;-) 这是否特定于我的设置,如果是这样,罪魁祸首是什么?我已经在 OP 中说明了所有配置。
-
显然是这样,因为在 GCP 中运行相同的 k8s 设置并没有给我带来任何问题,我认为它与 DO 基础设施有关(你尝试过他们的支持吗?)或与您如何配置事物有关,如果是这样,则它与此处解释的配置和设置以外的其他所有事物有关,因为遗憾的是,我可以复制但我尝试过。
标签: docker prometheus metrics