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

时间:2021-03-17 15:29:39

标签: docker docker-compose prometheus prometheus-node-exporter

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

  • 使用与 prometheus 相同的桥接 docker 网络
    • 优点:由于 docker 的内部 DNS,可以直接按名称寻址 nodeexporter
    • Con:node_network_transmit_bytes_total 指标只有 docker 的虚拟内部 NIC,而不是被监控机器的物理 NIC。这是从主机到容器中的 /proc 的深度绑定挂载(具体来说,我的物理接口是 /host/proc,在主机上的 eno0 中可见):
      /proc/net/dev
  • 为 nodeexporter 使用主机模式网络
    • 优点:所有 NIC,包括物理主机 NIC,都是可见的
    • 缺点:prometheus 似乎没有一种干净的方法来解决 nodeexporter:
      • $ docker exec -it nodeexporter2 cat /host/proc/net/dev | awk '{print $1}' Inter-| face eth0: lo: 表示普罗米修斯本身
      • 主机的主机名似乎无法访问?运行 localhost 有效(并使用我主机的 LAN IP,192.168.x.x),但将 docker exec -it prometheus wget -O - http://actual-hostname:9100/metrics 配置为 prometheus 目标会产生错误(actual-hostname:9100)。我不确定为什么他们的解决方式不同。
      • 我最终做的是模拟可用于 docker-on-windows 和 docker-on-mac 的 Get "http://actual-hostname:9100/metrics": dial tcp 127.0.1.1:9100: connect: connection refused 功能,方法是将其添加到我的 host.docker.internal 中:
        docker-compose.yml
        然而,这非常脆弱:172.18 刚好是最近的 172.19;我相信它在重新启动或 docker 版本升级时发生了变化。我希望能够将 extra_hosts: - "host.docker.internal:172.18.0.1" 设置为在主机上运行一些脚本以确定正确的网络名称的结果,但不会在启动时自动重新运行。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我最终通过手动配置网络解决了这个问题:

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的target,地址应该是稳定的。