Node Exporter —— 主机硬件与操作系统指标的官方采集器
Node Exporter —— 主机硬件与操作系统指标的官方采集器
分类:01 指标采集与时序存储 适用:Linux 物理机 / 虚拟机 / 容器宿主机;每台被监控主机部署一个 一句话:读取
/proc/sys暴露标准化/metrics,是 Prometheus 主机监控的默认入口。 官方:https://github.com/prometheus/node_exporter 授权:Apache License 2.0(开源)
1. 它解决什么问题
| 痛点 | 做法 |
|---|---|
top/iostat/sar 只能看瞬时值、无法留存与集中 |
以 HTTP /metrics 持续暴露数百项主机指标,由 Prometheus 拉取并存入 TSDB |
| 每台机器指标口径、命名不统一 | 统一 node_* 命名 + 多维标签(device/mountpoint/mode/cpu) |
| 自研采集脚本维护成本高、易漏指标 | 官方 Go 单二进制,可插拔 collector,覆盖 CPU/内存/磁盘/网络/文件系统 |
| 批处理任务、业务自定义指标无处暴露 | textfile collector 读取本地 *.prom 文件,零依赖注入自定义指标 |
| 容器/K8s 宿主机指标难以统一采集 | DaemonSet + --path.rootfs=/host 或 Helm chart 批量部署 |
| 服务是否存活只能靠人工巡检 | --collector.systemd 暴露 node_systemd_unit_state,可直接配告警 |
不适合:业务应用指标(用 Prometheus client library 埋点)、Windows 主机(用 windows_exporter)、网络设备 SNMP(用 snmp_exporter)、URL/端口黑盒探测(用 blackbox_exporter)、容器内部资源限额(用 cAdvisor / kube-state-metrics)。Node Exporter 只负责 *NIX 内核与硬件*,且自身不存储、不告警、不画图。 |
2. 核心概念与架构
| 术语 | 含义 |
|---|---|
| Collector | 一类指标的采集插件,各有独立开关;默认启用一批,其余按需启用 |
/metrics |
默认暴露路径,纯文本 Prometheus 格式,一次抓取返回全部启用指标 |
| Metric family | # HELP / # TYPE 声明 + 若干带标签样本行;Counter 名以 _total 结尾 |
--collector.<name> / --no-collector.<name> |
启用默认关闭的 / 关闭默认启用的 collector |
--collector.disable-defaults |
关闭全部默认 collector,仅保留显式 --collector.<name> 指定的 |
| textfile collector | 扫描 --collector.textfile.directory 下 *.prom 文件并合并输出,用于自定义指标 |
node_scrape_collector_success |
每个 collector 采集是否成功的元指标(0 表示读不到 /proc 或驱动异常) |
--path.rootfs |
容器部署时指定宿主根文件系统挂载点前缀 |
Linux 内核数据 node_exporter :9100 Prometheus
┌──────────────────────┐ 读取 ┌─────────────────────────────┐ pull ┌──────────┐
│ /proc/stat cpu/mem │──────►│ collectors(可插拔) │ /metrics│ scrape │
│ /proc/diskstats │ │ cpu / meminfo / filesystem │────────►│ manager │
│ /sys/class/net netdev│──────►│ netdev / diskstats / stat │ └────┬─────┘
│ /sys/class/hwmon │ │ + textfile(*.prom) │ │
│ /run/systemd (systemd)│ │ + systemd / processes(可选) │ ▼
└──────────────────────┘ └─────────────────────────────┘ TSDB → Grafana / Alertmanager
要点:它是无状态旁路进程,每次抓取现读内核数据;数据留存、阈值告警、可视化分别由 Prometheus、Alertmanager、Grafana 承担。 常用 Exporter 生态综述(官方与社区维护,仓库均为真实地址;默认端口以各项目官方文档为准):
| Exporter | 监控对象 | 仓库 | 备注 |
|---|---|---|---|
| node_exporter | Linux 主机硬件/OS | https://github.com/prometheus/node_exporter | 官方,本文主角 |
| windows_exporter | Windows 主机 | https://github.com/prometheus-community/windows_exporter | 官方推荐替代方案 |
| blackbox_exporter | HTTP/TCP/ICMP 黑盒探测 | https://github.com/prometheus/blackbox_exporter | 官方,/probe?target= |
| mysqld_exporter | MySQL/MariaDB | https://github.com/prometheus/mysqld_exporter | 官方,需数据库只读账号 |
| pushgateway | 短生命周期/批处理任务 | https://github.com/prometheus/pushgateway | 官方,push 模式中介 |
| cAdvisor | 容器资源与限额 | https://github.com/google/cadvisor | 社区,K8s 常用 |
| redis_exporter | Redis | https://github.com/oliver006/redis_exporter | 社区 |
| nginx-prometheus-exporter | Nginx stub_status | https://github.com/nginxinc/nginx-prometheus-exporter | 社区 |
完整集成清单见 https://prometheus.io/docs/instrumenting/exporters/ ;选择顺序:官方 Exporter → 组件自带 /metrics → 社区成熟 Exporter → 自研。 |
3. 安装与部署
3.1 环境准备
| 项 | 要求 |
|---|---|
| 依赖/端口 | Go 单二进制无外部依赖;默认监听 :9100/tcp;仅读 /proc、/sys,无需数据库 |
| 权限 | 建议非 root 专用用户;多数指标普通用户可读,个别(如 perf、timex)需要额外 capability |
| 容器 | 必须 --net=host --pid=host -v "/:/host:ro,rslave" 并指定 --path.rootfs=/host,否则读到的是容器自身 |
| 资源 | 常驻约 10~30 MiB 内存、极低 CPU;启用 processes/systemd 后随进程/服务数线性增长 |
| 版本 | 当前大版本 1.x,精确版本号以官方最新稳定版为准:https://prometheus.io/download/ |
3.2 多种安装方式
<VERSION> 为占位符,下载前到官方下载页确认,本文不绑定固定 tag。
# A. 发行版包(版本常滞后,适合实验;包名以发行版仓库为准)
sudo apt install -y prometheus-node-exporter # Debian/Ubuntu
sudo dnf install -y golang-github-prometheus-node-exporter # RHEL/Rocky/Alma/Fedora,EPEL
# B. 官方二进制 + systemd(生产推荐)
VER=<VERSION>; cd /tmp
curl -LO "https://github.com/prometheus/node_exporter/releases/download/v${VER}/node_exporter-${VER}.linux-amd64.tar.gz"
tar xzf "node_exporter-${VER}.linux-amd64.tar.gz" && cd "node_exporter-${VER}.linux-amd64"
sudo useradd --system --no-create-home --shell /usr/sbin/nologin node_exporter
sudo install -m 0755 node_exporter /usr/local/bin/
sudo mkdir -p /var/lib/node_exporter/textfile
sudo chown -R node_exporter:node_exporter /var/lib/node_exporter
# /etc/systemd/system/node_exporter.service
[Unit]
Description=Prometheus Node Exporter
Documentation=https://github.com/prometheus/node_exporter
Wants=network-online.target
After=network-online.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter \
--web.listen-address=0.0.0.0:9100 \
--path.rootfs=/ \
--collector.textfile.directory=/var/lib/node_exporter/textfile \
--collector.systemd \
--collector.processes \
--collector.filesystem.mount-points-exclude='^/(dev|proc|sys|var/lib/docker/.+|var/lib/kubelet/.+)($|/)'
Restart=always
RestartSec=5
NoNewPrivileges=true
ProtectSystem=strict
ProtectHome=true
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload && sudo systemctl enable --now node_exporter
# C. Docker(官方 README 示例;tag 为通用写法,生产请固定到官方最新稳定版)
docker run -d --name node-exporter --net="host" --pid="host" \
-v "/:/host:ro,rslave" \
quay.io/prometheus/node-exporter:latest --path.rootfs=/host
# docker compose 等价:network_mode: host / pid: host / volumes: ['/:/host:ro,rslave'] / command: --path.rootfs=/host
⚠️ 容器部署若不共享 host network/pid 且不加 --path.rootfs,暴露的是容器自身的 CPU/网卡,数值完全失真。
# D. K8s:DaemonSet(每节点一个)或用 kube-prometheus-stack 自带的 prometheus-node-exporter
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
helm install <release> prometheus-community/kube-prometheus-stack -n <namespace> --create-namespace
kubectl -n <namespace> get daemonset -l app.kubernetes.io/name=prometheus-node-exporter
# 自建 DaemonSet 时同样需要 hostNetwork/hostPID + hostPath 挂载 / 并设 --path.rootfs=/host
3.3 首次启动与验证
curl -s http://localhost:9100/metrics | head -20 # 应见 # HELP / # TYPE 与 node_ 样本
curl -s http://localhost:9100/metrics | grep '^node_cpu_seconds_total{mode="idle"' | head -3
curl -s http://localhost:9100/metrics | grep '^node_scrape_collector_success' | head -10 # 全为 1 才正常
curl -s 'http://localhost:9100/metrics?collect[]=cpu&collect[]=meminfo' | grep '^node_' | head # 按 collector 过滤
sudo systemctl status node_exporter --no-pager # active (running)
# Prometheus /targets 中 job=node 的 instance 应为 UP
4. 配置文件详解
Node Exporter 没有主配置文件,行为全部由命令行 flag 决定;只有 TLS/认证用独立的 --web.config.file,自定义指标用 textfile 目录。
| 配置项 | 作用 / 默认 |
|---|---|
--web.listen-address=<addr>:<port> |
监听地址,默认 :9100;建议绑定内网地址 |
--path.rootfs=<dir> |
读取 /proc /sys 的前缀,容器部署必填 /host |
--collector.<name> |
启用默认关闭的 collector(如 systemd、processes、sysctl) |
--no-collector.<name> |
关闭默认启用的 collector(如 arp、hwmon、netdev) |
--collector.disable-defaults |
关闭全部默认 collector,随后只启用显式指定的 |
--collector.textfile.directory=<dir> |
启用并指定 *.prom 目录;⚠️ 文件不支持时间戳 |
--collector.filesystem.mount-points-exclude=<regex> |
排除虚拟/容器挂载点,避免刷屏 |
--collector.filesystem.fs-types-exclude=<regex> |
排除 tmpfs/overlay 等文件系统类型 |
--collector.netdev.device-exclude=<regex> / device-include |
按网卡名过滤(include 与 exclude 互斥) |
--collector.diskstats.device-exclude=<regex> |
按块设备过滤 |
--collector.systemd.unit-include / unit-exclude |
只采集指定 systemd unit,控制基数 |
--web.config.file=<file> |
TLS 与 basic auth(exporter-toolkit,实验性,以官方文档为准) |
| 完整可运行最小配置(systemd unit + 认证配置 + 自定义指标): |
# /etc/node_exporter/web.yml(--web.config.file=/etc/node_exporter/web.yml 加载)
basic_auth_users: { <username>: <bcrypt_hash> } # hash 由 htpasswd -bnBC 10 '' '<password>' 生成
tls_server_config: { cert_file: /etc/node_exporter/tls/server.crt, key_file: /etc/node_exporter/tls/server.key }
# 自定义指标:写入 textfile 目录,必须原子改名(先写 .tmp 再 mv),扩展名 .prom
echo 'batch_job_last_success_seconds '$(date +%s) > /var/lib/node_exporter/textfile/batch.prom.$$
echo 'node_role{role="app"} 1' > /var/lib/node_exporter/textfile/role.prom.$$
mv /var/lib/node_exporter/textfile/role.prom.$$ /var/lib/node_exporter/textfile/role.prom
mv /var/lib/node_exporter/textfile/batch.prom.$$ /var/lib/node_exporter/textfile/batch.prom
# Prometheus 侧抓取配置(/etc/prometheus/prometheus.yml 片段)
scrape_configs:
- job_name: node
scheme: https # 未启用 TLS 时改为 http,并删掉 basic_auth/tls_config
basic_auth: { username: <username>, password_file: /etc/prometheus/secrets/node_password }
tls_config: { ca_file: /etc/prometheus/tls/ca.crt }
static_configs: [{ targets: ["<host>:9100"] }]
# 或按 collector 过滤(二者不可同时使用)
# params: { collect[]: [cpu, meminfo, filesystem] }
5. 核心使用方法
5.1 CLI 与启动参数(≥20 条可用命令/等效说明)
node_exporter --version # 1 查看版本
node_exporter --help # 2 查看全部 collector 与 flag
node_exporter --web.listen-address=127.0.0.1:9100 # 3 仅监听本地
node_exporter --web.listen-address=:9101 # 4 改端口
node_exporter --path.rootfs=/host # 6 容器部署必填
node_exporter --collector.disable-defaults --collector.cpu --collector.meminfo # 7 只启用 CPU/内存
node_exporter --no-collector.arp --no-collector.hwmon # 8 关闭默认启用的采集器
node_exporter --collector.systemd # 9 启用 systemd unit 状态
node_exporter --collector.processes # 10 启用进程维度指标(高基数,慎用)
node_exporter --collector.textfile.directory=/var/lib/node_exporter/textfile # 11 启用自定义指标
node_exporter --collector.filesystem.mount-points-exclude='^/(dev|proc|sys)($|/)' # 12 排除虚拟挂载点
node_exporter --collector.filesystem.fs-types-exclude='^(tmpfs|overlay|squashfs)$' # 13 排除文件系统类型
node_exporter --collector.netdev.device-exclude='^(veth|docker|lo).*' # 14 排除虚拟网卡
node_exporter --collector.diskstats.device-exclude='^(ram|loop|dm-).*' # 15 排除虚拟块设备
node_exporter --collector.systemd.unit-include='(sshd|nginx|mysql)\.service' # 16 只采集关键服务
node_exporter --web.config.file=/etc/node_exporter/web.yml # 18 启用 TLS/认证
sudo systemctl start|stop|restart|status node_exporter # 19 服务管理
sudo journalctl -u node_exporter -f --no-pager # 20 实时日志
5.2 HTTP 端点与抓取过滤
curl -s http://<host>:9100/metrics # 1 全量指标
curl -s 'http://<host>:9100/metrics?collect[]=cpu' # 2 仅 cpu collector
curl -s 'http://<host>:9100/metrics?collect[]=cpu&collect[]=meminfo' # 3 多 collector
curl -s 'http://<host>:9100/metrics?exclude[]=netdev' # 4 排除 netdev(与 collect[] 互斥)
curl -s http://<host>:9100/metrics | grep '^node_scrape_collector_success' # 6 各 collector 健康
curl -s http://<host>:9100/metrics | promtool check metrics # 7 用 promtool 校验格式
collect[] / exclude[] 由 Prometheus 的 scrape_configs[].params 传递,适合不同 Prometheus 各取所需;抓取端 metric_relabel_configs 还能进一步 drop 高基数序列。
5.3 常用指标清单
| 类别 | 指标 | 类型 | 用途 / 常用标签 |
|---|---|---|---|
| CPU | node_cpu_seconds_total |
Counter | 各核各模式累计秒数;mode(idle/user/system/iowait/steal)、cpu;算使用率必须 rate() |
| 负载 | node_load1 / node_load5 / node_load15 |
Gauge | 1/5/15 分钟负载,与 CPU 核数比较 |
| 内存 | node_memory_MemTotal_bytes |
Gauge | 物理内存总量 |
| 内存 | node_memory_MemAvailable_bytes |
Gauge | 可用内存(含可回收缓存),算使用率首选 |
| 文件系统 | node_filesystem_size_bytes / avail_bytes / free_bytes |
Gauge | 容量;标签 device/fstype/mountpoint |
| 文件系统 | node_filesystem_readonly |
Gauge | 挂载点是否只读(1 异常) |
| 磁盘 IO | node_disk_read_bytes_total / written_bytes_total |
Counter | 读写吞吐,用 rate() |
| 磁盘 IO | node_disk_reads_completed_total / writes_completed_total |
Counter | IOPS |
| 磁盘 IO | node_disk_io_time_seconds_total |
Counter | 设备忙时长,算饱和度 |
| 磁盘 IO | node_disk_io_time_weighted_seconds_total |
Counter | 加权 IO 时长,反映排队 |
| 网络 | node_network_receive_bytes_total / transmit_bytes_total |
Counter | 网卡流量,标签 device |
| 网络 | node_network_receive_errs_total / transmit_errs_total |
Counter | 错误包,非 0 即硬件/驱动问题 |
| 网络 | node_network_up |
Gauge | 网卡 up=1 |
| 系统 | node_procs_running / node_procs_blocked |
Gauge | 运行/阻塞进程数,阻塞高多为 IO 等待 |
| 文件句柄 | node_filefd_allocated / node_filefd_maximum |
Gauge | 已用/最大 fd,接近上限会报 "too many open files" |
| 服务 | node_systemd_unit_state |
Gauge | 需 --collector.systemd;标签 name/state,active=1 为正常 |
| 信息 | node_uname_info |
Gauge | 内核/主机名/架构,值恒为 1,用于打标 |
| 元监控 | node_scrape_collector_success |
Gauge | 每个 collector 是否成功,0 要排查 /proc 权限或驱动 |
| 元监控 | node_scrape_collector_duration_seconds |
Gauge | 各 collector 耗时,突增会导致抓取超时 |
| 自定义 | *.prom 内定义的任意指标 |
自定义 | 由 textfile collector 合并输出,如 batch_job_last_success_seconds |
| 常用派生表达式: |
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) # CPU 使用率%
(1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 # 内存使用率%
100 - (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay",mountpoint="/"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay",mountpoint="/"} * 100) # 根分区使用率%
predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 4*3600) < 0 # 4h 内磁盘将满
rate(node_disk_io_time_seconds_total[5m]) # 磁盘饱和度
sum by (instance) (rate(node_network_receive_bytes_total[5m])) # 入向流量 B/s
node_systemd_unit_state{name="<svc>.service",state="active"} == 0 # 关键服务未运行
5.4 --collector.* 开关速用
| 需求 | 写法 | 说明 |
|---|---|---|
| 启用默认关闭的 | --collector.systemd、--collector.processes、--collector.sysctl |
常见于需要服务状态/进程维度 |
| 关闭默认启用的 | --no-collector.<name> |
如 --no-collector.arp、--no-collector.hwmon |
| 只要少数几类 | --collector.disable-defaults --collector.cpu --collector.meminfo |
⚠️ 漏写会导致指标缺失,先在测试机验证 |
| 按维度过滤 | --collector.filesystem.mount-points-exclude=<regex>、--collector.netdev.device-exclude=<regex> |
include/exclude 互斥,别同时给 |
| 抓取时过滤 | Prometheus params: { collect[]: [cpu, meminfo] } 或 exclude[] |
同一 job 只能二选一 |
| 自定义指标 | --collector.textfile.directory=<dir> + 写 *.prom |
⚠️ 不支持时间戳,文件须原子替换 |
6. 告警与通知
告警规则写在 Prometheus 侧(rule_files),通知渠道在 Alertmanager 侧;Node Exporter 只提供 node_* 指标。
# /etc/prometheus/rules/node.yml —— 阈值规则
groups:
- name: node.rules
rules:
- alert: NodeDown
expr: up{job="node"} == 0
for: 2m
labels: { severity: critical }
- alert: HighCpuUsage
expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 85
for: 5m
labels: { severity: warning }
- alert: HighMemoryUsage
expr: (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 > 90
for: 5m
labels: { severity: warning }
- alert: DiskWillFillIn4h
expr: predict_linear(node_filesystem_avail_bytes{mountpoint="/"}[6h], 4*3600) < 0
for: 10m
labels: { severity: critical }
- alert: CollectorFailed
expr: node_scrape_collector_success == 0
for: 10m
labels: { severity: warning }
| 渠道 | Alertmanager 侧承载方式 |
|---|---|
| 邮件 | email_configs + global.smtp_smarthost |
| 企业微信 | 原生 wechat_configs(corp_id/api_secret/agent_id/to_user) |
| 钉钉 / Slack / Webhook | 钉钉用 webhook_configs 指向群机器人;Slack 用 slack_configs;通用 webhook_configs: [{ url: <url> }] 发送 JSON |
# 以下为 Alertmanager 侧片段,完整示例见同目录 alertmanager.md 第 6 章
route: # 路由树:按 severity 分流 + 分组
receiver: default
group_by: [alertname, instance]
group_wait: 30s
group_interval: 5m
routes:
- { matchers: ['severity="critical"'], receiver: wecom }
receivers:
- name: default
email_configs: [{ to: "<oncall@company>" }]
- name: wecom
wechat_configs: [{ corp_id: "<corp>", api_secret: "<secret>", agent_id: "<id>", to_user: "@all" }]
inhibit_rules: # 抑制:整机宕机时压制其上的 CPU/磁盘告警
- { source_matchers: ['alertname="NodeDown"'], target_matchers: ['severity="warning"'], equal: [instance] }
# 静默:amtool silence add / Web UI 临时维护;time_intervals 可配固定静默时段
完整链路:node_exporter /metrics:9100 → Prometheus(job=node) 抓取 → TSDB → alerting rule 评估 → firing → Alertmanager :9093 分组/抑制/静默 → receiver 发邮件/企微/钉钉/Slack/Webhook;大盘侧在 Grafana 添加 Prometheus 数据源后导入官方 Node Exporter 仪表盘(在 Grafana 官方 dashboard 库搜索 "Node Exporter Full",ID 以该页面为准)。
7. 实战场景
7.1 用 textfile collector 暴露自定义业务指标
目标:把批处理任务成功时间、机器角色等自定义指标并入主机抓取。步骤:建目录 → 写 .prom → 启用 flag → 验证。
sudo mkdir -p /var/lib/node_exporter/textfile
# 原子写入:先临时文件再改名,避免抓取到半截内容
printf 'batch_job_last_success_seconds %s\n' "$(date +%s)" > /var/lib/node_exporter/textfile/batch.prom.$$
printf 'node_role{role="app"} 1\n' > /var/lib/node_exporter/textfile/role.prom.$$
mv /var/lib/node_exporter/textfile/batch.prom.$$ /var/lib/node_exporter/textfile/batch.prom
mv /var/lib/node_exporter/textfile/role.prom.$$ /var/lib/node_exporter/textfile/role.prom
# systemd unit 的 ExecStart 加 --collector.textfile.directory=/var/lib/node_exporter/textfile,改完 daemon-reload && restart
验证:curl -s http://<host>:9100/metrics | grep -E '^(batch_job_last_success_seconds|node_role)'。回滚:删除 .prom 文件并从 unit 移除 flag 后重启。⚠️ 文件内不要写时间戳,否则校验失败。
7.2 用 systemd collector 监控关键服务
目标:sshd/nginx 挂掉时触发告警。步骤:启用 collector → 限制 unit 范围 → 配规则 → 验证。
sudo sed -i 's/--collector.systemd/--collector.systemd --collector.systemd.unit-include="(sshd|nginx)\\.service"/' /etc/systemd/system/node_exporter.service
sudo systemctl daemon-reload && sudo systemctl restart node_exporter
验证:systemctl stop nginx 后指标 active 变 0,/api/v1/alerts 出现告警。回滚:移除 flag 并重启,删对应规则文件后 POST /-/reload。⚠️ 不加 unit-include 会把全部 unit 变成序列,基数暴涨。
7.3 启用 TLS + basic auth 并让 Prometheus 抓取
目标:收敛 9100 暴露面,只接受带凭据的 HTTPS 抓取。
sudo mkdir -p /etc/node_exporter/tls
# 证书与 bcrypt hash 自行生成:htpasswd -bnBC 10 '' '<password>' | tr -d ':\n'
sudo tee /etc/node_exporter/web.yml >/dev/null <<'YAML'
basic_auth_users: { <username>: <bcrypt_hash> }
tls_server_config: { cert_file: /etc/node_exporter/tls/server.crt, key_file: /etc/node_exporter/tls/server.key }
YAML
# unit 加 --web.config.file=/etc/node_exporter/web.yml,scheme 改为 https,Prometheus 配 basic_auth + tls_config.ca_file
sudo systemctl daemon-reload && sudo systemctl restart node_exporter
curl -sk https://<host>:9100/metrics | head -3 # 无认证应失败
curl -s https://<host>:9100/metrics -u <username>:<password> --cacert /etc/prometheus/tls/ca.crt | head -3
验证:Prometheus /targets 中该实例仍为 UP,无认证 curl 返回 401。回滚:移除 --web.config.file 并重启,Prometheus 侧改回 scheme: http。⚠️ 先确认凭据正确再对全部主机铺开,否则会一次性全 DOWN。
8. 日常运维与故障排查
sudo systemctl status node_exporter --no-pager ; sudo systemctl restart node_exporter
sudo journalctl -u node_exporter -f --no-pager # systemd 日志走 journald;容器用 docker logs node-exporter
sudo journalctl -u node_exporter --since "1 hour ago" | grep -iE 'error|warn|collector'
curl -s http://<host>:9100/metrics | grep '^node_scrape_collector_success' | grep ' 0$' # 找出失败 collector
curl -sG http://<prom>:9090/api/v1/query --data-urlencode 'query=up{job="node"}' | jq '.data.result'
curl -s http://<prom>:9090/api/v1/targets?state=active | jq '.data.activeTargets[] | select(.labels.job=="node" and .health!="up")'
| 现象 | 原因 | 处置 |
|---|---|---|
/metrics 只有容器自身的 CPU/网卡 |
容器未共享 host namespace 或漏 --path.rootfs=/host |
加 --net=host --pid=host -v "/:/host:ro,rslave" --path.rootfs=/host |
node_scrape_collector_success{collector="x"} 0 |
该 collector 读不到 /proc//sys 文件或权限不足 |
检查内核版本、驱动、SELinux/AppArmor;用 --no-collector.x 关掉无关采集器 |
| Prometheus target DOWN | 9100 未监听、防火墙拦截、或启用 TLS 后仍用 http | `ss -lntp |
抓取超时 context deadline exceeded |
启用 processes/systemd 后采集过慢 |
看 node_scrape_collector_duration_seconds;加 include 白名单或调大 scrape_timeout(≤ interval) |
| 磁盘/网卡序列暴涨 | 未排除 veth、overlay、loop、docker 挂载点 | 用 mount-points-exclude / device-exclude 或 Prometheus metric_relabel_configs drop |
| textfile 指标不出现或报错 | 文件名非 .prom、写了时间戳、非原子写、属主不可读 |
校验格式 promtool check metrics;改 mv 原子替换;chown node_exporter |
--collector.disable-defaults 后大盘全空 |
只启用个别 collector,其余指标消失 | 显式补全所需 --collector.<name>;⚠️ 先在测试机验证再上生产 |
9. 性能、容量与高可用
单机序列数 ≈ 基础序列(数百) + CPU核数×mode数 + 挂载点数×5 + 网卡数×8 + 块设备数×10
+ systemd unit 数 + 进程数(仅启用 processes 时)
单实例磁盘/内存开销 ≈ 序列数 × 每样本约 1.7B × (保留秒数/采集间隔)(存于 Prometheus,非 exporter 自身)
| 调优项 | 建议 |
|---|---|
| 关闭无用 collector | --no-collector.arp / hwmon / netstat,减少样本与采集耗时 |
| 维度白名单 | mount-points-exclude、fs-types-exclude、device-exclude、systemd.unit-include |
| 高基数开关 | processes、systemd 默认关闭,启用前先单机试跑并观察 scrape_duration_seconds |
HA / 规模化:Node Exporter 是每台主机一个的无状态端点,自身无 HA;可靠性靠三点:① 双 Prometheus 实例抓同一批 target(external_labels.replica 区分,Alertmanager 集群去重告警);② 用 file_sd_configs / consul_sd / K8s DaemonSet 自动发现,避免手写静态列表;③ 超大规模按业务/机房分片 Prometheus,再用联邦或 remote_write 汇总。⚠️ 同一主机不要跑多个 node_exporter 抢 9100 端口。 |
|
| 监控监控系统自身: |
up{job="node"} == 0 # 主机 exporter 不可达
node_scrape_collector_success == 0 # 某 collector 采集失败
scrape_duration_seconds{job="node"} # 抓取耗时趋势
scrape_samples_scraped{job="node"} # 单 target 样本数,突增即基数问题
10. 安全加固、备份与升级
# 暴露面收敛:只监听内网地址,防火墙白名单
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="<prom_cidr>" port port="9100" protocol="tcp" accept'
sudo ufw allow from <prom_cidr> to any port 9100 proto tcp && sudo ufw deny 9100/tcp
最小权限:专用 node_exporter 系统用户 + nologin;systemd 加 NoNewPrivileges=true/ProtectSystem=strict/ProtectHome=true;容器 rootfs 用 :ro,rslave;凭据放 password_file 且 chmod 0600;⚠️ 勿以 root 运行、勿把 9100 暴露公网。TLS/认证用 --web.config.file(见 7.3),实验性能力以官方文档为准。
备份与恢复(exporter 无状态,备份配置即可):
sudo tar czf /backup/node_exporter-conf-<date>.tar.gz \
/etc/systemd/system/node_exporter.service /etc/node_exporter/ /var/lib/node_exporter/textfile/
# 恢复:解包到原路径后 daemon-reload && restart
sudo tar xzf /backup/node_exporter-conf-<date>.tar.gz -C /
sudo systemctl daemon-reload && sudo systemctl restart node_exporter
升级顺序:① node_exporter --version 记录 → ② 备份上述配置 → ③ 逐台(滚动)停服 → ④ cp /usr/local/bin/node_exporter /usr/local/bin/node_exporter.old,替换新二进制 → ⑤ 启动并验证 /metrics、collector success 全 1、Prometheus target UP → ⑥ 观察 24h → ⑦ 回滚:换回 node_exporter.old 并重启。⚠️ 跨大版本先看官方 Release notes:collector 可能改名、默认启用集合可能变化,回归大盘与告警规则后再全量铺开。
11. 常见坑
- 容器读到的全是容器自身指标:漏
--net=host --pid=host或--path.rootfs=/host→ 按官方 README 补齐挂载与参数。 - 9100 被防火墙挡:Prometheus 侧 DOWN 但
curl localhost:9100正常 → 放通<prom_cidr>到 9100。 - 开启
processes/systemd后序列暴涨:每进程/每 unit 一条序列 → 用unit-include白名单或干脆不启用。 - textfile 写了时间戳:官方明确不支持 → 只写
metric{label="v"} value,去掉时间戳列。 - textfile 非原子写:抓取到半截文件导致解析失败 → 先写
*.prom.$$再mv成*.prom。 - 未排除虚拟挂载点/网卡:overlay、veth、loop 刷屏且干扰磁盘告警 →
mount-points-exclude+device-exclude。 - 用
MemFree算内存使用率:数值虚高误报 → 一律用node_memory_MemAvailable_bytes。 --collector.disable-defaults漏加 collector:大盘与告警大面积无数据 → ⚠️ 先在测试机验证必需的 collector 清单。- collector success=0 被忽略:
/proc权限、内核缺驱动、SELinux 拦截 → 配node_scrape_collector_success == 0告警。 - 启用 TLS 后 Prometheus 未同步改配置:全量 DOWN → ⚠️ 先在单台验证
scheme/basic_auth/ca_file再铺开。
12. 速查表
| 类别 | 项 | 值 / 命令 |
|---|---|---|
| 默认端口 | HTTP | 9100/tcp |
| 默认路径 | 指标 | /metrics |
| 查看全部开关 | 帮助 | node_exporter --help |
| 启用默认关闭 | flag | --collector.systemd / --collector.processes |
| 关闭默认启用 | flag | --no-collector.<name> |
| 只留指定 | flag | --collector.disable-defaults --collector.cpu --collector.meminfo |
| 自定义指标 | flag | --collector.textfile.directory=<dir> + *.prom |
| 容器必填 | flag | --path.rootfs=/host(配合 --net=host --pid=host 与 /:/host:ro,rslave) |
| 过滤挂载点 | flag | --collector.filesystem.mount-points-exclude=<regex> |
| 过滤网卡 | flag | --collector.netdev.device-exclude=<regex> |
| 抓取时过滤 | URL | ?collect[]=cpu / ?exclude[]=netdev(互斥) |
| 关键指标 | CPU/内存 | node_cpu_seconds_total / node_memory_MemAvailable_bytes |
| 关键指标 | 磁盘/网络 | node_filesystem_avail_bytes / node_network_receive_bytes_total |
| 关键指标 | 负载/服务 | node_load5 / node_systemd_unit_state |
| 元指标 | 健康 | node_scrape_collector_success / node_scrape_collector_duration_seconds |
| 健康检查 | 命令 | curl -s <host>:9100/metrics | grep '^node_' | wc -l |
| 格式校验 | 命令 | curl -s <host>:9100/metrics | promtool check metrics |
| 官方镜像 | 地址 | quay.io/prometheus/node-exporter / prom/node-exporter |
| 服务管理 | 命令 | systemctl start|stop|restart|status node_exporter |
13. 选型建议与同类对比
| 维度 | Node Exporter | windows_exporter | cAdvisor | Telegraf / collectd | Zabbix agent |
|---|---|---|---|---|---|
| 监控对象 | Linux 主机硬件/OS | Windows 主机 | 容器进程资源与限额 | 通用采集框架(插件多) | 主机,配合 Zabbix Server |
| 指标来源 | /proc /sys |
Windows 性能计数器 | cgroup / containerd | 插件(含 exec/snmp 等) | 内置 item + 自定义脚本 |
| 输出格式 | Prometheus /metrics |
Prometheus /metrics |
Prometheus /metrics |
多后端(含 Prometheus 输出插件) | Zabbix 私有协议 |
| 与 Prometheus 集成 | 原生最佳 | 原生 | 原生 | 需输出插件 | 需代理/转换 |
| 最适 | Linux 主机监控底座 | Windows 主机 | K8s 容器资源 | 异构多后端采集 | 已用 Zabbix 的传统环境 |
| 选它:Linux/容器宿主机;已用 Prometheus + Grafana;要标准化的主机指标与成熟大盘模板;希望零依赖、单二进制、无状态易滚动升级。 | |||||
| 别选:Windows 主机(windows_exporter)、需要 SNMP 网络设备(snmp_exporter)、要监控容器内 cgroup 限额(cAdvisor)、需要业务埋点(client library)、主监控栈是 Zabbix 且无 Prometheus(用原生 agent 更顺)。常与 cAdvisor + kube-state-metrics + blackbox_exporter 组合补齐云原生视图。 |
14. 参考链接
- 源码与 README(默认 collector、容器部署、textfile):https://github.com/prometheus/node_exporter
- 官方下载页:https://prometheus.io/download/
- Exporter 与集成清单:https://prometheus.io/docs/instrumenting/exporters/
- 官方镜像:https://quay.io/repository/prometheus/node-exporter | https://hub.docker.com/r/prom/node-exporter/
- 官方其他 Exporter:https://github.com/prometheus/blackbox_exporter | https://github.com/prometheus/mysqld_exporter | https://github.com/prometheus/memcached_exporter | https://github.com/prometheus/statsd_exporter | https://github.com/prometheus/pushgateway
- 社区 Exporter:https://github.com/google/cadvisor | https://github.com/oliver006/redis_exporter | https://github.com/nginxinc/nginx-prometheus-exporter | https://github.com/prometheus/jmx_exporter | https://github.com/prometheus-community/windows_exporter
<VERSION>/<xxx>为占位符;当前大版本 1.x,精确版本号、下载文件名与镜像 tag 以官方最新稳定版为准;--web.config.file为实验性能力,以官方文档为准。