1. 为什么选择node_exporter+Prometheus监控Linux系统
在运维领域,系统监控就像给服务器装上"健康监测仪"。传统的监控方案如Zabbix虽然功能全面,但配置复杂、资源消耗大。而Prometheus+node_exporter的组合,则像一把精准的手术刀——轻量、专注、响应迅速。
node_exporter是Prometheus生态中专用于*nix系统监控的采集器,它能暴露800+系统指标,包括:
- CPU使用率(user/system/iowait等状态占比)
- 内存消耗(已用/缓存/交换分区情况)
- 磁盘I/O吞吐量和延迟
- 网络带宽和错误包统计
- 系统负载和进程状态
这些指标通过/metrics接口以文本形式暴露,Prometheus定时抓取后存入时间序列数据库。相比传统方案,这套组合有三大优势:
- 多维数据模型:每个指标可带多标签(如
node_cpu_seconds_total{cpu="0",mode="user"}),便于细粒度分析 - 强大的PromQL:支持瞬时向量、区间向量查询,能直接计算CPU使用率等衍生指标
- 低侵入性:node_exporter仅需5MB内存,对生产环境影响极小
提示:虽然Windows系统可使用windows_exporter,但node_exporter在Linux下的指标覆盖更全面,特别是对/proc和/sys文件系统的深度采集。
2. 从零部署node_exporter实战指南
2.1 二进制包安装(推荐生产环境)
最新版node_exporter可从 GitHub Releases 获取。以1.6.1版本为例:
# 下载适用于Linux AMD64架构的版本 wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz # 解压并进入目录 tar xvfz node_exporter-*.tar.gz cd node_exporter-*/ # 直接运行(默认监听9100端口) ./node_exporter此时访问http://服务器IP:9100/metrics,将看到如下指标片段:
# HELP node_cpu_seconds_total Seconds the CPUs spent in each mode. # TYPE node_cpu_seconds_total counter node_cpu_seconds_total{cpu="0",mode="idle"} 38245.67 node_cpu_seconds_total{cpu="0",mode="system"} 1045.322.2 配置系统服务实现开机自启
生产环境建议通过systemd管理服务:
sudo cat <<EOF > /etc/systemd/system/node_exporter.service [Unit] Description=Node Exporter After=network.target [Service] User=node_exporter Group=node_exporter ExecStart=/usr/local/bin/node_exporter \ --collector.systemd \ --collector.tcpstat [Install] WantedBy=multi-user.target EOF # 创建专用用户 sudo useradd -rs /bin/false node_exporter # 复制二进制文件 sudo cp node_exporter /usr/local/bin/ # 启动服务 sudo systemctl daemon-reload sudo systemctl enable --now node_exporter常用启动参数说明:
--web.listen-address=:19100修改监听端口--collector.disable-defaults禁用默认采集器--collector.filesystem.ignored-mount-points忽略特定挂载点
2.3 安全加固措施
暴露9100端口存在风险,建议:
- 使用Nginx反向代理添加Basic Auth:
location /metrics { auth_basic "Node Exporter"; auth_basic_user_file /etc/nginx/.htpasswd; proxy_pass http://localhost:9100; }- 或通过iptules限制访问IP:
iptables -A INPUT -p tcp --dport 9100 -s 监控服务器IP -j ACCEPT iptables -A INPUT -p tcp --dport 9100 -j DROP3. Prometheus服务端配置详解
3.1 基础抓取配置
在prometheus.yml中添加job配置:
scrape_configs: - job_name: 'node' scrape_interval: 15s static_configs: - targets: ['192.168.1.10:9100', '192.168.1.11:9100'] relabel_configs: - source_labels: [__address__] target_label: instance regex: '(.*):.*' replacement: '$1'关键配置解析:
scrape_interval:抓取频率,生产环境建议15-30smetrics_path:默认为/metrics,如需修改需与node_exporter启动参数一致relabel_configs:重写标签规则,示例中将IP:PORT格式转为纯IP
3.2 使用服务发现动态管理目标
对于大规模集群,建议使用文件服务发现:
- 创建目标列表文件nodes.json:
[ { "targets": ["10.0.1.2:9100"], "labels": { "env": "prod", "role": "db" } } ]- 修改prometheus.yml:
scrape_configs: - job_name: 'node' file_sd_configs: - files: ['/etc/prometheus/nodes.json'] refresh_interval: 5m3.3 关键指标告警规则示例
在rules/node.yml中定义告警规则:
groups: - name: node_alerts rules: - alert: HighCPUUsage expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80 for: 10m labels: severity: warning annotations: summary: "High CPU usage on {{ $labels.instance }}" description: "CPU usage is {{ $value }}%" - alert: MemoryPressure expr: (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 20 for: 5m labels: severity: critical4. 高级监控场景实战
4.1 监控Docker容器
node_exporter默认只能监控主机,需配合cAdvisor:
docker run -d \ --name=cadvisor \ -v /:/rootfs:ro \ -v /var/run:/var/run:ro \ -v /sys:/sys:ro \ -v /var/lib/docker/:/var/lib/docker:ro \ -p 8080:8080 \ gcr.io/cadvisor/cadvisor:v0.47.0Prometheus配置示例:
- job_name: 'cadvisor' static_configs: - targets: ['docker-host:8080']4.2 自定义文本文件收集器
通过textfile收集器采集脚本输出:
- 创建采集目录:
mkdir -p /var/lib/node_exporter/textfile_collector- 添加启动参数:
--collector.textfile.directory=/var/lib/node_exporter/textfile_collector- 示例脚本/home/scripts/check_ssl.sh:
#!/bin/bash echo '# HELP ssl_expire_days SSL certificate expire days' > /var/lib/node_exporter/textfile_collector/ssl.prom echo '# TYPE ssl_expire_days gauge' >> /var/lib/node_exporter/textfile_collector/ssl.prom openssl x509 -enddate -noout -in /etc/nginx/ssl/cert.pem | awk -F= '/notAfter/{print "ssl_expire_days{domain=\"example.com\"} "(systime()-mktime(gensub(/ /," ","g",$2)))/86400}' >> /var/lib/node_exporter/textfile_collector/ssl.prom4.3 使用Grafana可视化监控数据
推荐仪表盘模板:
- Node Exporter Full:ID 1860
- Linux Hosts Metrics:ID 11074
配置步骤:
- 添加Prometheus数据源
- 导入仪表盘JSON
- 调整变量如
$interval和$datasource
关键面板建议:
- CPU使用率:
100 - (avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[$__rate_interval])) * 100) - 内存使用:
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 - 磁盘空间:
node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100
5. 性能调优与故障排查
5.1 资源占用优化
当监控数百节点时需注意:
- 禁用不必要采集器(如wifi、nfs):
--no-collector.wifi --no-collector.nfs- 调整Prometheus存储参数:
storage: tsdb: retention: 15d wal_compression: true- 使用Recording Rules预计算常用指标:
groups: - name: node_rules rules: - record: instance:node_cpu:avg_rate5m expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)5.2 常见问题处理
指标缺失排查流程:
- 检查node_exporter日志:
journalctl -u node_exporter -f- 手动访问metrics接口:
curl -s http://localhost:9100/metrics | grep node_memory- 验证Prometheus抓取状态:
- 访问
/targets查看job状态 - 检查
up{job="node"}指标是否为1
- 访问
典型错误处理:
- 出现"context deadline exceeded":增加scrape_timeout
- 指标值异常:检查是否启用对应采集器(如网络指标需netdev采集器)
- 时间戳不匹配:确保所有节点时间同步(chrony或ntpd)
我在实际运维中发现,当node_exporter版本低于1.3时,在多核CPU服务器上可能出现node_cpu指标不全的问题。解决方法很简单——升级到最新稳定版即可。另一个容易忽略的点是,如果使用非root用户运行,部分指标(如node_sockstat_*)会因权限不足无法采集,这时需要给该用户增加/proc和/sys的读取权限。