当前位置: 代码迷 >> 综合 >> Docker——12——Prometheus(普罗米修斯)——(待发)
  详细解决方案

Docker——12——Prometheus(普罗米修斯)——(待发)

热度:88   发布时间:2024-02-26 14:35:05.0

简介:

Prometheus是由SoundCloud开发的开源监控系统的开源版本。2016年,由Google发起的Linux基金会(Cloud Native Computing Foundation,CNCF)将Prometheus纳入其第二大开源项目。Prometheus在开源社区也十分活跃

易管理性

Prometheus: Prometheus核心部分只有一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。
Nagios: 需要有专业的人员进行安装,配置和管理,并且过程很复杂。

业务数据相关性

Prometheus:监控服务的运行状态,基于Prometheus丰富的Client库,用户可以轻松的在应用程序中添加对Prometheus的支持,从而让用户可以获取服务和应用内部真正的运行状态。
Nagios:大部分的监控能力都是围绕系统的一些边缘性的问题,主要针对系统服务和资源的状态以及应用程序的可用性。

另外Prometheus还存在以下优点:

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

实验环境:

全部关闭防火墙,禁用selinux:

主机名称 IP地址 安装组件
machine 192.168.1.128 NodeEXporter、cAdvisor、Prometheus Server、Grafana
node01 192.168.1.129 NodeEXporter、cAdvisor
node02 192.168.1.150 NodeEXporter、cAdvisor

需要部署的组件:

  • Prometheus Server: 普罗米修斯的主服务器
  • NodeEXporter: 负责收集Host硬件信息和操作系统信息
  • cAdvisor: 负责收集Host上运行的容器信息
  • Grafana: 负责展示普罗米修斯监控界面

统一设置系统时间与网络时间同步

!后边收集信息可能会因为时间不同步报错!

yum -y install ntp ntpdate				#安装ntpdate工具ntpdate cn.pool.ntp.org				#设置系统时间与网络时间同步hwclock --systohc				#将系统时间写入硬件时间hwclock -w				#强制系统时间写入CMOS中防止重启失效
或
clock -w

1、部署node-EXporter和cAdvisor(三节点)

1)部署node-EXporter,收集硬件和系统信息(3节点)

[root@machine ~]# docker run -d -p 9100:9100 --name exporter -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)($|/)"[root@node01 ~]# docker run -d -p 9100:9100 --name exporter -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)($|/)"[root@node02 ~]# docker run -d -p 9100:9100 --name exporter -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)($|/)"

PS: 注意,这里使用了- -net=host,这样 Prometheus Server 可以直接与 Node-EXporter 通信

验证:打开浏览器验证结果(3节点)——9100
在这里插入图片描述
在这里插入图片描述

2)部署安装cAdvisor,收集节点容器信息(3节点)

[root@machine ~]# 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[root@node01 ~]# 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[root@node02 ~]# 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节点)——8080
在这里插入图片描述
点击 Docker Containers 可以看到容器的信息

2、在machine上部署Prometheus Server服务

在部署prometheus之前,需要对它的配置文件进行修改,所以先运行一个容器,先将其配置文件拷贝出来

[root@machine ~]# docker run -d --name prometheus prom/prometheus
[root@machine ~]# docker cp prometheus:/etc/prometheus/prometheus.yml ./
[root@machine ~]# ls
prometheus.yml
[root@machine ~]# docker rm -f prometheus
[root@machine ~]# vim prometheus.yml
文末修改添加:static_configs:- targets: 
['localhost:9090','localhost:8080','localhost:9100','192.168.1.129:8080','192.168.1.129:9100','192.168.1.150:8080','192.168.1.150:9100']

PS: 这里指定了prometheus的监控项,包括它也会监控自己收集到的数据

重新运行prometheus容器

