在大规模容器环境下(例如 Kubernetes 集群、Docker Swarm 或自定义容器编排平台),实时、可视化和可扩展的监控平台是保障业务连续性和快速响应问题的关键。A5数据本教程面向具备 Linux 和容器基础的运维/DevOps 工程师,使用 Rocky Linux 8.7 作为主机系统,讲解如何部署 Prometheus + Grafana 监控体系,并深入介绍采集、存储、可视化及性能评估方法。
一、方案概览与目标
监控目标
- 全面采集容器化环境指标(CPU、内存、磁盘、网络、容器生命周期事件等)
- 支持上万容器实例规模的数据聚合、聚合与查询
- 支持自定义告警规则并推送至企业级通知系统(如 Slack/钉钉/邮件)
- 可视化展示关键业务指标与趋势分析
技术栈
| 工具/组件 | 版本 | 作用 |
|---|---|---|
| Rocky Linux | 8.7 | 基础操作系统 |
| Prometheus | 2.48.0(例) | 指标采集与时序数据库 |
| Grafana | 10.1.5(例) | 可视化与告警界面 |
| Node Exporter | 1.6.1 | 主机指标采集 |
| cAdvisor | 0.47.0 | 容器级指标采集 |
| Alertmanager | 0.25.0 | 告警管理 |
| Docker | 24.x | 容器运行环境 |
| Kubernetes | 1.28.x(如有) | 容器编排平台(可选) |
香港服务器www.a5idc.com硬件配置建议(单 Prometheus 节点)
下例适用于采集 5,000+ 容器节点的中大型监控环境。视实际指标量级扩展 shard 数量。
| 指标级别 | CPU | 内存 | 磁盘 | 备注 |
|---|---|---|---|---|
| 中等负载 | 8 核 | 32GB | 1TB NVMe SSD | 单 Prometheus 实例 |
| 高负载 | 16 核 | 64GB | 2TB NVMe SSD | 拆分 Prometheus Shards |
| Grafana 节点 | 8 核 | 16GB | 500GB SSD | 多用户 Dashboard 支撑 |
| Alertmanager HA | 4 核 × 2 | 8GB × 2 | 200GB × 2 | 多副本,避免告警丢失 |
二、环境准备
1. 基础依赖安装(Rocky Linux 8.7)
bash
# 更新系统
sudo dnf update -y
sudo dnf install -y vim git wget unzip curl
# 开启防火墙必需端口
sudo firewall-cmd --add-port=9090/tcp --add-port=3000/tcp --permanent
sudo firewall-cmd --reload
# 关闭 SELinux 只是为了初期部署简化(生产建议保留并配置策略)
sudo setenforce 0
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/config
2. 网络与用户配置
创建监控专用用户:
bash
sudo useradd --no-create-home --shell /sbin/nologin prometheus
sudo mkdir /etc/prometheus /var/lib/prometheus
sudo chown prometheus:prometheus /etc/prometheus /var/lib/prometheus
三、部署 Prometheus
1. 下载与安装
bash
cd /tmp
wget https://github.com/prometheus/prometheus/releases/download/v2.48.0/prometheus-2.48.0.linux-amd64.tar.gz
tar -xzf prometheus-2.48.0.linux-amd64.tar.gz
cd prometheus-2.48.0.linux-amd64
sudo cp prometheus promtool /usr/local/bin/
sudo cp -r consoles console_libraries /etc/prometheus/
sudo chown -R prometheus:prometheus /usr/local/bin/prometheus /etc/prometheus
2. 配置 Prometheus
编辑 /etc/prometheus/prometheus.yml:
yaml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
- job_name: 'node_exporter'
static_configs:
- targets: ['node1:9100','node2:9100'] # 按你的节点替换
- job_name: 'cadvisor'
static_configs:
- targets: ['node1:8080','node2:8080']
将 Prometheus 进程权限设置:
bash
sudo chown prometheus:prometheus /etc/prometheus/prometheus.yml
3. 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.listen-address=0.0.0.0:9090
[Install]
WantedBy=multi-user.target
启动并检查:
bash
sudo systemctl daemon-reload
sudo systemctl enable --now prometheus
sudo journalctl -fu prometheus
四、容器与主机指标采集
1. 安装 Node Exporter(主机基础指标)
bash
wget https://github.com/prometheus/node_exporter/releases/download/v1.6.1/node_exporter-1.6.1.linux-amd64.tar.gz
tar -xzf node_exporter-1.6.1.linux-amd64.tar.gz
sudo mv node_exporter-1.6.1.linux-amd64/node_exporter /usr/local/bin/
sudo useradd --no-create-home --shell /sbin/nologin nodeusr
sudo chown nodeusr:nodeusr /usr/local/bin/node_exporter
Node Exporter systemd 配置
ini
[Unit]
Description=Node Exporter
After=network.target
[Service]
User=nodeusr
Group=nodeusr
ExecStart=/usr/local/bin/node_exporter
[Install]
WantedBy=default.target
2. 安装 cAdvisor(容器级指标)
bash
docker run -d \
--name=cadvisor \
--volume=/:/rootfs:ro \
--volume=/var/run:/var/run:ro \
--volume=/sys:/sys:ro \
--volume=/var/lib/docker/:/var/lib/docker:ro \
--publish=8080:8080 \
--detach \
gcr.io/cadvisor/cadvisor:v0.47.0
3. Prometheus 重新载入配置
bash
sudo systemctl reload prometheus
访问 http://<IP>:9090/targets 检查抓取状态。
五、部署 Grafana
1. 安装
bash
sudo dnf install -y https://dl.grafana.com/oss/release/grafana-10.1.5-1.x86_64.rpm
sudo systemctl enable --now grafana-server
访问 http://<IP>:3000 登录(默认 admin/admin,首次登录需修改密码)。
2. 添加数据源
- 在 Grafana 控制台 → Configuration → Data Sources
- 选择 Prometheus
- URL 填写
http://<Prometheus-IP>:9090 - 保存并测试
3. 导入监控 Dashboard
可在 Grafana 官方或社区下载现成的 Dashboard JSON,例如:
- Node Exporter Full:ID 1860
- cAdvisor Dashboard:ID 1229
流程
- Grafana → Create → Import
- 输入 Dashboard ID 或上传 JSON
六、高级监控与告警
1. 自定义告警规则
在 Prometheus 配置中添加规则文件引用:
yaml
rule_files:
- "/etc/prometheus/alert-rules.yml"
示例规则 /etc/prometheus/alert-rules.yml:
yaml
groups:
- name: container_alerts
rules:
- alert: HighContainerCPU
expr: sum(rate(container_cpu_usage_seconds_total[2m])) by (container_label_com_docker_swarm_service_name) > 0.8
for: 5m
labels:
severity: "critical"
annotations:
summary: "容器 CPU 使用率过高 ({{ $labels.container_label_com_docker_swarm_service_name }})"
description: "{{ $labels.container_label_com_docker_swarm_service_name }} CPU 5 分钟以上超过 80%"
2. Alertmanager 设置
下载并安装:
bash
wget https://github.com/prometheus/alertmanager/releases/download/v0.25.0/alertmanager-0.25.0.linux-amd64.tar.gz
tar -xzf alertmanager-0.25.0.linux-amd64.tar.gz
编辑 /etc/alertmanager/config.yml:
yaml
global:
resolve_timeout: 5m
route:
receiver: 'email-alert'
receivers:
- name: 'email-alert'
email_configs:
- to: 'ops@example.com'
from: 'alertmanager@example.com'
smtp_smarthost: 'smtp.example.com:587'
auth_username: 'alert@example.com'
auth_password: 'securepassword'
启动 Alertmanager
bash
systemctl enable --now alertmanager
在 Prometheus 配置中关联 Alertmanager:
yaml
alerting:
alertmanagers:
- static_configs:
- targets: ['localhost:9093']
重启 Prometheus。
七、性能与容量评估
为了帮助理解 Prometheus 在高负载环境下的表现,我们提供一份基准测试数据(示例):
| 节点数量 | 抓取间隔 | 数据点/秒 | Prometheus 内存占用 | CPU 占用 | 查询平均响应时间 |
|---|---|---|---|---|---|
| 500 | 15s | 3,333 | 2.2GB | 15% | 120ms |
| 2,000 | 15s | 13,333 | 6.8GB | 40% | 300ms |
| 5,000 | 15s | 33,333 | 15.3GB | 75% | 550ms |
| 10,000 | 15s | 66,666 | 28.9GB | 90% | 820ms |
分析结论
- 当抓取频率为默认 15s 时,Prometheus 内存和 CPU 消耗与监控目标呈线性关系
- 建议使用 Prometheus 联邦(Federation) 或 Sharding 分散负载
- 高维度查询应利用 Recording Rules 预计算中间指标
八、优化建议
1. 使用 Remote Write
将指标写入长期存储(如 Cortex、Thanos、InfluxDB、ClickHouse)以扩展历史查询范围。
yaml
remote_write:
- url: "http://thanos-receiver:9201/api/v1/receive"
2. 分布式架构
对于 10,000+ 节点:
- 多 Prometheus 实例(按集群/业务分配)
- Grafana 读写分离与 Cache
- 使用 TSDB 压缩与 Block TTL
3. 利用 Kubernetes ServiceMonitor
若部署在 Kubernetes:
yaml
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: cadvisor-monitor
spec:
selector:
matchLabels:
app: cadvisor
endpoints:
- port: http
interval: 15s
九、常见故障与排查
| 问题 | 排查方法 | 解决建议 |
|---|---|---|
| Prometheus 抓取失败 | Targets 页面查看状态 | 确认网络连通、端口开放 |
| 查询响应缓慢 | 查看 Prometheus CPU/IO | 调整抓取间隔、增加实例 shard |
| Grafana dashboard 无数据 | 检查数据源连接、PromQL 语句 | 刷新数据源、检查标签一致性 |
| 告警泛滥 | 查看告警规则与阈值 | 优化规则逻辑、增加抑制与分组 |
十、总结
A5数据通过在 Rocky Linux 8.7 平台上部署 Prometheus + Grafana,可以实现对大规模容器环境的全面、实时监控与性能分析。本方案涵盖了从基础组件安装、指标采集、可视化面板构建、告警系统搭建到性能评估方法的全流程。
实际生产环境中,应结合业务访问模式与指标量级进行合理的分片、联邦部署与远端写入扩展,并持续调优 PromQL 查询与 Recording Rules,以保障监控系统的稳定性与可用性。
如需进一步集成日志(如 ELK/EFK)与追踪(如 Jaeger/OpenTelemetry),可在此基础上拓展,构建统一的 Observability 平台。