Docker监控之Prometheus
1、Prometheus简介
Prometheus(普罗米修斯),是一套开源的系统监控报警框架。它以给定的时间间隔从已配置的目标收集指标,评估规则表达式,显示结果,并在发现某些情况为真时触发警报。
作为新一代的监控框架,Prometheus 具有以下特点:
* 多维数据模型:由度量名称和键值对标识的时间序列数据
* PromSQL:一种灵活的查询语言,可以利用多维数据完成复杂的查询
* 不依赖分布式存储,单个服务器节点可直接工作
* 基于HTTP的pull方式采集时间序列数据
* 推送时间序列数据通过PushGateway组件支持
* 通过服务发现或静态配置发现目标
* 多种图形模式及仪表盘支持(grafana)
* 适用于以机器为中心的监控以及高度动态面向服务架构的监控
Prometheus架构图
大致的工作流程是:
* Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics,
或者从其他的 Prometheus server 中拉 metrics;
* Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报;
* Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警;
* 在图形界面中,可视化采集数据;
2、环境准备
2.1环境规划
主机名称 | IP地址 | 安装组件 |
docker01 | 10.3.104.52 | NodeEXporter、cAdvisor、Prometheus Server、Grafana |
docker02 | 10.3.104.56 | NodeEXporter、cAdvisor |
注:部署该服务,包括四个组件:Prometheus Server、Node Exporter、cAdvrisor、Grafana其作用如下:
* Prometheus Server: 普罗米修斯的主服务器。(端口:9090)
* NodeEXporter: 负责收集Host硬件信息和操作系统信息。(端口:9100)
* cAdvisor: 负责收集Host上运行的容器信息。(端口:8080)
* Grafana:负责展示普罗米修斯监控界面。(端口:3000)
* Alertmanager:用来接收Prometheus发送的报警信息,并且执行设置好的报警方式,报警内容(同样也是在dockerA主机上部署,端口:9093);
各组件的关系:NodeEXporter、cAdvisor负责收集信息发送给 Prometheus server,在由 Prometheus server交给Grafana进行图形化的显示。如需报警,则由prometheus向Alertmanager组件发送信息!
2.2 部署Node-EXporter收集硬件和系统信息
注:实验环境,全部关闭防火墙,禁用selinux,两台dockerhost主机,全部部署Node-EXporter和cAdvisor
1)创建Node-EXpoter容器
[root@docker01 ~]# docker run -d \ --name node \ -p 9100:9100 \ -v /proc:/host/proc \ -v /sys:/host/sys \ -v /:/rootfs prom/node-exporter \ --path.procfs /host/proc \ --path.sysfs /host/sys \ --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)" Ps:部署node-EXporter,负责收集硬件和系统信息。 使用prom/node-exporter 镜像创建一个名为node的容器,用于收集硬件和系统信息; 并映射9100端口
2)验证:打开浏览器验证结果
注:出现这个结果表示Node-Exporter组件安装成功,注意:另外两台dockerhost主机也需安装Node-Exporter组件组件操作完全一样,安装完成后请自行打开浏览器验证。
2.3 部署cAdvisor收集节点容器信息
1)部署cAdvisor容器
[root@docker01 ~]# docker run \ -v /:/rootfs:ro \ -v /var/run:/var/run/:rw \ -v /sys:/sys:ro \ -v /var/lib/docker:/var/lib/docker:ro \ -p 8080:8080 \ --detach=true \ --name=cadvisor \ google/cadvisor
2) 验证:打开浏览器验证结果
注:出现这个结果表示cAdvisor组件安装成功,注意:另外两台dockerhost主机也需安装cAdvisor组件操作完全一样,安装完成后请自行打开浏览器验证。
2.4 部署Prometheus Server服务
1)在部署prometheus之前,我们需要对它的配置文件进行修改,所以我们先运行一个容器,先将其配置文件拷贝出来。
[root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus prom/prometheus [root@docker01 ~]# docker cp prometheus:/etc/prometheus/prometheus.yml ./ [root@docker01 ~]# vim prometheus.yml static_configs: - targets: ['localhost:9090','localhost:8080','localhost:9100','10.3.104.56:8080','10.3.104.56:9100'] Ps:用于指定监控本机的9090、8080、9100这三个端口,docker02主机的8080、9100也是这两个端口。 8080端口运行的是cAdvisor服务 9100端口运行的是node-exporter服务 9090端口运行的就是Prometheus服务
注:这里指定了prometheus的监控项,包括它也会监控自己本地主机的数据
2)重新运行一个prometheus容器,将刚才修改完成的配置文件挂载到容器中
[root@docker01 ~]# docker rm prometheus -f //将刚才运行的容器删除 prometheus [root@docker01 ~]# docker run -d \ -p 9090:9090 \ --name prometheus \ -v /data/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml \ prom/prometheus
3)验证:打开浏览器验证结果
注:上述代表两台主机信息采集正常
2.5 部署grafana服务图形化展示
1)容器部署grafana服务
[root@docker01 ~]# mkdir -p /data/grafana-storage [root@docker01 ~]# chmod 777 -R /data/grafana-storage/ [root@docker01 ~]# docker run -d \ -p 3000:3000 \ --name grafana \ -v /data/grafana-storage:/var/lib/grafana \ -e "GF_SECURITY_ADMIN_PASSWORD=123.com" \ grafana/grafana
2)浏览器访问
3)添加prometheus数据源
4)导入grafana模板,模板ID可以在grafana官网查找,如下
5)Grafana数据展示
注:至此web界面的监控就部署完成了!
2.6 配置Prometheus监控实现报警
[root@docker01 ~]# mkdir -p /data/alertmanager && cd/data/alertmanager [root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 alertmanager:v0.14.0 //随便运行一个容器,其目的就是将容器中服务的配置文件拿到本地
[root@docker01 ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml . //将altermanager服务的yml配置文件复制到本地
2)以qq邮箱为例查看授权码
3)配置alertmanager.yml
[root@docker01 ~]# vim alertmanager.yml global: resolve_timeout: 5m smtp_from: '2567195852@qq.com' //发送者信息 smtp_smarthost: 'smtp.qq.com:465' smtp_auth_username: '2567195852@qq.com //用户名 smtp_auth_password: 'tdcwcwvevmqwdjgg' //使用自己qq邮箱生成的授权码 smtp_require_tls: false smtp_hello: 'qq.com' route: group_by: ['alertname'] //采用默认组 group_wait: 5s group_interval: 5s repeat_interval: 5m receiver: 'email' receivers: - name: 'email' email_configs: - to: '2567195852@qq.com' //接受者信息 send_resolved: true //当容器恢复正常时,也会发送一份邮件 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
简单介绍一下主要配置的作用:
* global: 全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。
* route: 用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配。
* receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
* inhibit_rules: 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。
[root@docker01 ~]# docker rm -f alertmanager //将原本的alertmanager 容器删除 [root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 -v /data/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager:v0.14.0
//重新运行alertmanager 容器,并将配置文件挂载到容器中 //建议运行容器之后,使用docker ps | grep alertmanager 确保容器正常运行
//如果配置文件编写错误,那么这个容器是无法启动的
4)配置alertmanager报警规则
[root@docker01 ~]# mkdir -p /data/prometheus/rules && cd /data/prometheus/rules //创建目录用于存放规则的目录 [root@dockerA rules]# vim node-up.rules //编写规则 groups: - name: node-up //自定义名称 rules: - alert: node-up expr: up{job="prometheus"} == 0 // job的名称必须和prometheus配置文件中的 - job_name: 'prometheus'对应 for: 15s labels: severity: 1 team: node annotations: summary: "{{ $labels.instance }} 已停止运行超过 15s!"
注:该 rules 目的是监测 node 是否存活,expr 为 PromQL 表达式验证特定节点 job=“node-exporter” 是否活着,for 表示报警状态为Pending 后等待 15s 变成 Firing 状态,一旦变成 Firing 状态则将报警发送到 AlertManager,labels 和 annotations 对该 alert 添加更多的标识说明信息,所有添加的标签注解信息,以及 prometheus.yml 中 该 job 已添加 label 都会自动添加到邮件内容中,更多关于 rule 详细配置可以参考它的官方文档: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules
5)关联Prometheus
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!