docker中的Prometheus node_exporter:主机网络与主机名

Posted

技术标签:

【中文标题】docker中的Prometheus node_exporter:主机网络与主机名【英文标题】:Prometheus node_exporter in docker: Host networking vs hostnames 【发布时间】:2021-06-14 23:24:08 【问题描述】:

为了监控小型家庭服务器,我在 docker(类似于 https://github.com/stefanprodan/dockprom)上运行 prometheus 和 node_exporter(以及 grafana 和其他一些东西)。我在桥接的 docker 网络上运行 prometheus。对于 node_exporter,我有两个选项,它们会影响 node_network_transmit_bytes_total 指标。

使用与 prometheus 相同的桥接 docker 网络 专业版:nodeexporter 可以通过名称直接寻址,这要归功于 docker 的内部 DNS Con: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 $1'
Inter-|
face
eth0:
lo:
对 nodeexporter 使用主机模式网络 专业版:所有 NIC,包括物理主机 NIC,都是可见的 Con: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 设置为在主机上运行一些脚本以确定正确的网络名称的结果,但这不会在启动时自动重新运行。

有什么建议吗?

【问题讨论】:

【参考方案1】:

后期编辑:感谢thomas,原来有一个神奇的主机host-gateway 可以做到这一点,所以extra_hosts: ["host.docker.internal:host-gateway"] 应该可以解决问题。无证,但显然它已实现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的node_exporter的目标是host.docker.internal,地址应该是稳定的。

【讨论】:

在较新的 docker 版本中,您可以使用 extra_hosts: - "host.docker.internal:host-gateway" 而不必手动配置网络。 嗯,酷!它没有记录,但显然它已实现 here 并且已经存在于 docker 20.10.6(可能更早)中。

以上是关于docker中的Prometheus node_exporter:主机网络与主机名的主要内容,如果未能解决你的问题,请参考以下文章

docker swarm 中的 Prometheus dns 服务发现

是否可以运行 Prometheus 和 Grafana docker 容器但使用安装在主机中的 node-exporter?

docker配置搭建Prometheus

Kube-Prometheus-Stack Helm Chart v14.40:macOS Catalina 10.15.7 上的 Docker For Mac Kubernetes 集群中的节点导出

云原生之Docker实战使用Docker部署Prometheus 服务监控系统

无法使用 docker (prom/prometheus) 加载 prometheus.yml 配置文件