Node Exporter #

一、Node Exporter概述 #

1.1 什么是Node Exporter #

text
Node Exporter定义:

┌─────────────────────────────────────────────┐
│ Node Exporter                               │
├─────────────────────────────────────────────┤
│ • Prometheus官方主机监控导出器              │
│ • 暴露Linux/Unix系统指标                    │
│ • 默认端口:9100                            │
│ • 指标路径:/metrics                        │
└─────────────────────────────────────────────┘

监控范围:

┌─────────────────────────────────────────────┐
│ CPU                                         │
├─────────────────────────────────────────────┤
│ • CPU使用时间                               │
│ • CPU频率                                   │
│ • CPU负载                                   │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ 内存                                        │
├─────────────────────────────────────────────┤
│ • 内存总量                                   │
│ • 可用内存                                   │
│ • 缓存/缓冲区                               │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ 磁盘                                        │
├─────────────────────────────────────────────┤
│ • 磁盘空间                                   │
│ • 磁盘IO                                    │
│ • 文件系统                                   │
└─────────────────────────────────────────────┘

┌─────────────────────────────────────────────┐
│ 网络                                        │
├─────────────────────────────────────────────┤
│ • 网络流量                                   │
│ • 网络错误                                   │
│ • 网络连接                                   │
└─────────────────────────────────────────────┘

二、安装部署 #

2.1 二进制安装 #

bash
# 下载
cd /tmp
wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz

# 解压
tar xvfz node_exporter-1.7.0.linux-amd64.tar.gz

# 移动
sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/

# 创建用户
sudo useradd -rs /bin/false node_exporter

