更新时间:2025 年 6 月
版本:node exporter 1.9.1
node exporter 的 GitHub 地址:prometheus/node_exporter: Exporter for machine metrics
简介
Node Exporter 是 Prometheus 官方提供的系统级监控 Exporter,专门用于收集 Unix/Linux 系统的硬件和操作系统指标。它是 Prometheus 生态系统中使用最广泛的 Exporter 之一
主要功能
- 硬件监控:CPU、内存、磁盘、网络接口等硬件资源使用情况
- 系统监控:文件系统、负载、内核统计、系统启动时间等
- 进程监控:系统进程数量、状态等
- 网络监控:网络接口统计、连接状态等
特点
- 轻量级:占用系统资源极少
- 无侵入性:通过读取
/proc
、/sys
等系统文件系统获取指标,不影响系统性能 - 高度可配置:支持启用/禁用特定的收集器(collector)
- 跨平台:支持 Linux、Darwin、FreeBSD、OpenBSD、DragonFly、Solaris 等
部署
方式一:二进制文件(推荐)
部署
基础变量设置
NODE_EXPORTER_VERSION=1.9.1
NODE_EXPORTER_OS=linux
NODE_EXPORTER_ARCH=amd64
NODE_EXPORTER_HOME=/opt/node_exporter
NODE_EXPORTER_CONF=/etc/node_exporter
NODE_EXPORTER_USER=node_exporter
NODE_EXPORTER_USER_GROUP=node_exporter
# 创建目录
mkdir -p ${NODE_EXPORTER_HOME}/bin
mkdir -p ${NODE_EXPORTER_CONF}
# 创建用户和组
groupadd --system ${NODE_EXPORTER_USER}
useradd -s /sbin/nologin --system -g ${NODE_EXPORTER_USER_GROUP} ${NODE_EXPORTER_USER}
下载解压
下载
# 下载
curl -x http://192.168.111.1:10811 \
-o /usr/local/src/node_exporter-${NODE_EXPORTER_VERSION}.${NODE_EXPORTER_OS}-${NODE_EXPORTER_ARCH}.tar.gz \
-L https://github.com/prometheus/node_exporter/releases/download/v${NODE_EXPORTER_VERSION}/node_exporter-${NODE_EXPORTER_VERSION}.${NODE_EXPORTER_OS}-${NODE_EXPORTER_ARCH}.tar.gz
解压
#
tar -zxvf /usr/local/src/node_exporter-${NODE_EXPORTER_VERSION}.${NODE_EXPORTER_OS}-${NODE_EXPORTER_ARCH}.tar.gz \
-C /usr/local/src/
复制到对应目录
cp /usr/local/src/node_exporter-${NODE_EXPORTER_VERSION}.${NODE_EXPORTER_OS}-${NODE_EXPORTER_ARCH}/* \
${NODE_EXPORTER_HOME}/bin
授权
chown -R ${NODE_EXPORTER_USER}:${NODE_EXPORTER_USER_GROUP} ${NODE_EXPORTER_HOME}
chown -R ${NODE_EXPORTER_USER}:${NODE_EXPORTER_USER_GROUP} ${NODE_EXPORTER_CONF}
配置
配置环境变量
cat > /etc/profile.d/node_exporter.sh << EOF
export NODE_EXPORTER_VERSION=${NODE_EXPORTER_VERSION}
export NODE_EXPORTER_HOME=${NODE_EXPORTER_HOME}
export NODE_EXPORTER_CONF=${NODE_EXPORTER_CONF}
export NODE_EXPORTER_USER=${NODE_EXPORTER_USER}
export NODE_EXPORTER_USER_GROUP=${NODE_EXPORTER_USER_GROUP}
export PATH=\${PATH}:\${NODE_EXPORTER_HOME}/bin
EOF
source /etc/profile
配置程序
通过环境文件导入 systemd
启动变量
$ sudo -u ${NODE_EXPORTER_USER} vim ${NODE_EXPORTER_CONF}/env.conf
# 排除挂载点(正则)
MOUNT_POINTS_EXCLUDE="^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+|var/lib/containers/storage/.+)($|/)"
# 监听端口
LISTEN_ADDRESS=":9100"
#
PROCFS="/proc"
SYSFS="/sys"
# 额外的 collector
EXTRA_COLLECTORS="--collector.systemd --collector.processes"
配置启动脚本
$ sudo -u ${NODE_EXPORTER_USER} vim ${NODE_EXPORTER_HOME}/start.sh
#!/bin/bash
set -eu
# 加载环境变量
# 也可以在 systemd 的 service 中引入
# source /etc/node_exporter/env.conf
exec /opt/node_exporter/bin/node_exporter \
$EXTRA_COLLECTORS \
--web.listen-address="$LISTEN_ADDRESS" \
--path.procfs="$PROCFS" \
--path.sysfs="$SYSFS" \
--collector.filesystem.mount-points-exclude="$MOUNT_POINTS_EXCLUDE"
授权
sudo -u ${NODE_EXPORTER_USER} chmod 700 ${NODE_EXPORTER_HOME}/start.sh
配置 systemd 管理
创建服务文件
cat > /usr/lib/systemd/system/node_exporter.service << EOF
[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target
[Service]
User=${NODE_EXPORTER_USER}
Group=${NODE_EXPORTER_USER_GROUP}
Type=simple
EnvironmentFile=${NODE_EXPORTER_CONF}/env.conf
ExecStart=${NODE_EXPORTER_HOME}/start.sh
# CPU 和内存限制(以 systemd 单位)
# CPU 利用率限制为 10%(1 核为 100%)
CPUAccounting=yes
CPUQuota=10%
# 内存限制 50MB
MemoryMax=50M
Restart=on-failure
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
启动
# 重新加载 systemd
systemctl daemon-reload
# 启动并设置开机自启
systemctl enable --now node_exporter
验证
curl localhost:9100/metrics
防火墙配置
firewall-cmd --permanent --new-service=node-exporter
firewall-cmd --permanent --service=node-exporter --add-port=9100/tcp
firewall-cmd --permanent --zone=public --add-service=node-exporter
firewall-cmd --reload
方式二:Docker
Node Exporter 旨在监控主机系统,在容器中部署时需要格外小心,以避免监控容器本身而非宿主机
dockerhub 地址:prom/node-exporter - Docker Image | Docker Hub
基础变量设置
NODE_EXPORTER_VERSION=1.9.1
NODE_EXPORTER_USER=node-exporter
NODE_EXPORTER_USER_GROUP=node-exporter
# 创建用户和组
groupadd --system ${NODE_EXPORTER_USER}
useradd -s /sbin/nologin --system -g ${NODE_EXPORTER_USER_GROUP} ${NODE_EXPORTER_USER}
配置环境变量
cat > /etc/profile.d/node_exporter.sh << EOF
export NODE_EXPORTER_VERSION=${NODE_EXPORTER_VERSION}
export NODE_EXPORTER_USER=${NODE_EXPORTER_USER}
export NODE_EXPORTER_USER_GROUP=${NODE_EXPORTER_USER_GROUP}
EOF
source /etc/profile
基本命令
docker run -d --name node-exporter --restart=always \
--net="host" \
--pid="host" \
-v "/:/host:ro,rslave" \
--cpus 0.1 \
--memory 50M \
prom/node-exporter:v${NODE_EXPORTER_VERSION} \
--path.rootfs=/host \
--path.procfs=/host/proc \
--path.sysfs=/host/sys \
--collector.filesystem.mount-points-exclude='^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+|var/lib/containers/storage/.+)($|/)'
使用 Docker Compose
基础变量设置
NODE_EXPORTER_HOME=/opt/node_exporter
mkdir -p ${NODE_EXPORTER_HOME}
编写 compose.yaml
cat > ${NODE_EXPORTER_HOME}/compose.yaml << EOF
---
services:
node_exporter:
image: prom/node-exporter:v${NODE_EXPORTER_VERSION}
container_name: node_exporter
restart: unless-stopped
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+|var/lib/containers/storage/.+)(\$|/)'
ports:
- 9100:9100
network_mode: host
EOF
docker compose
运行
cd ${NODE_EXPORTER_HOME} && docker compose up -d
验证
curl localhost:9100/metrics
重要参数说明
--net="host"
:使用主机网络模式--pid="host"
:使用主机 PID 命名空间--path.rootfs=/host
:指定主机根文件系统挂载路径--path.procfs=/host/proc
:指定 proc 文件系统路径--path.sysfs=/host/sys
:指定 sys 文件系统路径
方式三:Kubernetes 中部署(尚未测试)
DaemonSet 部署
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
hostNetwork: true
hostPID: true
containers:
- name: node-exporter
image: prom/node-exporter:latest
args:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'
ports:
- containerPort: 9100
name: metrics
volumeMounts:
- name: proc
mountPath: /host/proc
readOnly: true
- name: sys
mountPath: /host/sys
readOnly: true
- name: rootfs
mountPath: /rootfs
readOnly: true
volumes:
- name: proc
hostPath:
path: /proc
- name: sys
hostPath:
path: /sys
- name: rootfs
hostPath:
path: /
tolerations:
- effect: NoSchedule
operator: Exists
- effect: NoExecute
operator: Exists
常用指标
CPU 相关
node_cpu_seconds_total
:CPU 时间统计(按模式分类:user, system, idle, iowait 等)node_load1
、node_load5
、node_load15
:系统负载(1分钟、5分钟、15分钟平均)
内存相关
node_memory_MemTotal_bytes
:总内存大小node_memory_MemFree_bytes
:空闲内存node_memory_MemAvailable_bytes
:可用内存node_memory_Buffers_bytes
:缓冲区内存node_memory_Cached_bytes
:缓存内存node_memory_SwapTotal_bytes
、node_memory_SwapFree_bytes
:交换分区信息
磁盘相关
node_filesystem_size_bytes
:文件系统总大小node_filesystem_free_bytes
:文件系统剩余空间node_filesystem_avail_bytes
:文件系统可用空间node_disk_io_time_seconds_total
:磁盘 I/O 时间node_disk_read_bytes_total
、node_disk_written_bytes_total
:磁盘读写字节数
网络相关
node_network_receive_bytes_total
:网络接收字节数node_network_transmit_bytes_total
:网络发送字节数node_network_receive_packets_total
:网络接收包数node_network_transmit_packets_total
:网络发送包数
系统相关
node_boot_time_seconds
:系统启动时间戳node_time_seconds
:当前系统时间戳node_procs_running
:正在运行的进程数node_procs_blocked
:被阻塞的进程数
Prometheus 配置
通用配置
在 Prometheus 配置文件 prometheus.yml
中添加 Node Exporter 的抓取配置:
$ vim ${PROMETHEUS_CONF}/prometheus.yml
scrape_configs:
......
# 增加以下信息
- job_name: 'demo_node_exporter'
static_configs:
- targets:
- '192.168.111.199:9100'
labels:
level: "system"
scrape_interval: 15s
metrics_path: /metrics
scrape_timeout: 10s
刷新配置
curl -X POST http://localhost:9090/-/reload
服务发现(尚未测试)
使用 Kubernetes 服务发现:
scrape_configs:
- job_name: 'kubernetes-node-exporter'
kubernetes_sd_configs:
- role: endpoints
namespaces:
names:
- monitoring
relabel_configs:
- source_labels: [__meta_kubernetes_endpoints_name]
action: keep
regex: node-exporter
- source_labels: [__meta_kubernetes_endpoint_address_target_name]
target_label: node
收集器管理
Node Exporter 使用收集器(collector)来收集不同类型的指标。可以通过命令行参数控制启用或禁用特定的收集器。
查看所有可用收集器
node_exporter --help | grep collector
常用收集器控制参数
# 禁用特定收集器
--no-collector.wifi
--no-collector.hwmon
# 启用默认未启用的收集器
--collector.systemd
--collector.processes
启动命令示例
node_exporter \
--web.listen-address=:9100 \
--path.procfs=/proc \
--path.sysfs=/sys \
--collector.filesystem.mount-points-exclude='^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)' \
--collector.systemd \
--collector.processes \
--no-collector.wifi \
--no-collector.hwmon
监控验证
检查指标端点
curl http://localhost:9100/metrics
检查特定指标
# 查看 CPU 使用率
curl -s http://localhost:9100/metrics | grep node_cpu_seconds_total
# 查看内存使用情况
curl -s http://localhost:9100/metrics | grep node_memory
在 Prometheus Web UI 中验证
访问 Prometheus Web UI:
- 在 Status -> Targets 页面检查 node_exporter 目标状态
- 在 Graph 页面查询指标,例如:
# CPU 使用率
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 内存使用率
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100
# 磁盘使用率
(1 - (node_filesystem_avail_bytes{fstype!="tmpfs"} / node_filesystem_size_bytes{fstype!="tmpfs"})) * 100
注意事项
Docker 部署
网络模式选择
必须使用 host 网络模式:
# 正确 - 使用 host 网络
docker run --net="host" prom/node-exporter
# 错误 - 使用桥接网络会导致网络指标不准确
docker run -p 9100:9100 prom/node-exporter
使用桥接网络会导致:
- 网络接口指标显示容器网络而非主机网络
- 无法正确监控主机网络流量
- 网络连接统计不准确
文件系统挂载
正确的挂载方式:
# 完整挂载方式
docker run -d \
-v "/proc:/host/proc:ro" \
-v "/sys:/host/sys:ro" \
-v "/:/rootfs:ro" \
--path.procfs=/host/proc \
--path.rootfs=/rootfs \
--path.sysfs=/host/sys \
prom/node-exporter
常见错误:
- 不挂载
/proc
和/sys
导致系统指标缺失 - 挂载路径不一致导致指标错误
- 缺少
ro
(只读)权限可能导致安全风险
PID 命名空间
必须使用主机 PID 命名空间:
# 正确
docker run --pid="host" prom/node-exporter
# 错误 - 会导致进程统计不准确
docker run prom/node-exporter
不使用主机 PID 命名空间会导致:
- 进程数量统计错误
- 无法监控主机进程状态
- 负载统计可能不准确
容器权限
避免使用特权模式:
# 尽量避免 - 除非必要
docker run --privileged prom/node-exporter
# 推荐 - 使用最小权限
docker run --cap-add=SYS_TIME prom/node-exporter
文件系统过滤
正确配置文件系统过滤:
# 正确配置 - 排除容器相关文件系统
--collector.filesystem.mount-points-exclude='^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'
不正确的过滤会导致:
- 监控到大量无用的容器文件系统
- 指标数据冗余
- 性能影响
一般部署
端口冲突
- 默认端口 9100:确保端口未被占用
- 防火墙配置:确保 Prometheus 服务器能访问该端口
- 多实例部署:使用不同端口避免冲突
# 检查端口占用
netstat -tlnp | grep 9100
# 或者
ss -tlnp | grep 9100
用户权限
创建专用用户:
# 避免使用 root 用户运行
sudo useradd --no-create-home --shell /bin/false node_exporter
文件权限:
# 确保二进制文件权限正确
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
sudo chmod +x /usr/local/bin/node_exporter
系统兼容性
检查系统支持:
- 确认操作系统支持所需的收集器
- 验证
/proc
和/sys
文件系统可用 - 检查内核版本兼容性
收集器兼容性:
# 检查可用收集器
node_exporter --help | grep collector
# 测试特定收集器
node_exporter --collector.systemd --dry-run
资源消耗
监控资源使用:
- Node Exporter 本身也会消耗 CPU 和内存
- 定期检查其资源使用情况
- 根据需要调整收集器配置
资源限制:
# Docker 中限制资源
docker run --memory=100m --cpus="0.5" prom/node-exporter
# systemd 中限制资源
[Service]
MemoryMax=100M
CPUQuota=50%
日志管理
配置适当的日志级别:
# 生产环境建议使用 info 级别
node_exporter --log.level=info
# 调试时使用 debug 级别
node_exporter --log.level=debug
日志轮转:
# systemd 自动处理日志轮转
journalctl -u node_exporter --since "1 day ago"
# Docker 容器日志大小限制
docker run --log-opt max-size=10m --log-opt max-file=3 prom/node-exporter
Kubernetes 部署
节点选择器
# 确保在所有节点上运行
nodeSelector:
kubernetes.io/os: linux
# 或者使用节点亲和性
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
容忍度配置
# 确保能在所有节点上运行,包括 master 节点
tolerations:
- effect: NoSchedule
operator: Exists
- effect: NoExecute
operator: Exists
- key: node-role.kubernetes.io/master
effect: NoSchedule
安全上下文
# 使用适当的安全上下文
securityContext:
runAsNonRoot: true
runAsUser: 65534
readOnlyRootFilesystem: true
资源请求和限制
# 设置合理的资源请求和限制
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "200m"
监控数据质量
1时间同步
确保时间同步:
- Node Exporter 和 Prometheus 服务器时间必须同步
- 使用 NTP 服务保持时间准确性
- 监控时间偏差指标
指标一致性
标签一致性:
- 确保所有节点使用相同的标签
- 避免标签值中包含特殊字符
- 使用有意义的实例标识
数据完整性
定期检查:
# 检查指标输出
curl -s http://localhost:9100/metrics | wc -l
# 验证关键指标存在
curl -s http://localhost:9100/metrics | grep -c "node_cpu_seconds_total"
故障排查
常见问题
指标不完整或错误
- 检查挂载点配置,确保正确映射主机文件系统
- 验证容器权限,确保有读取
/proc
、/sys
的权限
容器化部署中指标异常
- 使用
--path.rootfs=/host
参数 - 确保使用
--net=host
和--pid=host
某些收集器不工作
- 检查系统是否支持特定的功能(如 systemd、hwmon)
- 查看日志确认是否有权限问题
调试命令
# 查看 Node Exporter 日志
journalctl -u node_exporter -f
# 检查端口监听
netstat -tlnp | grep 9100
# 测试指标输出
curl -s http://localhost:9100/metrics | head -20
性能优化
收集器优化
# 禁用不需要的收集器以减少资源消耗
--no-collector.wifi
--no-collector.hwmon
--no-collector.nfs
--no-collector.nfsd
文件系统过滤
# 排除不需要监控的文件系统挂载点
--collector.filesystem.mount-points-exclude='^/(sys|proc|dev|host|etc|rootfs/var/lib/docker/containers|rootfs/var/lib/docker/overlay2|rootfs/run/docker/netns|rootfs/var/lib/docker/aufs)($$|/)'
抓取频率调整
在 Prometheus 配置中根据需要调整抓取间隔:
scrape_configs:
- job_name: 'node_exporter'
scrape_interval: 30s # 适当增加间隔减少负载
安全考虑
网络安全
- 使用防火墙限制对 9100 端口的访问
- 在生产环境中避免将指标端点暴露到公网
认证和授权
Node Exporter 本身不提供认证功能,可以通过以下方式增强安全性:
- 使用反向代理(如 Nginx)添加基本认证
- 在 Kubernetes 中使用 Network Policy 限制访问
- 配置 TLS 加密(通过反向代理)
最小权限原则
# 创建专用用户运行 Node Exporter
sudo useradd --no-create-home --shell /bin/false node_exporter
总结
Node Exporter 是 Prometheus 监控体系中不可或缺的组件,为系统级监控提供了全面、可靠的指标收集能力。通过合理的部署和配置,可以实现对主机系统的全方位监控,为运维管理提供重要的数据支撑。
在实际使用中,建议:
- 根据实际需求选择合适的收集器
- 合理配置抓取频率和数据保留策略
- 定期更新 Node Exporter 版本以获得最新功能和安全修复
- 结合 Grafana 等可视化工具构建完整的监控仪表板