问题记录:Prometheus 的 node target 2/3 up(VM2 采集不到)

发布于 1 小时前 8 次阅读


问题记录:Prometheus 的 node target 2/3 up(VM2 采集不到)

实训04 监控与运维工具部署 · 环境:Debian 12,三台 VM 同处教室共享二层网络 VM1=10.4.0.1(网关,172.16.30.208 物理) / VM2=10.4.0.10 / VM3=10.4.0.20(Prometheus 9090 所在)


一、现象

Prometheus Targets 页面显示 node (2/3 up)http://10.4.0.10:9100/metrics(VM2)状态为 DOWN

Get "http://10.4.0.10:9100/metrics": dial tcp 10.4.0.10:9100: connect: connection refused

而 VM1(10.4.0.1)、VM3(10.4.0.20)两个 target 都是 UP。

但 VM2 本机检查一切正常:node_exporter 在跑、监听 *:9100curl http://localhost:9100/metrics 能拿到数据。

故障截图:node 2/3 up,10.4.0.10 DOWN

二、排查过程(关键证据链)

  1. VM2 防火墙不是原因:在 VM2 上 nft monitor trace 抓包,grep 'ip saddr 10.4.0.20' 计数为 0 —— VM3 发来的 SYN 根本没到达 VM2 的 INPUT 链,说明不是 VM2 侧拦的。
  2. 冒充设备暴露:在 VM3 上 tcpdump -i ens33 'host 10.4.0.10 and tcp port 9100',发现发往 10.4.0.10:9100 的 SYN 收到 RST,但 RST 的源 MAC 是 00:0c:29:3b:ee:8d,并非 VM2 的真实 MAC 00:0c:29:0e:8c:a5 —— 有另一台设备冒充 10.4.0.10 在应答。
  3. 同一 IP 两个 MAC:VM1 的 ARP 表里 10.4.0.10 同时出现两条:00:0c:29:3b:ee:8d(ens33 侧)和 00:0c:29:0e:8c:a5(ens37 侧),说明两个设备争用同一个 IP。
  4. ARP 互被毒化
    • VM3 ARP:10.4.0.10 → 00:0c:29:3b:ee:8d(毒化,应为 00:0c:29:0e:8c:a5
    • VM2 ARP:10.4.0.20 → 00:0c:29:d0:c3:c1(VM3 的 IP 也被邻居抢走)
  5. 确认是邻居设备:VM2 只有一块网卡 ens33(MAC 00:0c:29:0e:8c:a5),所以 00:0c:29:3b:ee:8d 必然是隔壁同学的克隆 VM。
  6. 排除其他假设
    • 不是 node_exporter 配置问题:VM2 服务卸载重装后依旧 DOWN。
    • 不是 IPv6 绑定问题:服务绑 *:9100,在 bindv6only=0 下 IPv4 也能正常接入(VM1 同样 [::]:9100 但能通)。
    • 不是防火墙:见证据 1。

三、根因

共享教室二层网络(同一 L2 广播域)的 ARP/IP 地址冲突。 隔壁同学的克隆 VM 也使用了 10.4.0.10 / 10.4.0.20,导致我们的 VM3 的 ARP 表被毒化——它认为 10.4.0.10 的 MAC 是邻居机的 00:0c:29:3b:ee:8d,于是发往 10.4.0.10:9100 的采集请求被送到邻居机器,邻居没开 9100,回 connection refused


四、解决方法(VM 内临时 workaround)

VM2 和 VM3 上把 ARP 静态钉死到正确 MAC(重启前一直有效;重启后需重钉,可写进 rc.local 固化):

# ===== VM2 (10.4.0.10) =====
sudo ip neigh replace 10.4.0.1  lladdr 00:0c:29:eb:81:5f nud permanent dev ens33
sudo ip neigh replace 10.4.0.20 lladdr 00:0c:29:1e:12:16 nud permanent dev ens33

# ===== VM3 (10.4.0.20) =====
sudo ip neigh replace 10.4.0.1  lladdr 00:0c:29:eb:81:5f nud permanent dev ens33
sudo ip neigh replace 10.4.0.10 lladdr 00:0c:29:0e:8c:a5 nud permanent dev ens33

MAC 对照表:

角色 IP 正确 MAC
VM1(网关) 10.4.0.1 00:0c:29:eb:81:5f
VM2 10.4.0.10 00:0c:29:0e:8c:a5
VM3 10.4.0.20 00:0c:29:1e:12:16

钉完后等 Prometheus 约 30s 自动刷新,target 即从 2/3 up 变为 3/3 up 全绿。

修复后截图:node 3/3 up

五、根治方案(可选)

ARP 钉是 VM 内的临时绕过。真正的根治是在 VMware / 虚拟化层 把这三台 VM 划分到独立的 port group / 私有网络,与教室其他同学的 VM 隔离广播域,从物理上消除 IP 冲突。


附:涉及的相关脚本

  • 04 企业监控与运维工具部署/scripts/pin_arp.sh —— 钉 ARP 的封装脚本(含上述三条 ip neigh replace)。
  • 04 企业监控与运维工具部署/scripts/reinstall_node_exporter_vm2.sh —— 本次为排除”服务配置”假设而做的一次干净重装(确认不是服务问题)。