1. 架构概述
本文以一套完整的 Prometheus 监控系统为例,讲解从二进制安装到 Docker Compose 编排的两种部署方式。整体架构由 Prometheus 负责指标采集与存储,node_exporter 采集主机指标,cAdvisor 采集容器指标,Alertmanager 负责告警通知,Grafana 负责可视化展示。
整套系统部署在一台名为 monitor 的服务器上,通过 9090、9100、8080、9093、3000 五个端口分别对外提供服务。
2. 主机规划
部署前先明确主机配置与软件清单,便于后续按步骤操作。
| 主机名 | IP 地址 | 配置 | 系统 | 软件 |
|---|---|---|---|---|
| monitor | 192.168.72.61 | 2C4G | redhat 10.1 | prometheus、node_exporter、grafana |
3. 二进制安装
3.1 时间同步
监控系统对时间精度要求较高,时间偏差会导致告警误报或数据错乱,因此先配置 chrony 时间同步。
3.1.1 配置服务端
在 monitor 服务器上编辑 /etc/chrony.conf,配置如下:
bash
# 配置
[root@monitor ~]# vim /etc/chrony.conf
......
# Select which information is logged.
log measurements statistics tracking
server ntp.aliyun.com iburst
# Allow NTP client access from local network.
allow 192.168.0.0/16
重启
[root@monitor ~]# systemctl restart chrony
查看
[root@monitor ~]# chronyc sources -v
配置参数说明:
- server ntp.aliyun.com iburst:指定使用 ntp.aliyun.com 作为时间服务器池,iburst 选项表示在初始同步时会发送多个请求以加快同步速度。
- allow 192.168.0.0/16:允许该网段范围内的主机与 chrony 进行时间同步。
- local stratum 10:将本地时钟设为 stratum 10,stratum 值表示时钟的准确度,值越小表示准确度越高。
- driftfile /var/lib/chrony/drift:指定用于保存时钟漂移信息的文件路径。
- makestep 1.0 3:设置当系统时间与服务器时间偏差大于 1 秒时,会以 1 秒的步长进行调整。如果偏差超过 3 秒,则立即进行时间调整。
- rtcsync:启用硬件时钟同步功能,可以提高时钟的准确性。
- keyfile /etc/chrony.keys:指定使用的密钥文件路径,用于对时间同步进行身份验证。
- leapsectz right/UTC:指定时区为 UTC。
- logdir /var/log/chrony:指定日志文件存放目录。
3.1.2 配置客户端
在客户端服务器上编辑 /etc/chrony.conf,指向服务端地址:
bash
[root@client ~]# vim /etc/chrony.conf
......
#pool 2.rhel.pool.ntp.org iburst
server 192.168.72.128 iburst
# Select which information is logged.
log measurements statistics tracking
[root@client ~]# systemctl restart chrony
[root@client ~]# chronyc sources -v
3.2 安装 Prometheus
3.2.1 下载安装
从官方 GitHub 下载 Prometheus 3.5.3 二进制包并解压到 /opt/monitor 目录:
bash
# 下载并安装
[root@monitor ~]# mkdir -p /opt/monitor
[root@monitor ~]# wget https://github.com/prometheus/prometheus/releases/download/v3.5.3/prometheus-3.5.3.linux-amd64.tar.gz
[root@monitor ~]# tar -xvf prometheus-3.5.3.linux-amd64.tar.gz -C /opt/monitor
[root@monitor ~]# mv /opt/monitor/prometheus-3.5.3.linux-amd64 /opt/monitor/prometheus
创建用户
[root@monitor ~]# useradd -r -M -s /sbin/nologin prometheus
[root@monitor ~]# chown -R prometheus: /opt/monitor/prometheus
3.2.2 创建服务
创建 systemd 服务文件,使 Prometheus 以系统服务方式运行:
bash
[root@monitor ~]# cat > /usr/lib/systemd/system/prometheus.service<<EOF
[Unit]
Description=Prometheus Server
Documentation=https://prometheus.io/docs/introduction/overview/
# 在网络服务就绪后启动
After=network-online.target
# 强烈建议网络就绪,但不是强制要求
Wants=network-online.target
[Service]
默认类型,表示主进程即为服务进程。Type=notify 为后台常驻进程
Type=simple
User=prometheus
Group=prometheus
ExecStart=/opt/monitor/prometheus/prometheus
--config.file=/opt/monitor/prometheus/prometheus.yml
--storage.tsdb.path=/opt/monitor/prometheus/data
--storage.tsdb.retention.time=60d
--web.listen-address=0.0.0.0:9090
--web.enable-lifecycle
重载配置信号(支持热加载)
ExecReload=/bin/kill -HUP $MAINPID
优雅停止
ExecStop=/bin/kill -s QUIT $MAINPID
仅在服务非正常退出时自动重启
Restart=on-failure
重启前等待 10 秒
RestartSec=10
资源限制
LimitNOFILE=65536
[Install]
表示系统进入多用户运行模式时,自动启动该服务
WantedBy=multi-user.target
EOF
[root@monitor ~]# systemctl daemon-reload
[root@monitor ~]# systemctl enable --now prometheus
[root@monitor ~]# systemctl status prometheus
启动参数说明:
- --config.file:指定主配置文件路径。
- --storage.tsdb.path:指定数据库存储目录。
- --storage.tsdb.retention.time=60d:指定数据保留天数,默认 15 天。
- --web.listen-address=0.0.0.0:9090:指定监听地址和端口。
- --web.enable-lifecycle:启用热加载功能。
3.2.3 访问验证
浏览器打开 http://192.168.72.61:9090 即可打开 Prometheus 监控页面。
3.3 安装 node_exporter
3.3.1 下载安装
从官方下载 node_exporter 1.11.1 并解压:
bash
# 下载
[root@monitor ~]# wget https://github.com/prometheus/node_exporter/releases/download/v1.11.1/node_exporter-1.11.1.linux-amd64.tar.gz
# 解压
[root@monitor ~]# tar -zxf node_exporter-1.11.1.linux-amd64.tar.gz -C /opt/monitor/
[root@monitor ~]# mv /opt/monitor/node_exporter-1.11.1.linux-amd64 /opt/monitor/node_exporter
# 权限
[root@monitor ~]# chown -R prometheus: /opt/monitor/node_exporter
3.3.2 创建服务脚本
bash
[root@monitor ~]# cat > /usr/lib/systemd/system/node_exporter.service <<EOF
[Unit]
Description=node_exporter
Documentation=https://prometheus.io/
After=network.target
[Service]
User=prometheus
Group=prometheus
ExecStart=/opt/monitor/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
[root@monitor ~]# systemctl daemon-reload
[root@monitor ~]# systemctl enable node_exporter --now
[root@monitor ~]# systemctl status node_exporter
3.3.3 添加监控项
在 Prometheus 主配置文件中追加 node-exporter 抓取任务:
bash
[root@monitor ~]# cat >> /opt/monitor/prometheus/prometheus.yml <<EOF
# 在 scrape_configs 这行下面添加如下配置:
# node-exporter 配置
- job_name: 'node-exporter'
static_configs:
- targets: ['localhost:9100']
labels:
instance: Prometheus 服务器
EOF
3.3.4 重启 Prometheus
bash
# 验证配置文件
[root@monitor ~]# /opt/monitor/prometheus/promtool check config /opt/monitor/prometheus/prometheus.yml
# 重新加载
[root@monitor ~]# curl -X POST http://localhost:9090/-/reload
3.3.5 访问验证
打开浏览器,输入 http://192.168.72.61:9090 重新访问,在 Targets 页面即可看到 node-exporter 已处于 UP 状态。
3.4 安装 Grafana
3.4.1 下载安装
Grafana 提供 RPM 包和二进制包两种安装方式,任选其一即可。
方式一:RPM 安装
bash
# 安装
[root@monitor ~]# dnf install -y https://dl.grafana.com/grafana-enterprise/release/13.0.2/grafana-enterprise_13.0.2_26816849631_linux_amd64.rpm
# 启动
[root@monitor ~]# systemctl enable grafana-server --now
方式二:二进制安装
bash
# 下载
[root@monitor ~]# wget https://dl.grafana.com/grafana-enterprise/release/13.0.2/grafana-enterprise_13.0.2_26816849631_linux_amd64.tar.gz
# 解压
[root@monitor ~]# tar -zxvf grafana-enterprise_13.0.2_26816849631_linux_amd64.tar.gz -C /opt/monitor/
[root@monitor ~]# mv /opt/monitor/grafana-enterprise_13.0.2_26816849631_linux_amd64 /opt/monitor/grafana
# 权限
[root@monitor ~]# chown -R prometheus: /opt/monitor/grafana
创建服务
[root@monitor ~]# cat > /usr/lib/systemd/system/grafana.service <<EOF
[Unit]
Description=Grafana Server
After=network.target
[Service]
Type=simple
User=prometheus
Group=prometheus
Restart=on-failure
ExecStart=/opt/monitor/grafana/bin/grafana server
--config=/opt/monitor/grafana/conf/defaults.ini
--homepath=/opt/monitor/grafana
[Install]
WantedBy=multi-user.target
EOF
启动服务
[root@monitor ~]# systemctl daemon-reload
[root@monitor ~]# systemctl enable grafana --now
3.4.2 访问验证
通过浏览器访问 http://192.168.72.61:3000 即可打开 Grafana 页面,默认用户名密码都是 admin,初次登录会要求修改默认的登录密码。
3.4.3 配置数据源
在 Grafana 中创建 Prometheus 数据源:
- 单击边栏中的"齿轮",打开"配置"菜单。
- 单击"数据源"。
- 单击"添加数据源"。
- 选择"Prometheus"作为类型。
- 设置适当的 Prometheus 服务器 URL,例如 http://localhost:9090。
- 单击"保存并测试"以保存新的数据源。
3.4.4 创建仪表盘
Grafana 官方提供了大量现成的仪表盘模板,可以直接导入使用:
- 打开 Grafana 的 dashboards 官网,在搜索栏输入 node exporter 回车,点击下载量大的 dashboards。
- 点击进入详细页面,拷贝仪表盘 ID。
- 打开 Grafana web 控制台,点击 dashboard 图标,再点 import 导入,粘贴之前复制的 ID,再点 load 加载。
- name 填写"服务器监控"(根据实际修改),选择"prometheus",再点 import 导入。
4. Docker 安装
4.1 主机规划
| 主机名 | IP 地址 | 系统 | 说明 |
|---|---|---|---|
| monitor | 192.168.72.62 | redhat 10.1 | prometheus、alertmanager、grafana、node_exporter、cadvisor |
4.2 安装 Docker
bash
# 1、安装必要的系统工具
[root@monitor ~]# yum install -y yum-utils
2、添加软件源信息
[root@monitor ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/rhel/docker-ce.repo
3、安装 Docker
[root@monitor ~]# dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
4、配置镜像加速器
[root@monitor ~]# cat > /etc/docker/daemon.json <<EOF
{
"registry-mirrors": [
"https://docker.1ms.run",
"https://dockerproxy.net",
"https://proxy.vvvv.ee",
"https://dockerproxy.link",
"https://7kjolzcz.mirror.aliyuncs.com"
]
}
EOF
5、开启 Docker 服务
[root@monitor ~]# systemctl daemon-reload
[root@monitor ~]# systemctl enable docker --now
4.3 安装 docker-compose
bash
# 1、下载 Docker Compose 的当前稳定版本
[root@monitor ~]# wget https://github.com/docker/compose/releases/download/v5.1.4/docker-compose-linux-x86_64
2、将可执行权限应用于二进制文件
[root@monitor ~]# mv docker-compose-linux-x86_64 /usr/bin/docker-compose
[root@monitor ~]# chmod +x /usr/bin/docker-compose
3、验证安装
[root@monitor ~]# docker-compose -v
Docker Compose version v5.0.2
4.4 安装监控环境
4.4.1 创建目录
bash
[root@monitor ~]# mkdir /opt/monitor/{grafana,prometheus,alertmanager} -p
[root@monitor ~]# cd /opt/monitor
4.4.2 创建 alertmanager 配置文件
bash
[root@monitor monitor]# cat > alertmanager/config.yml <<"EOF"
global:
# 163 服务器
smtp_smarthost: 'smtp.163.com:465'
# 发邮件的邮箱
smtp_from: '13330262635@163.com'
# 发邮件的邮箱用户名,也就是你的邮箱
smtp_auth_username: '13330262635@163.com'
# 发邮件的邮箱密码
smtp_auth_password: 'ZFbuQ4ihJPKxY4qM'
# 进行 tls 验证
smtp_require_tls: false
route:
group_by: ['alertname']
# 当收到告警的时候,等待 group_wait 配置的时间,看是否还有告警,如果有就一起发出去
group_wait: 10s
# 如果上次告警信息发送成功,此时又来了一个新的告警数据,则需要等待 group_interval 配置的时间才可以发送出去
group_interval: 10s
# 如果上次告警信息发送成功,且问题没有解决,则等待 repeat_interval 配置的时间再次发送告警数据
repeat_interval: 10m
# 全局报警组,这个参数是必选的
receiver: email
receivers:
- name: 'email'
# 收邮件的邮箱
email_configs:
- to: '1062080730@qq.com'
# 当告警恢复后,是否发送邮件
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
EOF
4.4.3 创建 grafana 配置文件
配置 Grafana 管理账号信息:
bash
[root@monitor monitor]# cat > grafana/config.monitoring <<EOF
GF_SECURITY_ADMIN_USER=admin # 登录用户
GF_SECURITY_ADMIN_PASSWORD=password # 登录密码
GF_USERS_ALLOW_SIGN_UP=false # 不允许注册
EOF
4.4.4 创建 prometheus 配置文件
bash
[root@monitor monitor]# cat > prometheus/prometheus.yml << "EOF"
# 全局配置
global:
scrape_interval: 15s # 将搜刮间隔设置为每 15 秒一次。默认是每 1 分钟一次。
evaluation_interval: 15s # 每 15 秒评估一次规则。默认是每 1 分钟一次。
Alertmanager 配置
alerting:
alertmanagers:
static_configs:
targets: ['alertmanager:9093']
报警(触发器)配置
rule_files:
"alert.yml"
搜刮配置
scrape_configs:
job_name: 'prometheus'
static_configs:
targets: ['localhost:9090']
job_name: 'alertmanager'
static_configs:
targets: ['alertmanager:9093']
job_name: 'cadvisor'
static_configs:
targets: ['cadvisor:8080']
labels:
instance: Prometheus 服务器
job_name: 'node-exporter'
static_configs:
targets: ['node_exporter:9100']
labels:
instance: Prometheus 服务器
EOF
4.4.5 创建 alert 报警文件
bash
[root@monitor monitor]# cat > prometheus/alert.yml <<EOF
groups:
- name: Prometheus alert
rules:
# 对任何实例超过 30 秒无法联系的情况发出警报
- alert: 服务告警
expr: up == 0
for: 30s
labels:
severity: critical
annotations:
summary: "服务异常, 实例:{{ $labels.instance }}"
description: "{{ $labels.job }} 服务 30 秒前已关闭"
EOF
4.4.6 创建 docker-compose.yaml
bash
[root@monitor monitor]# cat > docker-compose.yaml <<EOF
volumes:
prometheus_data: {}
grafana_data: {}
networks:
monitoring:
driver: bridge
services:
prometheus:
image: prom/prometheus:v3.9.1
container_name: prometheus
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- ./prometheus/:/etc/prometheus/
- prometheus_data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
# 热加载配置
- '--web.enable-lifecycle'
# api 配置
#- '--web.enable-admin-api'
# 历史数据最大保留时间,默认 15 天
- '--storage.tsdb.retention.time=30d'
networks:
- monitoring
links:
- alertmanager
- cadvisor
- node_exporter
expose:
- 9090
ports:
- 9090:9090
depends_on:
- cadvisor
alertmanager:
image: prom/alertmanager:v0.31.1
container_name: alertmanager
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- ./alertmanager/:/etc/alertmanager/
command:
- '--config.file=/etc/alertmanager/config.yml'
- '--storage.path=/alertmanager'
networks:
- monitoring
expose:
- 9093
ports:
- 9093:9093
cadvisor:
image: google/cadvisor:v0.33.0
container_name: cadvisor
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- /:/rootfs:ro
- /var/run:/var/run:rw
- /sys:/sys:ro
- /data/docker/:/var/lib/docker:ro
networks:
- monitoring
expose:
- 8080
node_exporter:
image: prom/node-exporter:v1.10.2
container_name: node-exporter
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.ignored-mount-points=^/(sys|proc|dev|host|etc|rootfs/var/lib/docker)($$|/)'
networks:
- monitoring
ports:
- 9100:9100
grafana:
image: grafana/grafana:12.4.0-22046043985
container_name: grafana
restart: always
volumes:
- /etc/localtime:/etc/localtime:ro
- grafana_data:/var/lib/grafana
- ./grafana/provisioning/:/etc/grafana/provisioning/
env_file:
- ./grafana/config.monitoring
networks:
- monitoring
links:
- prometheus
ports:
- 3000:3000
depends_on:
- prometheus
EOF
4.4.7 运行容器
bash
[root@monitor monitor]# docker-compose up -d
[+] Running 6/6
? Network docker-prometheus_monitoring Created 0.1s
? Container node-exporter Started 0.2s
? Container alertmanager Started 0.2s
? Container cadvisor Started 0.2s
? Container prometheus Started 0.1s
? Container grafana Started
[root@monitor monitor]# docker-compose ls
[root@monitor monitor]# docker-compose ps
4.4.8 访问验证
容器启动后,通过以下地址访问各组件:
| 应用 | 访问地址 | 备注 |
|---|---|---|
| prometheus | http://192.168.72.62:9090 | |
| grafana | http://192.168.72.62:3000 | admin/password,创建仪表盘 |
| alertmanager | http://192.168.72.62:9093 | |
| node-exporter | http://192.168.72.62:9100/metrics |
5. 总结
本文通过二进制和 Docker Compose 两种方式完成了 Prometheus 监控架构的部署。二进制方式适合对组件有精细控制需求的场景,Docker 方式则更便于快速部署和统一管理。两种方式的核心组件一致,均包含 Prometheus、node_exporter、Grafana,Docker 方式额外集成了 Alertmanager 和 cAdvisor,实现了容器监控与邮件告警能力。