数据算法 extjs6.5 java反射机制 智慧树 canvas datatable concurrency signalr Skeljs vue使用教程 vue过滤器 网校直播系统 jquery去空格 ps字体旋转角度 map删除指定元素 kali重启网卡 python生成随机数 python迭代 python配置 python中集合 java的instanceof java中map java获取 java重命名 linux系统安装 内存修改器 vs2010sp1 不寻常的指南针 pr黑场过渡 银头鲑鱼 电脑cmd命令大全 桌面数字时钟 小程序开发工具下载 微信小程序开发实例 黑道圣徒4去马赛克 无线网改密码 显卡怎么设置 桌面系统 谷歌浏览器xp版下载 马哥python
当前位置: 首页 > 学习教程  > 编程语言

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

2020/10/8 18:33:45 文章标签:

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

简介:

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地址安装组件
machine192.168.1.128NodeEXporter、cAdvisor、Prometheus Server、Grafana
node01192.168.1.129NodeEXporter、cAdvisor
node02192.168.1.150NodeEXporter、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: 5m
  smtp_from: '2803287484@qq.com'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '2803287484@qq.com'
  smtp_auth_password: 'ht…………ge'
  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: '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-up
  rules:
  - alert: node-up
    expr: up{job="prometheus"} == 0
    for: 15s
    labels:
      severity: 1
      team: node
    annotations:
      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: 5m
  smtp_from: '2803287484@qq.com'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '2803287484@qq.com'
  smtp_auth_password: 'htbglbwmcbsydfge'
  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" }}'			#修改
    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

在这里插入图片描述


本文链接: http://www.dtmao.cc/news_show_250050.shtml

附件下载

相关教程

    暂无相关的数据...

共有条评论 网友评论

验证码: 看不清楚?