# 创建服务
sudo tee /etc/systemd/system/node_exporter.service <<EOF
[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
EOF

# 启动服务
sudo systemctl daemon-reload
sudo systemctl start node_exporter
sudo systemctl enable node_exporter

# 验证
curl http://localhost:9100/metrics

2.2 Docker安装 #

bash
# 基本运行
docker run -d \
    --name node-exporter \
    -p 9100:9100 \
    -v /proc:/host/proc:ro \
    -v /sys:/host/sys:ro \
    -v /:/rootfs:ro \
    prom/node-exporter \
    --path.procfs=/host/proc \
    --path.sysfs=/host/sys \
    --path.rootfs=/rootfs

# 验证
curl http://localhost:9100/metrics

2.3 Kubernetes部署 #

yaml
# 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:
      hostNetwork: true
      hostPID: true
      containers:
        - name: node-exporter
          image: prom/node-exporter:v1.7.0
          args:
            - '--path.procfs=/host/proc'
            - '--path.sysfs=/host/sys'
            - '--path.rootfs=/host/root'
            - '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
          ports:
            - containerPort: 9100
              hostPort: 9100
          volumeMounts:
            - name: proc
              mountPath: /host/proc
              readOnly: true
            - name: sys
              mountPath: /host/sys
              readOnly: true
            - name: root
              mountPath: /host/root
              readOnly: true
      volumes:
        - name: proc
          hostPath:
            path: /proc
        - name: sys
          hostPath:
            path: /sys
        - name: root
          hostPath:
            path: /

三、常用指标 #

3.1 CPU指标 #

promql
# CPU使用时间
node_cpu_seconds_total

# 按模式分组
node_cpu_seconds_total{mode="idle"}
node_cpu_seconds_total{mode="user"}
node_cpu_seconds_total{mode="system"}
node_cpu_seconds_total{mode="iowait"}

# CPU使用率
100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 用户态CPU使用率
avg by(instance) (irate(node_cpu_seconds_total{mode="user"}[5m])) * 100

# 系统态CPU使用率
avg by(instance) (irate(node_cpu_seconds_total{mode="system"}[5m])) * 100

# IO等待CPU使用率
avg by(instance) (irate(node_cpu_seconds_total{mode="iowait"}[5m])) * 100

# CPU负载
node_load1    # 1分钟负载
node_load5    # 5分钟负载
node_load15   # 15分钟负载

# CPU核心数
count(node_cpu_seconds_total{mode="idle"}) by (instance)

3.2 内存指标 #

promql
# 内存总量
node_memory_MemTotal_bytes

# 可用内存
node_memory_MemAvailable_bytes

# 空闲内存
node_memory_MemFree_bytes

# 缓存
node_memory_Cached_bytes

# 缓冲区
node_memory_Buffers_bytes

# 内存使用率
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

# 已使用内存
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes

# 缓存使用
node_memory_Cached_bytes + node_memory_Buffers_bytes

# Swap总量
node_memory_SwapTotal_bytes

# Swap空闲
node_memory_SwapFree_bytes

# Swap使用率
(1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100

3.3 磁盘指标 #

promql
# 磁盘大小
node_filesystem_size_bytes

# 磁盘可用空间
node_filesystem_avail_bytes

# 磁盘使用率
(1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100

# 按挂载点过滤
node_filesystem_size_bytes{mountpoint="/"}
node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}

# 磁盘IO时间
node_disk_io_time_seconds_total

# 磁盘读取字节数
node_disk_read_bytes_total

# 磁盘写入字节数
node_disk_written_bytes_total

# 磁盘读取速率
rate(node_disk_read_bytes_total[5m])

# 磁盘写入速率
rate(node_disk_written_bytes_total[5m])

# 磁盘IO使用率
rate(node_disk_io_time_seconds_total[5m]) * 100

# 文件描述符
node_filefd_allocated
node_filefd_maximum

3.4 网络指标 #

promql
# 网络接收字节数
node_network_receive_bytes_total

# 网络发送字节数
node_network_transmit_bytes_total

# 网络接收速率
rate(node_network_receive_bytes_total{device!~"lo|veth.*"}[5m])

# 网络发送速率
rate(node_network_transmit_bytes_total{device!~"lo|veth.*"}[5m])

# 网络错误
node_network_receive_errs_total
node_network_transmit_errs_total

# 网络丢包
node_network_receive_drop_total
node_network_transmit_drop_total

# TCP连接数
node_netstat_Tcp_CurrEstab

# TCP状态
node_sockstat_TCP_tw
node_sockstat_sockets_used

四、配置选项 #

4.1 启用/禁用收集器 #

bash
# 启用特定收集器
node_exporter --collector.cpu \
              --collector.meminfo \
              --collector.filesystem

# 禁用特定收集器
node_exporter --no-collector.hwmon \
              --no-collector.infiniband

# 列出所有收集器
node_exporter --help | grep collector

4.2 文件系统过滤 #

bash
# 排除特定挂载点
node_exporter --collector.filesystem.mount-points-exclude=^/(sys|proc|dev|run)($|/)

# 排除特定文件系统类型
node_exporter --collector.filesystem.fs-types-exclude=^(tmpfs|autofs|binfmt_misc|cgroup|configfs|debugfs|devpts|devtmpfs|fusectl|hugetlbfs|mqueue|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|sysfs|tracefs)$

4.3 监听配置 #

bash
# 监听地址和端口
node_exporter --web.listen-address=0.0.0.0:9100

# 监听地址(Unix Socket)
node_exporter --web.listen-address=unix:/var/run/node_exporter.sock

# 访问路径
node_exporter --web.telemetry-path=/metrics

# 最大请求数
node_exporter --web.max-requests=40

五、常用查询模板 #

5.1 系统概览 #

promql
# 在线主机数
count(up{job="node-exporter"})

# 离线主机数
count(up{job="node-exporter"} == 0)

# CPU使用率最高的5台主机
topk(5, 100 - (avg by(instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100))

# 内存使用率最高的5台主机
topk(5, (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100)

# 磁盘使用率最高的5台主机
topk(5, (1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100)

5.2 告警规则 #

yaml
groups:
  - name: node_alerts
    rules:
      - alert: NodeDown
        expr: up{job="node-exporter"} == 0
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Node {{ $labels.instance }} is down"

      - 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 on {{ $labels.instance }}"

      - alert: HighMemoryUsage
        expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High memory usage on {{ $labels.instance }}"

      - alert: DiskSpaceLow
        expr: (node_filesystem_avail_bytes{fstype!~"tmpfs|overlay"} / node_filesystem_size_bytes{fstype!~"tmpfs|overlay"}) * 100 < 20
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Low disk space on {{ $labels.instance }}"

六、总结 #

Node Exporter要点:

功能 说明
CPU监控 使用时间、负载
内存监控 总量、可用、缓存
磁盘监控 空间、IO
网络监控 流量、错误

常用查询:

指标 PromQL
CPU使用率 100 - avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
内存使用率 (1 - node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100
磁盘使用率 (1 - node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100

下一步,让我们学习应用导出器!

最后更新:2026-03-27