Prometheus 监控架构部署实战:二进制与 Docker 双方案

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 数据源:

  1. 单击边栏中的"齿轮",打开"配置"菜单。
  2. 单击"数据源"。
  3. 单击"添加数据源"。
  4. 选择"Prometheus"作为类型。
  5. 设置适当的 Prometheus 服务器 URL,例如 http://localhost:9090
  6. 单击"保存并测试"以保存新的数据源。
3.4.4 创建仪表盘

Grafana 官方提供了大量现成的仪表盘模板,可以直接导入使用:

  1. 打开 Grafana 的 dashboards 官网,在搜索栏输入 node exporter 回车,点击下载量大的 dashboards。
  2. 点击进入详细页面,拷贝仪表盘 ID。
  3. 打开 Grafana web 控制台,点击 dashboard 图标,再点 import 导入,粘贴之前复制的 ID,再点 load 加载。
  4. 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,实现了容器监控与邮件告警能力。

相关推荐
seacracker22 分钟前
从本地磁盘到 NVMe-oF target:PowerFS 存储后端抽象的预留式分层设计
架构·ai存储·统一存储·powerfs
xianyuCcCcCCCcc23 分钟前
企业级高可用实战:Keepalived + LVS(DR)+ MariaDB 主主架构深度解析
架构·mariadb·lvs
程序员无隅27 分钟前
从工具循环到上下文压缩:读懂 Pi 编程 Agent 的内部架构
ai·架构
mldong27 分钟前
跨语言对齐方法论:参考实现先行 + 契约测试
java·架构
黑马程序员毕设32 分钟前
基于B/S架构的“指尖乡味”助农电商小程序系统设计与实现
spring boot·微信小程序·小程序·架构·课程设计·毕设
xu_wenming8 小时前
嵌入式软件架构中的6种解耦艺术
c语言·驱动开发·嵌入式硬件·架构
青 春 记 忆9 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器
ZGIAI9 小时前
ZGI Workflow 变量池:接住节点输出
人工智能·架构
ZGIAI9 小时前
ZGI 记忆隔离:多人共用不串号
人工智能·架构