一、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端口

验证:打开浏览器验证结果 注:出现这个结果表示Node-Exporter组件安装成功,注意:另外两台dockerhost主机也需安装Node-Exporter组件组件操作完全一样,安装完成后请自行打开浏览器验证。

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

验证:打开浏览器验证结果 注:出现这个结果表示cAdvisor组件安装成功,注意:另外两台dockerhost主机也需安装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服务

注:这里指定了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容器,将刚才修改完成的配置文件挂载到容器中

验证:打开浏览器验证结果 3)在docker01上,部署grafana服务,用来展示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

验证:打开浏览器验证结果

上述配置完成后,我们就需要配置它以什么样的形式来给我们展示了,可以自定义,但是很麻烦,我选择直接去grafana官网寻找现成的模板。如图: 注:这里可能是这个模块用不了,可以去grafana官网多找点别的图形模板,以上是第一种下载模板方式,接下来演示第二种下载模板方式。 至此web界面的监控就部署完成了! 3)、配置Peometheus监控实现报警 Prometheus的报警方式有好几种,比如:邮箱、微信、钉钉等,本次案例采用邮箱告警的方式。接下来,我们需要启动 AlertManager 来接受 Prometheus 发送过来的报警信息,并执行各种方式的告警。同样以 Docker 方式启动AlertManager,最简单的启动命令如下: (1)、运行alertmanager容器只需在docker01上操作即可如下:

[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 prom/alertmanager
//随便运行一个容器,其目的就是将容器中服务的配置文件拿到本地
[root@docker01 ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml .
//将altermanager服务的yml配置文件复制到本地

进入qq邮箱生成授权码:

[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!"

**注:**该 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 (3)关联Prometheus

[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主机的容器停止运行如下图:

OK以上可以看邮箱收到容器停止运行的警告,但好像看的不是很直白为了追求美观,我们采取设置一下报警信息的模板! (4)、设置报警信息模板

[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==========<br>
告警程序: prometheus_alert<br>
告警级别: {{ .Labels.severity }} 级<br>
告警类型: {{ .Labels.alertname }}<br>
故障主机: {{ .Labels.instance }}<br>
告警主题: {{ .Annotations.summary }}<br>
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }} <br>
=========end==========<br>
{{ 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
//运行一个新的容器

至此,新的报警模板也生成了,如果以下容器有Down的,就会给你发送新的邮件,恢复正常后,也会发送邮件,同样,邮件中的内容格式是有误的,但是你可以正常接收到报警信息!