Node Exporter 中文教程
1. 项目概述
Node Exporter 是 Prometheus 生态系统中的一个重要组件,专门用于收集 Unix/Linux 系统的硬件和操作系统指标。它以守护进程的形式运行在目标主机上,通过 HTTP 端点暴露各种系统指标,供 Prometheus 服务器抓取。
主要功能
- 收集系统 CPU 使用率、负载、内存使用情况
- 收集磁盘空间和 I/O 统计信息
- 收集网络接口流量和错误统计
- 收集文件系统统计信息
- 收集内核统计信息
- 收集硬件信息
- 支持多种操作系统:Linux、FreeBSD、OpenBSD、Darwin、Windows
- 可扩展:支持通过文本文件和 collector 插件添加自定义指标
技术栈特点
- 用 Go 语言编写,性能优异
- 低资源消耗:占用内存和 CPU 资源少
- 无需依赖:静态编译,无需外部依赖
- 模块化设计:核心功能和插件分离
- 可配置性强:支持多种配置选项
适用环境
- 物理服务器监控
- 虚拟机监控
- 容器主机监控
- 云实例监控
- 任何需要系统级指标监控的环境
2. 安装与配置
2.1 二进制安装
- 从 Node Exporter 官网 下载对应平台的二进制文件
- 解压文件
- 运行 Node Exporter
# 下载最新版本
wget https://github.com/prometheus/node_exporter/releases/download/v1.5.0/node_exporter-1.5.0.linux-amd64.tar.gz
# 解压
tar xvfz node_exporter-*.tar.gz
cd node_exporter-*
# 运行 Node Exporter
./node_exporter2.2 Docker 安装
docker run -d \n --name node_exporter \n -p 9100:9100 \n -v "/proc:/host/proc:ro" \n -v "/sys:/host/sys:ro" \n -v "/:/rootfs:ro" \n --net="host" \n prom/node-exporter:v1.5.02.3 系统服务安装
2.3.1 Linux 系统服务
# 创建用户
sudo useradd --no-create-home --shell /bin/false node_exporter
# 复制二进制文件
sudo cp node_exporter /usr/local/bin/
sudo chown node_exporter:node_exporter /usr/local/bin/node_exporter
# 创建系统服务文件
sudo vi /etc/systemd/system/node_exporter.service# /etc/systemd/system/node_exporter.service
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=node_exporter
Group=node_exporter
Type=simple
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=multi-user.target# 启动服务
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter
# 检查服务状态
sudo systemctl status node_exporter2.4 基本配置
Node Exporter 支持多种命令行参数进行配置:
# 基本配置示例
./node_exporter \
--web.listen-address=":9100" \
--web.telemetry-path="/metrics" \
--collector.filesystem.mount-points-exclude="^/(sys|proc|dev|host|etc)($|/)" \
--collector.netclass.ignored-devices="^(lo|docker0|veth.*)$" \
--collector.disable-defaults \
--collector.cpu \
--collector.meminfo \
--collector.diskstats \
--collector.netdev \
--collector.systemd2.5 Prometheus 配置
在 Prometheus 配置文件中添加 Node Exporter 作为目标:
# prometheus.yml
scrape_configs:
- job_name: 'node'
static_configs:
- targets: ['localhost:9100']
relabel_configs:
- source_labels: [__address__]
regex: '(.*)'
target_label: instance
replacement: '$1'3. 核心指标
Node Exporter 暴露的主要指标包括:
3.1 CPU 指标
node_cpu_seconds_total:CPU 时间使用情况,按模式和核心分类node_load1:1分钟系统负载node_load5:5分钟系统负载node_load15:15分钟系统负载
3.2 内存指标
node_memory_MemTotal_bytes:总内存node_memory_MemFree_bytes:空闲内存node_memory_Buffers_bytes:缓冲区内存node_memory_Cached_bytes:缓存内存node_memory_SwapTotal_bytes:总交换空间node_memory_SwapFree_bytes:空闲交换空间
3.3 磁盘指标
node_filesystem_size_bytes:文件系统总大小node_filesystem_avail_bytes:文件系统可用空间node_filesystem_files:文件系统总文件数node_filesystem_files_free:文件系统可用文件数node_disk_io_time_seconds_total:磁盘 I/O 时间node_disk_reads_completed_total:完成的磁盘读取次数node_disk_writes_completed_total:完成的磁盘写入次数node_disk_read_bytes_total:磁盘读取字节数node_disk_written_bytes_total:磁盘写入字节数
3.4 网络指标
node_network_transmit_bytes_total:网络发送字节数node_network_receive_bytes_total:网络接收字节数node_network_transmit_packets_total:网络发送数据包数node_network_receive_packets_total:网络接收数据包数node_network_transmit_errs_total:网络发送错误数node_network_receive_errs_total:网络接收错误数
3.5 系统指标
node_boot_time_seconds:系统启动时间node_time_seconds:当前系统时间node_processes_total:进程总数node_procs_running:运行中的进程数node_procs_blocked:阻塞的进程数
3.6 文件系统指标
node_filesystem_readonly:文件系统是否只读node_filesystem_device_error:文件系统设备错误
4. 基本使用
4.1 启动 Node Exporter
# 基本启动
./node_exporter
# 指定端口启动
./node_exporter --web.listen-address=":9100"
# 启用所有 collector
./node_exporter --collector.disable-defaults --collector.enable-all4.2 访问指标
Node Exporter 启动后,可以通过 http://localhost:9100/metrics 访问暴露的指标。
4.3 验证 Node Exporter
# 检查 Node Exporter 是否运行
curl http://localhost:9100/metrics | head -20
# 检查特定指标
curl http://localhost:9100/metrics | grep node_cpu_seconds_total
# 检查服务状态
curl http://localhost:9100/metrics | grep node_exporter_build_info4.4 基本查询
在 Prometheus 中查询 Node Exporter 指标:
# 查询 CPU 使用率
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# 查询内存使用率
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
# 查询磁盘使用率
(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) / node_filesystem_size_bytes * 100
# 查询网络流量
rate(node_network_transmit_bytes_total[5m])
rate(node_network_receive_bytes_total[5m])
# 查询系统负载
node_load1 / count(node_cpu_seconds_total{mode="idle"}) by (instance)4.5 Grafana 仪表盘
使用 Grafana 可视化 Node Exporter 指标:
- 安装 Grafana
- 添加 Prometheus 数据源
- 导入 Node Exporter 仪表盘(推荐 ID: 1860)
- 查看系统指标仪表盘
5. 高级特性
5.1 自定义指标
Node Exporter 支持通过文本文件添加自定义指标:
- 创建文本文件,格式为 Prometheus 指标格式
- 通过
--collector.textfile.directory参数指定目录 - Node Exporter 会自动读取该目录下的所有
.prom文件
示例文本文件:
# /var/lib/node_exporter/textfile_collector/custom_metrics.prom
# 自定义应用指标
app_custom_metric_total 42
app_custom_metric_seconds 123.45
# 带标签的指标
app_user_count{app="myapp", environment="production"} 100
app_request_count{app="myapp", endpoint="/api/users"} 500启动 Node Exporter:
./node_exporter --collector.textfile.directory="/var/lib/node_exporter/textfile_collector"5.2 自定义 collector
Node Exporter 支持通过插件机制添加自定义 collector:
- 创建符合 Node Exporter collector 接口的 Go 包
- 编译时包含该 collector
- 通过命令行参数启用
5.3 安全配置
5.3.1 基本认证
使用反向代理为 Node Exporter 添加基本认证:
Nginx 配置示例:
server {
listen 9100;
server_name node-exporter;
location / {
auth_basic "Node Exporter";
auth_basic_user_file /etc/nginx/.htpasswd;
proxy_pass http://localhost:9101;
}
}5.3.2 TLS 配置
使用反向代理为 Node Exporter 添加 TLS 支持:
server {
listen 9100 ssl;
server_name node-exporter;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass http://localhost:9101;
}
}5.4 高可用配置
在大型环境中,可以部署多个 Node Exporter 实例:
- 在每个主机上部署 Node Exporter
- 使用 Prometheus 服务发现自动发现目标
- 配置负载均衡和故障转移
Kubernetes 部署示例:
# node-exporter-daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: node-exporter
namespace: monitoring
labels:
app: node-exporter
spec:
selector:
matchLabels:
app: node-exporter
template:
metadata:
labels:
app: node-exporter
spec:
containers:
- name: node-exporter
image: prom/node-exporter:v1.5.0
ports:
- containerPort: 9100
hostPort: 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: /6. 最佳实践
6.1 部署策略
- 每个主机部署一个实例:确保所有主机都有 Node Exporter
- 使用系统服务:通过 systemd 或其他初始化系统管理
- 监控 Node Exporter 本身:确保 Node Exporter 服务正常运行
- 版本管理:定期更新到最新版本
6.2 配置优化
- 只启用必要的 collector:避免收集不需要的指标
- 排除不需要的设备和挂载点:减少指标数量
- 设置合理的抓取间隔:根据监控需求设置
- 使用标签:通过 relabeling 添加有意义的标签
6.3 性能优化
- 限制 collector:只启用必要的 collector
- 优化 Prometheus 抓取:合理设置抓取间隔和超时
- 使用缓存:对于计算密集型指标使用缓存
- 监控 Node Exporter 资源使用:确保其本身资源消耗合理
6.4 告警配置
设置基于 Node Exporter 指标的告警:
# prometheus-rules.yml
groups:
- name: node-alerts
rules:
- alert: HighCpuUsage
expr: 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage detected"
description: "Instance {{ $labels.instance }} has CPU usage above 80% for 5 minutes"
- alert: HighMemoryUsage
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage detected"
description: "Instance {{ $labels.instance }} has memory usage above 85% for 5 minutes"
- alert: LowDiskSpace
expr: (node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_avail_bytes{mountpoint="/"}) / node_filesystem_size_bytes * 100 > 90
for: 10m
labels:
severity: critical
annotations:
summary: "Low disk space detected"
description: "Instance {{ $labels.instance }} has disk usage above 90% for 10 minutes"
- alert: NodeExporterDown
expr: up{job="node"} == 0
for: 2m
labels:
severity: critical
annotations:
summary: "Node Exporter down"
description: "Node Exporter on {{ $labels.instance }} has been down for 2 minutes"6.5 集成最佳实践
- 与 Grafana 集成:使用预构建的仪表盘
- 与 Alertmanager 集成:设置合理的告警
- 与 Prometheus 服务发现集成:自动发现目标
- 与容器编排系统集成:如 Kubernetes DaemonSet
7. 实际应用场景
7.1 服务器监控
场景:监控物理服务器和虚拟机的系统状态
实施步骤:
- 在每个服务器上安装 Node Exporter
- 配置 Prometheus 抓取指标
- 使用 Grafana 创建服务器状态仪表盘
- 设置基于阈值的告警
监控指标:
- CPU 使用率和负载
- 内存使用情况
- 磁盘空间和 I/O
- 网络流量和错误
- 系统启动时间
7.2 容器主机监控
场景:监控容器运行的主机系统
实施步骤:
- 在每个容器主机上安装 Node Exporter
- 配置 Prometheus 抓取指标
- 创建容器主机专用仪表盘
- 设置与容器相关的告警
监控指标:
- 主机 CPU 和内存使用
- 容器运行时指标
- 磁盘 I/O 和空间
- 网络流量
- 文件系统使用率
7.3 云实例监控
场景:监控云服务提供商的实例
实施步骤:
- 在每个云实例上安装 Node Exporter
- 使用云提供商的服务发现
- 创建云实例专用仪表盘
- 设置与云服务相关的告警
优势:
- 统一监控:与本地服务器使用相同的监控方案
- 详细指标:比云提供商默认监控更详细
- 自定义告警:根据业务需求设置告警
- 历史数据:长期存储监控数据
7.4 多环境监控
场景:监控开发、测试和生产环境
实施步骤:
- 在所有环境中部署 Node Exporter
- 使用标签区分环境
- 创建环境专用仪表盘
- 设置不同级别的告警
优势:
- 统一视图:所有环境使用相同的监控系统
- 环境对比:比较不同环境的性能
- 问题定位:快速定位环境特定问题
- 趋势分析:分析环境性能趋势
8. 总结
Node Exporter 是 Prometheus 生态系统中不可或缺的组件,它为系统监控提供了丰富的指标数据。通过本文的介绍,您应该已经了解了 Node Exporter 的核心概念、安装配置、基本使用和高级特性。
关键优势
- 简单易用:安装配置简单,无需复杂依赖
- 功能丰富:提供全面的系统级指标
- 性能优异:资源消耗低,适合各种环境
- 可扩展:支持自定义指标和插件
- 生态完整:与 Prometheus 和 Grafana 无缝集成
应用场景
- 服务器监控:物理服务器和虚拟机
- 容器主机监控:Docker、Kubernetes 等容器环境
- 云实例监控:AWS、Azure、GCP 等云服务
- 多环境监控:开发、测试、生产环境
- 任何需要系统级监控的场景
Node Exporter 与 Prometheus 和 Grafana 一起,构成了完整的系统监控解决方案,帮助您更好地了解系统状态,及时发现和解决问题,提高系统的可靠性和可用性。