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