[root@machine ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

浏览器访问验证——9090
在这里插入图片描述
Add Graph在这里插入图片描述
在这里插入图片描述
PS:这里能够查看到各个监控项

3、在machine上,部署grafana服务,用来展示prometheus收集到的数据

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

浏览器访问验证——3000——账号:admin
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下滑保存
在这里插入图片描述
在这里插入图片描述
PS: 看到这个提示,说明prometheus和grafana服务的是正常连接的

使用模板显示收集到的数据

此时,虽然grafana收集到了数据,但怎么显示它,仍然是个问题,grafana支持自定义显示信息,不过要自定义起来非常麻烦,不过好在,grafana官方提供了一些模板
grafana官网: https://grafana.com/
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
选中一款模板,然后,有2种方式可以套用这个模板

第一种方式:通过JSON文件使用模板

下载JSON文件grafana控制台导入
在这里插入图片描述
下载完成之后,来到grafana控制台
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

第二种导入模板的方式:

可以直接通过模板的 ID 号
在这里插入图片描述
复制ID编号,来到grafana控制台
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、配置 AlertManager

接下来,启动 AlertManager 来接受 Prometheus 发送过来的报警信息,并执行各种方式的告警。同样以 Docker 方式启动 AlertManager,最简单的启动命令如下

[root@machine ~]# docker run -d --name alertmanager -p 9093:9093 prom/alertmanager:latest
[root@machine ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml ./
[root@machine ~]# ls
alertmanager.yml
[root@machine ~]# cp alertmanager.yml alertmanager.yml.bak
[root@machine ~]# ls
alertmanager.yml  alertmanager.yml.bak

这里 AlertManager 默认启动的端口为 9093,启动完成后,浏览器访问 http://:9093 可以看到默认提供的 UI 页面,不过现在是没有任何告警信息的,因为还没有配置报警规则来触发报警
URL:http://192.168.1.128:9093
在这里插入图片描述

1)AlertManager 配置邮件告警

AlertManager 默认配置文件为 alertmanager.yml,在容器内路径为 /etc/alertmanager/alertmanager.yml

docker cp alertmanager:/etc/alertmanager/alertmanager.yml /root/

主要配置的作用:

  • global: 全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。
  • route: 用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配。
  • receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
  • inhibit_rules: 抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。

2)获取qq邮箱授权码

配置使用 Email 方式通知报警信息,这里以 QQ 邮箱为例,当然在配置QQ邮箱之前,需要登录QQ邮箱,打开SMTP服务,并获取授权码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3)alertmanager.yml配置如下

[root@machine ~]# vim alertmanager.yml
global:resolve_timeout: 5msmtp_from: '2803287484@qq.com'smtp_smarthost: 'smtp.qq.com:465'smtp_auth_username: '2803287484@qq.com'smtp_auth_password: 'ht…………ge'smtp_require_tls: falsesmtp_hello: 'qq.com'
route:group_by: ['alertname']group_wait: 5sgroup_interval: 5srepeat_interval: 5mreceiver: 'email'
receivers:
- name: 'email'email_configs:- to: '2803287484@qq.com'send_resolved: true
inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']

PS:以上模板中涉及的QQ邮箱换成自己的即可,授权码也一样

以上配置我反复试验后,发现不同的环境参数配置也不一样,调试期间出现了各种报错问题,将其中几个关键的配置说明一下:

  • smtp_smarthost: 这里为 QQ 邮箱 SMTP 服务地址,官方地址为 smtp.qq.com 端口为 465 或 587,同时要设置开启 POP3/SMTP服务。
  • smtp_auth_password: 这里为第三方登录 QQ 邮箱的授权码,非 QQ 账户登录密码,否则会报错,获取方式在 QQ 邮箱服务端设置开启 POP3/SMTP 服务时会提示。
  • smtp_require_tls: 是否使用 tls,根据环境不同,来选择开启和关闭。如果提示报错 email.loginAuth failed: 530 Must issue a
    STARTTLS command first,那么就需要设置为 true。着重说明一下,如果开启了 tls,提示报错 starttls failed: x509: certificate signed by unknown authority,需要在 email_configs 下配置 insecure_skip_verify: true 来跳过 tls 验证。

修改 AlertManager 重启容器,将本地 alertmanager.yml 文件挂载到容器内指定位置

[root@machine ~]# docker rm -f alertmanager 
[root@machine ~]# docker run -itd --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager:latest [root@machine ~]# docker ps 
CONTAINER ID        IMAGE                      COMMAND                  CREATED              STATUS              PORTS                    NAMES
0aa6642e546a        prom/alertmanager:latest   "/bin/alertmanager -…"   About a minute ago   Up About a minute   0.0.0.0:9093->9093/tcp   alertmanager
958680adf664        grafana/grafana            "/run.sh"                2 hours ago          Up 2 hours          0.0.0.0:3000->3000/tcp   grafana
4306f55375b7        prom/prometheus            "/bin/prometheus --c…"   2 hours ago          Up 2 hours                                   prometheus
098afde092c7        google/cadvisor            "/usr/bin/cadvisor -…"   2 hours ago          Up 2 hours                                   cadvisor
de862aebc899        prom/node-exporter         "/bin/node_exporter …"   3 hours ago          Up 2 hours                                   exporter

4)Prometheus 配置 AlertManager 告警规则

接下来,需要在 Prometheus 配置 AlertManager 服务地址以及告警规则,新建报警规则文件 node-up.rules 如下

[root@machine ~]# mkdir -p prometheus/rules
[root@machine ~]# cd prometheus/rules/
[root@machine rules]# cat node-up.rules 
groups:
- name: node-uprules:- alert: node-upexpr: up{job="prometheus"} == 0for: 15slabels:severity: 1team: nodeannotations:summary: "{
   { $labels.instance }} 已停止运行超过 15s!"

在这里插入图片描述
PS:该 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/#rule

然后,修改 prometheus.yml 配置文件,添加 rules 规则文件

