Node Exporter 中文教程

1. 项目概述

Node Exporter 是 Prometheus 生态系统中的一个重要组件,专门用于收集 Unix/Linux 系统的硬件和操作系统指标。它以守护进程的形式运行在目标主机上,通过 HTTP 端点暴露各种系统指标,供 Prometheus 服务器抓取。

主要功能

  • 收集系统 CPU 使用率、负载、内存使用情况
  • 收集磁盘空间和 I/O 统计信息
  • 收集网络接口流量和错误统计
  • 收集文件系统统计信息
  • 收集内核统计信息
  • 收集硬件信息
  • 支持多种操作系统:Linux、FreeBSD、OpenBSD、Darwin、Windows
  • 可扩展:支持通过文本文件和 collector 插件添加自定义指标

技术栈特点

  • 用 Go 语言编写,性能优异
  • 低资源消耗:占用内存和 CPU 资源少
  • 无需依赖:静态编译,无需外部依赖
  • 模块化设计:核心功能和插件分离
  • 可配置性强:支持多种配置选项

适用环境

  • 物理服务器监控
  • 虚拟机监控
  • 容器主机监控
  • 云实例监控
  • 任何需要系统级指标监控的环境

2. 安装与配置

2.1 二进制安装

  1. Node Exporter 官网 下载对应平台的二进制文件
  2. 解压文件
  3. 运行 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_exporter

2.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.0

2.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_exporter

2.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.systemd

2.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-all

4.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_info

4.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 指标:

  1. 安装 Grafana
  2. 添加 Prometheus 数据源
  3. 导入 Node Exporter 仪表盘(推荐 ID: 1860)
  4. 查看系统指标仪表盘

5. 高级特性

5.1 自定义指标

Node Exporter 支持通过文本文件添加自定义指标:

  1. 创建文本文件,格式为 Prometheus 指标格式
  2. 通过 --collector.textfile.directory 参数指定目录
  3. 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:

  1. 创建符合 Node Exporter collector 接口的 Go 包
  2. 编译时包含该 collector
  3. 通过命令行参数启用

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 实例:

  1. 在每个主机上部署 Node Exporter
  2. 使用 Prometheus 服务发现自动发现目标
  3. 配置负载均衡和故障转移

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 服务器监控

场景:监控物理服务器和虚拟机的系统状态

实施步骤

  1. 在每个服务器上安装 Node Exporter
  2. 配置 Prometheus 抓取指标
  3. 使用 Grafana 创建服务器状态仪表盘
  4. 设置基于阈值的告警

监控指标

  • CPU 使用率和负载
  • 内存使用情况
  • 磁盘空间和 I/O
  • 网络流量和错误
  • 系统启动时间

7.2 容器主机监控

场景:监控容器运行的主机系统

实施步骤

  1. 在每个容器主机上安装 Node Exporter
  2. 配置 Prometheus 抓取指标
  3. 创建容器主机专用仪表盘
  4. 设置与容器相关的告警

监控指标

  • 主机 CPU 和内存使用
  • 容器运行时指标
  • 磁盘 I/O 和空间
  • 网络流量
  • 文件系统使用率

7.3 云实例监控

场景:监控云服务提供商的实例

实施步骤

  1. 在每个云实例上安装 Node Exporter
  2. 使用云提供商的服务发现
  3. 创建云实例专用仪表盘
  4. 设置与云服务相关的告警

优势

  • 统一监控:与本地服务器使用相同的监控方案
  • 详细指标:比云提供商默认监控更详细
  • 自定义告警:根据业务需求设置告警
  • 历史数据:长期存储监控数据

7.4 多环境监控

场景:监控开发、测试和生产环境

实施步骤

  1. 在所有环境中部署 Node Exporter
  2. 使用标签区分环境
  3. 创建环境专用仪表盘
  4. 设置不同级别的告警

优势

  • 统一视图:所有环境使用相同的监控系统
  • 环境对比:比较不同环境的性能
  • 问题定位:快速定位环境特定问题
  • 趋势分析:分析环境性能趋势

8. 总结

Node Exporter 是 Prometheus 生态系统中不可或缺的组件,它为系统监控提供了丰富的指标数据。通过本文的介绍,您应该已经了解了 Node Exporter 的核心概念、安装配置、基本使用和高级特性。

关键优势

  • 简单易用:安装配置简单,无需复杂依赖
  • 功能丰富:提供全面的系统级指标
  • 性能优异:资源消耗低,适合各种环境
  • 可扩展:支持自定义指标和插件
  • 生态完整:与 Prometheus 和 Grafana 无缝集成

应用场景

  • 服务器监控:物理服务器和虚拟机
  • 容器主机监控:Docker、Kubernetes 等容器环境
  • 云实例监控:AWS、Azure、GCP 等云服务
  • 多环境监控:开发、测试、生产环境
  • 任何需要系统级监控的场景

Node Exporter 与 Prometheus 和 Grafana 一起,构成了完整的系统监控解决方案,帮助您更好地了解系统状态,及时发现和解决问题,提高系统的可靠性和可用性。

« 上一篇 OpenTelemetry 中文教程 下一篇 » Blackbox Exporter 教程