在企业级监控领域,Prometheus已经成为云原生时代的监控事实标准。这套开源的监控告警系统最初由SoundCloud开发,现在由CNCF基金会维护。与传统的监控方案相比,Prometheus采用拉取(pull)模式采集指标,通过多维数据模型和强大的PromQL查询语言,能够很好地适应动态的云环境。
Node-exporter作为Prometheus生态中的核心组件,专门用于采集主机层面的指标数据。它像是一个安装在每台服务器上的"数据采集器",将CPU、内存、磁盘、网络等基础资源的使用情况转换为Prometheus可以理解的metrics格式。这种设计使得监控系统与被监控对象解耦,即使在被监控主机网络不稳定的情况下,Prometheus也能通过重试机制保证数据的最终一致性。
对于Linux系统,推荐使用预编译的二进制包进行安装。以下是在Ubuntu 20.04 LTS上的标准安装流程:
bash复制# 创建专用用户和目录
sudo useradd --no-create-home --shell /bin/false prometheus
sudo mkdir /etc/prometheus /var/lib/prometheus
sudo chown prometheus:prometheus /var/lib/prometheus
# 下载最新稳定版(以2.30.3为例)
wget https://github.com/prometheus/prometheus/releases/download/v2.30.3/prometheus-2.30.3.linux-amd64.tar.gz
tar xvf prometheus-*.tar.gz
cd prometheus-*/
# 复制二进制文件
sudo cp prometheus promtool /usr/local/bin/
sudo chown prometheus:prometheus /usr/local/bin/prometheus
# 复制配置文件
sudo cp -r consoles console_libraries /etc/prometheus/
sudo cp prometheus.yml /etc/prometheus/
sudo chown -R prometheus:prometheus /etc/prometheus
Node-exporter的部署更加轻量,通常每个被监控主机都需要安装:
bash复制# 下载最新版(以1.2.2为例)
wget https://github.com/prometheus/node_exporter/releases/download/v1.2.2/node_exporter-1.2.2.linux-amd64.tar.gz
tar xvf node_exporter-*.tar.gz
cd node_exporter-*/
# 创建系统用户
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
典型的prometheus.yml配置文件包含以下几个关键部分:
yaml复制global:
scrape_interval: 15s # 默认抓取间隔
evaluation_interval: 15s # 规则评估间隔
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node'
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设置为30s-1min,过高的采集频率会导致存储压力剧增。
Node-exporter支持通过命令行参数启用/禁用特定采集器:
bash复制/usr/local/bin/node_exporter \
--collector.cpu \
--collector.diskstats \
--collector.filesystem \
--collector.loadavg \
--collector.meminfo \
--collector.netdev \
--collector.netstat \
--collector.stat \
--collector.time \
--web.listen-address=":9100"
对于Windows系统,可以使用wmi_exporter作为替代方案,它提供了类似的指标采集能力。
为Prometheus创建systemd服务文件/etc/systemd/system/prometheus.service:
ini复制[Unit]
Description=Prometheus
Wants=network-online.target
After=network-online.target
[Service]
User=prometheus
Group=prometheus
Type=simple
ExecStart=/usr/local/bin/prometheus \
--config.file /etc/prometheus/prometheus.yml \
--storage.tsdb.path /var/lib/prometheus/ \
--web.console.templates=/etc/prometheus/consoles \
--web.console.libraries=/etc/prometheus/console_libraries
[Install]
WantedBy=multi-user.target
Node-exporter的服务文件/etc/systemd/system/node_exporter.service:
ini复制[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
启用并启动服务:
bash复制sudo systemctl daemon-reload
sudo systemctl enable prometheus node_exporter
sudo systemctl start prometheus node_exporter
Node-exporter采集的指标主要分为以下几类:
CPU相关:
内存相关:
磁盘相关:
网络相关:
CPU使用率计算:
promql复制100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
内存使用率:
promql复制(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
磁盘空间使用率:
promql复制(node_filesystem_size_bytes{mountpoint="/"} - node_filesystem_free_bytes{mountpoint="/"}) / node_filesystem_size_bytes{mountpoint="/"} * 100
在/etc/prometheus/rules/node_alerts.yml中定义主机监控告警规则:
yaml复制groups:
- name: node_alerts
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance) (irate(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: HighMemoryUsage
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 85
for: 10m
labels:
severity: warning
annotations:
summary: "High memory usage on {{ $labels.instance }}"
description: "Memory usage is {{ $value }}%"
在prometheus.yml中引用规则文件:
yaml复制rule_files:
- /etc/prometheus/rules/*.yml
Prometheus需要与Alertmanager配合实现告警通知。基本配置示例:
yaml复制alerting:
alertmanagers:
- static_configs:
- targets:
- alertmanager:9093
Prometheus的TSDB存储可以通过以下参数优化:
yaml复制storage:
tsdb:
retention: 15d # 数据保留时间
max-block-duration: 2h # 块压缩周期
min-block-duration: 2h
对于大规模部署,建议:
启用基础认证:
yaml复制web:
config:
file: /etc/prometheus/web.yml
web.yml内容:
yaml复制basic_auth_users:
admin: $2y$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
使用HTTPS:
yaml复制web:
cert_file: /path/to/cert.pem
key_file: /path/to/key.pem
Node-exporter建议通过防火墙限制访问:
bash复制sudo ufw allow from 192.168.1.0/24 to any port 9100
症状:Prometheus targets页面显示DOWN状态
排查步骤:
检查node-exporter进程是否运行:
bash复制ps aux | grep node_exporter
检查端口监听:
bash复制netstat -tulnp | grep 9100
测试手动访问:
bash复制curl http://localhost:9100/metrics
症状:Prometheus UI响应缓慢
优化建议:
症状:图表显示断点或数据缺失
可能原因:
解决方案:
对于动态环境,推荐使用服务发现替代静态配置。以Kubernetes服务发现为例:
yaml复制scrape_configs:
- job_name: 'kubernetes-nodes'
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
对于大规模部署,可以采用联邦架构:
yaml复制scrape_configs:
- job_name: 'federate'
honor_labels: true
metrics_path: '/federate'
params:
'match[]':
- '{job="prometheus"}'
- '{__name__=~"job:.*"}'
static_configs:
- targets:
- 'source-prometheus-1:9090'
- 'source-prometheus-2:9090'
将数据远程写入到InfluxDB或TimescaleDB:
yaml复制remote_write:
- url: "http://influxdb:8086/api/v1/prom/write?db=prometheus"
queue_config:
capacity: 10000
max_shards: 200