prometheus安装部署及相关介绍


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

https://prometheus.io/

一、prometheus的优点

(1)易管理性
Prometheus:Prometheus核心部分只有一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。
Nagios:需要有专业的人员进行安装,配置和管理,并且过程很复杂。
(2)业务数据相关性
Prometheus:监控服务的运行状态,基于Prometheus丰富的Client库,用户可以轻松的在应用程序中添加对Prometheus的支持,从而让用户可以获取服务和应用内部真正的运行状态。
Nagios:大部分的监控能力都是围绕系统的一些边缘性的问题,主要针对系统服务和资源的状态以及应用程序的可用性。
(3)高效
单一Prometheus可以处理数以百万的监控指标;每秒处理数十万的数据点。
(4)易于伸缩
通过使用功能分区(sharing)+联邦集群(federation)可以对Prometheus进行扩展,形成一个逻辑集群;Prometheus提供多种语言的客户端SDK,这些SDK可以快速让应用程序纳入到Prometheus的监控当中。
(5)良好的可视化
Prometheus除了自带有Prometheus UI,Prometheus还提供了一个独立的基于Ruby On Rails的Dashboard解决方案Promdash。
另外最新的Grafana可视化工具也提供了完整的Proetheus支持,基于Prometheus提供的API还可以实现自己的监控可视化UI。

二、部署Prometheus

环境准备:

主机名IP地址安装组件
docker192.168.229.187nodeexporter、cadvisor、prometheus server、grafana
docker2192.168.229.40nodeexporter、cadvisor
docker3192.168.229.50nodeexporter、cadvisor

全部关闭防火墙,禁用selinux

[root@docker ~]# systemctl stop firewalld
[root@docker ~]# setenforce 0

需要部署的组件介绍

Prometheus Server:普罗米修斯的主服务器;

NodeEXporter:负责收集Host硬件信息和操作系统信息;

cAdvisor:负责收集Host上运行的容器信息;

Grafana:负责展示普罗米修斯监控界面;

(1)3台主机全部部署node-EXporter
部署node-EXporter,收集硬件和系统信息。

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

注意:这里使用了–net=host,这样Prometheus Server可以直接与Node-EXporter通信。
浏览器访问

192.168.229.187:9100
192.168.229.40:9100
192.168.229.50:9100

在这里插入图片描述
(2)3台主机全部部署cAdvisor
部署安装cAdvisor,收集节点容器信息。

[root@docker ~]# docker run -p 8080:8080 --name=cadvisor -v /:/rootfs:ro -v /var/run:/var/run/:rw -v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro --detach=true --net=host google/cadvisor

浏览器访问

192.168.229.187:8080
192.168.229.40:8080
192.168.229.50:8080

在这里插入图片描述
(3)在docker上部署Prometheus Server服务
在部署prometheus之前,需要对它的配置文件进行修改,所以先运行一个容器,先将其配置文件拷贝出来。

[root@docker ~]# docker run -d -p 9090:9090 --name prometheus --net=host prom/prometheus
[root@docker ~]# docker cp prometheus:/etc/prometheus/prometheus.yml ./
[root@docker ~]# vim prometheus.yml
    - targets: ['localhost:9090','localhost:9100','localhost:8080','192.168.229.40:9100','192.168.229.40:8080','192.168.229.50:9100','192.168.229.50:8080']
