docker 中的 Prometheus node_exporter:主机网络与主机名
Prometheus node_exporter in docker: Host networking vs hostnames
为了监控小型家庭服务器,我在 docker(类似于 https://github.com/stefanprodan/dockprom)上 运行 prometheus 和 node_exporter(以及 grafana 和其他一些东西)。我 运行 桥接 docker 网络上的普罗米修斯。对于 node_exporter,我有两个选项,它们会影响 node_network_transmit_bytes_total
指标。
- 使用与 prometheus 相同的桥接 docker 网络
- 优点:由于 docker 的内部 DNS
,nodeexporter 可以通过名称直接寻址
- 缺点:
node_network_transmit_bytes_total
指标只有 docker 的虚拟内部 NIC,没有被监控机器的物理 NIC。这是从主机绑定挂载 /proc
到容器中的 /host/proc
(具体来说,我的物理接口是 eno0
,在主机上的 /proc/net/dev
中可见):
$ docker exec -it nodeexporter2 cat /host/proc/net/dev | awk '{print }'
Inter-|
face
eth0:
lo:
- 为 nodeexporter 使用主机模式网络
- Pro:所有网卡,包括物理主机网卡,都是可见的
- 缺点:prometheus 似乎没有一种干净的方式来处理 nodeexporter:
localhost
表示普罗米修斯本身
- 主机的主机名似乎无法访问? 运行
docker exec -it prometheus wget -O - http://actual-hostname:9100/metrics
有效(并使用我主机的 LAN IP,192.168.x.x),但将 actual-hostname:9100
配置为 prometheus 目标会出现错误 (Get "http://actual-hostname:9100/metrics": dial tcp 127.0.1.1:9100: connect: connection refused
)。我不确定为什么他们的解决方式不同。
- 我最终做的是模拟 docker-on-windows 和 docker-on-mac 可用的
host.docker.internal
功能,通过将此添加到我的 docker-compose.yml
:
extra_hosts:
- "host.docker.internal:172.18.0.1"
然而,这非常脆弱:172.18 最近是 172.19;我相信它在重新启动或 docker 版本升级时发生了变化。我很想能够将 extra_hosts
设置为 运行 在主机上运行一些脚本以确定正确的网络名称的结果,但这不会自动重新 运行 启动时。
有什么建议吗?
后期编辑:感谢thomas, turns out there's a magic host host-gateway
that does this, so extra_hosts: ["host.docker.internal:host-gateway"]
should do the trick. undocumented, but apparently it's implemented here。并且已经住在 docker 20.10.6(可能更早)。
我最终通过手动配置网络解决了这个问题:
networks:
monitor-net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.23.0.0/16
ip_range: 172.23.5.0/24
gateway: 172.23.5.254
# ...
services:
nodeexporter:
network_mode: host
# ...
prometheus:
networks:
- monitor-net
extra_hosts:
- "host.docker.internal: 172.23.5.254"
然后prometheus有host.docker.internal
的target为node_exporter,地址应该是稳定的
为了监控小型家庭服务器,我在 docker(类似于 https://github.com/stefanprodan/dockprom)上 运行 prometheus 和 node_exporter(以及 grafana 和其他一些东西)。我 运行 桥接 docker 网络上的普罗米修斯。对于 node_exporter,我有两个选项,它们会影响 node_network_transmit_bytes_total
指标。
- 使用与 prometheus 相同的桥接 docker 网络
- 优点:由于 docker 的内部 DNS ,nodeexporter 可以通过名称直接寻址
- 缺点:
node_network_transmit_bytes_total
指标只有 docker 的虚拟内部 NIC,没有被监控机器的物理 NIC。这是从主机绑定挂载/proc
到容器中的/host/proc
(具体来说,我的物理接口是eno0
,在主机上的/proc/net/dev
中可见):$ docker exec -it nodeexporter2 cat /host/proc/net/dev | awk '{print }' Inter-| face eth0: lo:
- 为 nodeexporter 使用主机模式网络
- Pro:所有网卡,包括物理主机网卡,都是可见的
- 缺点:prometheus 似乎没有一种干净的方式来处理 nodeexporter:
localhost
表示普罗米修斯本身- 主机的主机名似乎无法访问? 运行
docker exec -it prometheus wget -O - http://actual-hostname:9100/metrics
有效(并使用我主机的 LAN IP,192.168.x.x),但将actual-hostname:9100
配置为 prometheus 目标会出现错误 (Get "http://actual-hostname:9100/metrics": dial tcp 127.0.1.1:9100: connect: connection refused
)。我不确定为什么他们的解决方式不同。 - 我最终做的是模拟 docker-on-windows 和 docker-on-mac 可用的
host.docker.internal
功能,通过将此添加到我的docker-compose.yml
:
然而,这非常脆弱:172.18 最近是 172.19;我相信它在重新启动或 docker 版本升级时发生了变化。我很想能够将extra_hosts: - "host.docker.internal:172.18.0.1"
extra_hosts
设置为 运行 在主机上运行一些脚本以确定正确的网络名称的结果,但这不会自动重新 运行 启动时。
有什么建议吗?
后期编辑:感谢thomas, turns out there's a magic host host-gateway
that does this, so extra_hosts: ["host.docker.internal:host-gateway"]
should do the trick. undocumented, but apparently it's implemented here。并且已经住在 docker 20.10.6(可能更早)。
我最终通过手动配置网络解决了这个问题:
networks:
monitor-net:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.23.0.0/16
ip_range: 172.23.5.0/24
gateway: 172.23.5.254
# ...
services:
nodeexporter:
network_mode: host
# ...
prometheus:
networks:
- monitor-net
extra_hosts:
- "host.docker.internal: 172.23.5.254"
然后prometheus有host.docker.internal
的target为node_exporter,地址应该是稳定的