用 Prometheus 与 Node Exporter 监控 Linux 主机
Node Exporter + Prometheus 监控 Linux 主机的完整搭建:安装配置、采集器裁剪、CPU/内存/磁盘/网络核心指标解读、textfile 自定义指标与 FAQ。
Node Exporter 是 Prometheus 生态监控 Linux 主机的标准组件:一个轻量进程,把内核暴露的 CPU、内存、磁盘、网络等数百项指标翻译成 Prometheus 格式。本文是完整的搭建与使用指南。
第一步:部署 Node Exporter
下载解压即用(生产环境建议做成 systemd 服务):
wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
tar xzf node_exporter-*.tar.gz
cd node_exporter-*/
./node_exporter &
systemd 托管(推荐):
# /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
After=network.target
[Service]
ExecStart=/usr/local/bin/node_exporter
Restart=always
[Install]
WantedBy=multi-user.target
验证:curl localhost:9100/metrics | head 能看到指标即成功。
第二步:Prometheus 抓取配置
scrape_configs:
- job_name: node
static_configs:
- targets: ['server1:9100', 'server2:9100']
采集器裁剪:只采需要的
Node Exporter 默认启用几十个采集器(collector),很多你用不上(如 zfs、infiniband)。裁剪降低开销与基数:
# 只看需要的
node_exporter --collector.disable-defaults \
--collector.cpu --collector.meminfo --collector.diskstats \
--collector.filesystem --collector.netdev --collector.loadavg
核心指标速查与解读
CPU:
# 使用率(%)
100 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
# 负载
node_load1 / count by (instance) (node_cpu_seconds_total{mode="idle"}) # 每核负载
内存:
# 使用率
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
注意用 MemAvailable 而不是 MemFree——Linux 会把空闲内存拿去做缓存,MemFree 低不代表内存紧张。
磁盘:
# 分区使用率
(1 - node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes) * 100
# IO 繁忙度
rate(node_disk_io_time_seconds_total[5m])
网络:
rate(node_network_receive_bytes_total{device="eth0"}[5m]) * 8 # 入方向 bps
rate(node_network_transmit_bytes_total{device="eth0"}[5m]) * 8 # 出方向 bps
进阶:textfile 自定义指标
Node Exporter 的 textfile 采集器可以"采集任何你能写成文本的东西"——cron 任务结果、备份完成时间、证书剩余天数:
#!/bin/bash
# /usr/local/bin/backup-metric.sh
OUT=/var/lib/node_exporter/textfile/backup.prom
mkdir -p $(dirname $OUT)
cat > "$OUT.$$" <<EOF
backup_last_success_timestamp $(date +%s)
backup_size_bytes $(du -sb /backups | cut -f1)
EOF
mv "$OUT.$$" "$OUT" # 原子写入,防止采集到半截文件
cron 定期执行,启动 node_exporter 时加 --collector.textfile.directory=/var/lib/node_exporter/textfile。
观测云对照
不想每台机器部署 exporter + 维护抓取配置的话,观测云 DataKit 一条命令安装即自动采集主机指标——CPU/内存/磁盘/网络/进程全覆盖,内置主机监控仪表盘开箱即用;磁盘使用率、inode、负载的告警模板预置,安装完成即进入"有监控"状态。混合云、边缘节点场景下,DataKit 统一采集比逐台维护 exporter 省心得多。
常见问题(FAQ)
Q:Node Exporter 和直接装监控 Agent(如 DataKit)怎么选?
A:已有 Prometheus 体系、团队熟悉 PromQL → Node Exporter 顺路;想要开箱即用、指标+日志+APM 一体 → DataKit 类的一体化 Agent 更高效。
Q:容器里的 Node Exporter 看到的是容器还是宿主?
A:默认看到的是容器自己的命名空间。要监控宿主机需要挂载 /proc、/sys 并加 --path.procfs 等参数,或用 hostPID/hostNetwork。K8s 里用 DaemonSet 部署。
Q:9100 端口要对外开放吗?
A:不要。只允许 Prometheus 服务器的 IP 访问(防火墙/安全组限制),或加 basic auth/TLS。metrics 端点暴露的信息(内核版本、挂载点)对攻击者有用。