[root@docker ~]# docker rm -f prometheus
[root@docker ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus

注意:target处指定prometheus的监控主机项,包括它也会监控自己主机上的数据,然后重新运行prometheus容器。
浏览器访问:

192.168.229.187:9090

在这里插入图片描述
在这里插入图片描述
(4)在docker上部署grafana服务,用来展示prometheus收集到的数据

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

浏览器访问:

192.168.229.187:3000

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
grafana支持自定义显示信息,不过要自定义非常麻烦,还好grafana官方为我们提供了一些模板供我们使用。
grafana官网:

https://grafana.com/

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
关于模板的选择有两种方式导入:

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

第二种方式:可以直接通过模板的ID号(官网可以查看到ID号);

三、配置AlertManager

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

[root@docker ~]# mkdir alert
[root@docker ~]# cd alert
[root@docker alert]# docker run -d -p 9093:9093 --name alertmanager prom/alertmanager:latest
[root@docker alert]# docker cp alert:/etc/alertmanager/alertmanager.yml ./
[root@docker alert]# cp alertmanager.yml alertmanager.ymlbak

这里AlertManager默认启动的端口为9093,启动完成后,浏览器访问http://IP:9093 可以看到默认提供的UI页面,不过现在是没有任何告警信息的,因为还没有配置报警规则来触发报警。
URL:http://192.168.229.187:9093
AlertManager配置邮件告警
AlertManager默认配置文件为alertmanager.yml,在容器内路径为/etc/alertmanager/alertmanager.yml
主要配置的作用:

global:全局配置,包括报警解决后的超时时间、SMTP相关配置、各种渠道通知的API地址;

route:用来设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配;

receivers:配置告警消息接受者信息,例如常用的email、wechat、slack、webhook等消息通知方式;

inhibit_rules:抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标);

配置一下使用Email方式通知报警信息,这里以QQ邮箱为例,当然在配置QQ邮箱之前,需要我们登录QQ邮箱,打开SMTP服务,并获取授权码。
配置如下

[root@docker alert]# vim alertmanager.yml
global:
  resolve_timeout: 5m
  smtp_from: '1599840577@qq.com'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '1599840577@qq.com'
  smtp_auth_password: 'wnslyqzkpdtiiceg'
  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: '1599840577@qq.com'
    send_resolved: true
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

注意:以上模板中涉及的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@docker ~]# docker rm -f alertmanager
[root@docker ~]# docker run -d --name alertmanager -p 9093:9093 -v /root/alert/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager

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

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

注意:该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@docker ~]# vim prometheus.yml
...
    - targets:
      - 192.168.229.187:9093
      # - alertmanager:9093
rule_files:
  - "/usr/local/prometheus/rules/*.rules"
  # - "first_rules.yml"
  # - "second_rules.yml"
...

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

[root@docker01 ~]# docker rm -f prometheus
[root@docker01 ~]# 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主页上可以看到相应规则。
触发报警发送Email
然后开始模拟docker01节点exporter组件失败,邮箱会收到报警信息。
AlertManager配置自定义邮件模板
看到上边默认发送的邮件模板,虽然所有核心的信息已经包含了,但是邮件格式内容可以更优雅直观一些,AlertManager也是支持自定义邮件模板配置的,首先新建一个模板文件email.tmpl。

[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" }}1599840577@qq.com{{ end }}
{{ define "email.to" }}1599840577@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 "2006-01-02 15:04:05" }} <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@docker ~]# cd alert/
[root@docker alert]# vim alertmanager.yml
添加:
templates:
  - '/etc/alertmanager-tmpl/*.tmpl'
...
  email_configs:
  - to: '{{ template "email.to" }}'
    html: '{{ template "email.to.html" . }}'

然后修改AlertManager启动命令,将本地email.tmpl文件挂载到容器内指定位置并重启。

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

重启完毕后,同样模拟触发报警条件(停止node-exporter服务),也是可以正常发送模板邮件出来的,这次就是我们想要的风格啦!
以上模板是没有问题的,但会看到,时间不对,这是因为邮件是全球服务,所以我们需要更改一下语句,在时间上加上东八区时间。修改如下:

...
10 告警主题: {{ .Annotations.summary }}<br>
11 触发时间: {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }} <br> 
...

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

[root@docker alertmanager-tmpl]# docker restart alertmanager
©️2020 CSDN 皮肤主题: 创作都市 设计师:CSDN官方博客 返回首页