Docker监控之Prometheus

网友投稿 309 2022-10-28

Docker监控之Prometheus

一、Prometheus简介

Prometheus(普罗米修斯),是一套开源的系统监控报警框架。它以给定的时间间隔从已配置的目标收集指标,评估规则表达式,显示结果,并在发现某些情况为真时触发警报。作为新一代的监控框架,Prometheus 具有以下特点:

* 多维数据模型:由度量名称和键值对标识的时间序列数据 * PromSQL:一种灵活的查询语言,可以利用多维数据完成复杂的查询 * 不依赖分布式存储,单个服务器节点可直接工作 * 基于HTTP的pull方式采集时间序列数据 * 推送时间序列数据通过PushGateway组件支持 * 通过服务发现或静态配置发现目标 * 多种图形模式及仪表盘支持(grafana) * 适用于以机器为中心的监控以及高度动态面向服务架构的监控

* 高效:单一Prometheus可以处理数以百万的监控指标;每秒处理数十万的数据点。 * 易于伸缩:通过使用功能分区(sharing)+联邦集群(federation)可以对Prometheus进行扩展,形成一个 逻辑集群;Prometheus提供多种语言的客户端SDK,这些SDK可以快速让应用程序纳入到Prometheus的监控当中。 * 良好的可视化:Prometheus除了自带有Prometheus UI,Prometheus还提供了一个独立的基于Ruby On Rails的Dashboard解决方案Promdash。 另外最新的Grafana可视化工具也提供了完整的Proetheus支持,基于Prometheus提供的API还可以实现自己的监控可视化UI。

Prometheus架构图

* Prometheus server 定期从配置好的 jobs 或者 exporters 中拉 metrics,或者接收来自 Pushgateway 发过来的 metrics, 或者从其他的 Prometheus server 中拉 metrics; * Prometheus server 在本地存储收集到的 metrics,并运行已定义好的 alert.rules,记录新的时间序列或者向 Alertmanager 推送警报; * Alertmanager 根据配置文件,对接收到的警报进行处理,发出告警; * 在图形界面中,可视化采集数据;

二、环境准备

主机名称 IP地址 安装组件
docker01 192.168.45.129 NodeEXporter、cAdvisor、Prometheus Server、Grafana
docker02 192.168.45.141 NodeEXporter、cAdvisor
docker03 192.168.45.142 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组件发送信息!

实验环境,全部关闭防火墙,禁用selinux。

1)部署Node-EXporter收集硬件和系统信息注:三台dockerhost主机,全部部署Node-EXporter和cAdvisor。

[root@docker01 ~]# docker run -d --name node -p 9100:9100 -v /proc:/host/proc -v /sys:/host/sys -v /:/rootfs --net=host prom/node-exporter --path.procfs /host/proc --path.sysfs /host/sys --collector.filesystem.ignored-mount-points "^/(sys|proc|dev|host|etc)($|/)" //部署node-EXporter,负责收集硬件和系统信息。 //使用prom/node-exporter 镜像创建一个名为node的容器,用于收集硬件和系统信息; //--net=host表示Prometheus server可以直接与node-exporter通信; //并映射9100端口

2)部署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 --net=host google/cadvisor

3)、在docker01上部署Prometheus Server服务在部署prometheus之前,我们需要对它的配置文件进行修改,所以我们先运行一个容器,先将其配置文件拷贝出来。

[root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus [root@docker01 ~]# docker cp prometheus:/etc/prometheus/prometheus.yml ./ [root@docker01 ~]# vim prometheus.yml - targets: ['localhost:9090','localhost:8080','localhost:9100','192.168.45.141:8080','192.168.45.141:9100','192.168.45.142:8080','192.168.45.142:9100'] //用于指定监控本机的9090、8080、9100这三个端口,另外添加另外两台docker主机的8080、9100这两个端口。 //8080端口运行的是cAdvisor服务 //9100端口运行的是node-exporter服务 //9090端口运行的就是Prometheus服务

[root@docker01 ~]# docker rm prometheus -f //将刚才运行的容器删除 prometheus [root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus //重新运行一个prometheus容器,将刚才修改完成的配置文件挂载到容器中

[root@docker01 ~]# mkdir grafana-storage [root@docker01 ~]# chmod 777 -R grafana-storage/ [root@docker01 ~]# docker run -d -p 3000:3000 --name grafana -v /root/grafana-storage:/var/lib/grafana -e "GF_SECURITY_ADMIN_PASSWORD=123.com" grafana/grafana

[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 prom/alertmanager //随便运行一个容器,其目的就是将容器中服务的配置文件拿到本地 [root@docker01 ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml . //将altermanager服务的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 /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager //重新运行alertmanager 容器,并将配置文件挂载到容器中 //建议运行容器之后,使用docker ps | grep alertmanager 确保容器正常运行 //如果配置文件编写错误,那么这个容器是无法启动的

(2)配置alertmanager报警规则

[root@docker01 ~]# mkdir -p prometheus/rules && cd 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!"

[root@docker01 ~]# vim prometheus.yml # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: - 192.168.45.129:9093 //此行将原本的内容更改为alertmanager容器的IP+端口 # Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files: # - "first_rules.yml" - "/usr/local/prometheus/rules/*.rules" //手动添加这一行

[root@docker01 ~]# docker rm -f prometheus //修改完配置为文件后,需要将容器删除,重新运行一台新的容器 prometheus [root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/prometheus/rules/node-up.rules:/usr/local/prometheus/rules/node-up.rules prom/prometheus //指定步骤(2)编写的rule文件的路径

至此开始模拟docker02节点 exporter组件失败或将任意一台的docker主机的容器停止运行如下图:

[root@docker01 ~]# cd prometheus/ [root@docker01 prometheus]# mkdir alertmanager-tmpl [root@docker01 prometheus]# cd alertmanager-tmpl/ [root@docker01 alertmanager-tmpl]# vim email.tmpl {{ define "email.from" }}2567195852@qq.com{{ end }} //填写自己的qq邮箱 {{ define "email.to" }}2567195852@qq.com{{ end }} //填写自己的qq邮箱 {{ define "email.to.html" }} {{ range .Alerts }} =========start==========
告警程序: prometheus_alert
告警级别: {{ .Labels.severity }} 级
告警类型: {{ .Labels.alertname }}
故障主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
=========end==========
{{ end }} {{ end }} //配置完成后保存退出即可

[root@docker01 alertmanager-tmpl]# cd [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: 'tdbwcpvewmzgderg' //自己qq邮箱生成的授权码 smtp_require_tls: false smtp_hello: 'qq.com' templates: //添加此行 - '/etc/alertmanager-tmpl/*.tmpl' //添加此行 route: group_by: ['alertname'] group_wait: 5s group_interval: 5s repeat_interval: 5m receiver: 'email' receivers: - name: 'email' email_configs: - to: '{{ template "email.to" }}' //必须和{{ define "email.to" }}2567195852@qq.com{{ end }} 中的对应 html: '{{ template "email.to.html" . }}' //必须和{{ define "email.to.html" }} 中的名字对应 send_resolved: true inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] //配置完成后保存退出即可 [root@docker01 ~]# docker rm -f alertmanger //删除此容器 [root@docker01 ~]# docker run -d --name alertmanger -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/prometheus/alertmanager-tmpl:/etc/alertmanager-tmpl --restart=always prom/alertmanager //运行一个新的容器

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Docker服务配置+ Consul + registrator实现服务发现
下一篇:详解Java数组的四种拷贝方式
相关文章

 发表评论

暂时没有评论,来抢沙发吧~