Node Exporter —— 主机硬件与操作系统指标的官方采集器

运维监控软件手册 01-指标采集与时序存储 26.4 KB 原文

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. 常见坑

  1. 容器读到的全是容器自身指标:漏 --net=host --pid=host 或 --path.rootfs=/host → 按官方 README 补齐挂载与参数。
  2. 9100 被防火墙挡:Prometheus 侧 DOWN 但 curl localhost:9100 正常 → 放通 <prom_cidr> 到 9100。
  3. 开启 processes/systemd 后序列暴涨:每进程/每 unit 一条序列 → 用 unit-include 白名单或干脆不启用。
  4. textfile 写了时间戳:官方明确不支持 → 只写 metric{label="v"} value,去掉时间戳列。
  5. textfile 非原子写:抓取到半截文件导致解析失败 → 先写 *.prom.$$ 再 mv 成 *.prom。
  6. 未排除虚拟挂载点/网卡:overlay、veth、loop 刷屏且干扰磁盘告警 → mount-points-exclude + device-exclude。
  7. 用 MemFree 算内存使用率:数值虚高误报 → 一律用 node_memory_MemAvailable_bytes。
  8. --collector.disable-defaults 漏加 collector:大盘与告警大面积无数据 → ⚠️ 先在测试机验证必需的 collector 清单。
  9. collector success=0 被忽略:/proc 权限、内核缺驱动、SELinux 拦截 → 配 node_scrape_collector_success == 0 告警。
  10. 启用 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. 参考链接

<VERSION> / <xxx> 为占位符;当前大版本 1.x,精确版本号、下载文件名与镜像 tag 以官方最新稳定版为准;--web.config.file 为实验性能力,以官方文档为准。

Node Exporter —— 主机硬件与操作系统指标的官方采集器 - 知识库 - 起航社区