[root@machine ~]# vim prometheus.yml
alerting:alertmanagers:- static_configs:- targets:- 192.168.1.128:9093			#打开alertmanager监听端口号# - alertmanager:9093# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:- "/usr/local/prometheus/rules/*.rules"			#添加规则到文件路径,注意是容器内的路径

在这里插入图片描述
PS:这里 rule_files 为容器内路径,需要将本地 node-up.rules 文件挂载到容器内指定路径,修改 Prometheus 启动命令如下,并重启服务。

[root@machine ~]# docker rm -f prometheus
[root@machine ~]# docker run -d -p 9090:9090 -v /root/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/prometheus/rules:/usr/local/prometheus/rules --name prometheus --net=host prom/prometheus

此时在prometheus主页上可以看到相应规则
在这里插入图片描述
在这里插入图片描述

5)触发报警发送 Email

模拟 node02 节点 exporter 组件失败

[root@node02 ~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS               NAMES
9d202c428190        google/cadvisor      "/usr/bin/cadvisor -…"   3 hours ago         Up 3 hours                              cadvisor
373d5e987410        prom/node-exporter   "/bin/node_exporter …"   3 hours ago         Up 3 hours                              exporter
[root@node02 ~]# docker stop exporter 
exporter

验证:看到组件失败,接着收到邮件报警
在这里插入图片描述
在这里插入图片描述

6)AlertManager 配置自定义邮件模板

看到上边默认发送的邮件模板,虽然所有核心的信息已经包含了,但是邮件格式内容可以更优雅直观一些,那么,AlertManager 也是支持自定义邮件模板配置的,首先新建一个模板文件 email.tmpl

[root@machine ~]# cd prometheus/
[root@machine prometheus]# mkdir alertmanager-tmpl
[root@machine prometheus]# cd alertmanager-tmpl/
[root@machine alertmanager-tmpl]# vim email.tmpl
{
   { define "email.from" }}2803287484@qq.com{
   { end }}
{
   { define "email.to" }}2803287484@qq.com{
   { end }}
{
   { 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 "2019-08-04 16:58:15" }} <br>
=========end==========<br>
{
   { end }}
{
   { end }}

上边模板文件配置了 email.from、email.to、email.to.html 三种模板变量,可以在 alertmanager.yml 文件中直接配置引用。这里 email.to.html 就是要发送的邮件内容,支持 Html 和 Text 格式,这里为了显示好看,采用 Html 格式简单显示信息。下边 { { range .Alerts }} 是个循环语法,用于循环获取匹配的 Alerts 的信息,下边的告警信息跟上边默认邮件显示信息一样,只是提取了部分核心值来展示。然后,需要增加 alertmanager.yml 文件 templates 配置如下:

[root@machine ~]# vim alertmanager.yml
global:resolve_timeout: 5msmtp_from: '2803287484@qq.com'smtp_smarthost: 'smtp.qq.com:465'smtp_auth_username: '2803287484@qq.com'smtp_auth_password: 'htbglbwmcbsydfge'smtp_require_tls: falsesmtp_hello: 'qq.com'
templates:			#添加- '/etc/alertmanager-tmpl/*.tmpl'			#添加
route:group_by: ['alertname']group_wait: 5sgroup_interval: 5srepeat_interval: 5mreceiver: 'email'
receivers:
- name: 'email'email_configs:- to: '{
    { template "email.to" }}'			#修改html: '{
    { template "email.to.html" . }}'			#修改
inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']

在这里插入图片描述
然后,修改 AlertManager ,将本地 email.tmpl 文件挂载到容器内指定位置并重启

[root@machine ~]# docker rm -f alertmanager 
[root@machine ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/prometheus/alertmanager-tmpl:/etc/alertmanager-tmpl prom/alertmanager

重启完毕后,同样模拟触发报警条件(停止 node-exporter 服务),也是可以正常发送模板邮件出来的,这次就是我们想要的风格啦!

[root@node02 ~]# docker ps
CONTAINER ID        IMAGE                COMMAND                  CREATED             STATUS              PORTS               NAMES
9d202c428190        google/cadvisor      "/usr/bin/cadvisor -…"   3 hours ago         Up 3 hours                              cadvisor
[root@node02 ~]# docker stop cadvisor
cadvisor

在这里插入图片描述

7)邮件内容时间修正

以上模板是没有问题的,但会看到,时间不对,这是因为邮件是全球服务,所以需要更改一下语句,在时间上加上东八区时间。修改如下:

[root@machine ~]# vim /root/prometheus/alertmanager-tmpl/email.tmpl
...
告警主题: {
    {
     .Annotations.summary }}<br>
触发时间: {
    {
     (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br>
...

这里,只有邮件服务需要加上东八区时间,而微信等其他报警途径则不需要,直接使用上述模板中的描述即可

PS:修改过.yml配置文件后,注意重启一下altermanger容器

[root@machine ~]# docker restart alertmanager[root@node01 ~]# docker stop cadvisor

在这里插入图片描述