Prometheus-AlertManager 配置文件介绍
Prometheus监控可以通过grafana将数据优美的展示出来,但是IT监控最主要的还是告警;如果出现故障运维人员需要第一时间能够收到告警才可以;prometheus有一个组件alertmanager来实现告警。
Alertmanager组件负责处理由Prometheus等服务发来的警报,之后需要删除重复、分组,并将它们通过路由发送到正确的接收器,比如电子邮件、Slack等。Alertmanager还支持沉默和警报抑制的机制。
一、概念解释
1.1、分组(group_by)
分组是指当出现问题时,Alertmanager会收到一个单一的通知,而当系统宕机时,很有可能成百上千的警报会同时生成,这种机制在较大的中断中特别有用。
例如,当数十或数百个服务的实例在运行,网络发生故障时,有可能服务实例的一半不可达数据库。在告警规则中配置为每一个服务实例都发送警报的话,那么结果是数百警报被发送至Alertmanager。
但是作为用户只想看到单一的报警页面,同时仍然能够清楚的看到哪些实例受到影响,因此,人们通过配置Alertmanager将警报分组打包,并发送一个相对看起来紧凑的通知。
分组警报、警报时间,以及接收警报的receiver是在配置文件中通过路由树配置的。
1.2、抑制(inhibit_rules)
抑制是指当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。
例如,当警报被触发,通知整个集群不可达,可以配置Alertmanager忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。
抑制机制可以通过Alertmanager的配置文件来配置
1.3、沉默(Silences)
沉默是一种简单的特定时间静音提醒的机制。一种沉默是通过匹配器来配置,就像路由树一样。传入的警报会匹配RE,如果匹配,将不会为此警报发送通知。
沉默机制可以通过Alertmanager的Web页面进行配置。
1.4、路由(route)
路由块定义了路由树及其子节点。如果没有设置的话,子节点的可选配置参数从其父节点继承。
每个警报进入配置的路由树的顶级路径,顶级路径必须匹配所有警报(即没有任何形式的匹配)。然后匹配子节点。如果continue的值设置为false,它在匹配第一个孩子后就停止;如果在子节点匹配,continue的值为true,警报将继续进行后续兄弟姐妹的匹配。如果警报不匹配任何节点的任何子节点(没有匹配的子节点,或不存在),该警报基于当前节点的配置处理。
1.5、接收器 (receiver)
顾名思义,警报接收的配置。比如邮件配置和企业微信配置等
1.6、Alert 的三种状态
- pending:警报被激活,但是低于配置的持续时间。这里的持续时间即rule里的FOR字段设置的时间。改状态下不发送报警。
- ffiring:警报已被激活,而且超出设置的持续时间。该状态下发送报警。
- finactive:既不是pending也不是firing的时候状态变为inactive。
二、基于Kubernetes 配置AlertManager 服务
2.1、AlertManager 配置文件的ConfigMap
[root@master-01 altermanager]# cat altermanager-configmap.yaml
kind: ConfigMap
apiVersion: v1
metadata:
name: alertmanager-config
namespace: kube-system
data:
config.yml: |-
global:
resolve_timeout: 5m #当Alertmanager持续多长时间未接收到告警,标记告警状态为resolved
smtp_smarthost: 'smtp.exmail.qq.com:25' #需要填写端口,否则报错
smtp_from: 'sa@cn-blogs.cn'
smtp_auth_username: 'sa@cn-blogs.cn'
smtp_auth_password: 'cn-blogs.cn'
smtp_require_tls: false #禁止TLS证书检查
templates:
- '/usr/local/prometheus/alertmanager/template/default.tmpl'
route:
receiver: 'alert-emailer' #定义默认第一个报警接受者
group_by: ['alertname','priority'] #分组
group_wait: 10s #发送一组新的警报的初始等待时间,也就是初次发警报的延时
group_interval: 5m #初始警报组如果已经发送,需要等待多长时间再发送同组新产生的其他报警
repeat_interval: 30m #如果警报已经成功发送,间隔多长时间再重复发送
routes:
- receiver: email
group_wait: 10s
match: #这里定义了匹配的标签,
#需要和prometheus里面的规则文件的标签一致,
#也就是有team: node标签的告警,通过邮件来告警,
#如果有team: node2标签的通过钉钉来告警
team: node
- receiver: dingding
group_wait: 10s
match:
team: node2
receivers:
- name: 'dingding'
webhook_configs:
- url: 'http://prometheus-webhook-dingtalk:8060/dingtalk/dingding/send'
#钉钉机器人的地址
- name: 'alert-emailer'
email_configs:
- to: admin1@cn-blogs.cn
send_resolved: true
- name: email
email_configs:
- to: 'admin2@cn-blogs.cn
send_resolved: true
2.2、AlertManager 发送报警的模板格式
[root@master-01 altermanager]# cat altermanager-template-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
creationTimestamp: null
name: alertmanager-templates
namespace: kube-system
data:
default.tmpl: |
{{ define "wechat.default.message" }}
{{ range .Alerts }}
========start==========
告警程序:prometheus_alert
告警级别:{{ .Labels.severity }}
告警类型:{{ .Labels.alertname }}
故障主机: {{ .Labels.instance }}
告警主题: {{ .Annotations.summary }}
告警详情: {{ .Annotations.description }}
触发时间: {{ .StartsAt.Format "2006-01-02 15:04:05" }}
========end==========
{{ end }}
{{ end }}
2.3、AlertManager 持久化存储
[root@master-01 altermanager]# cat altermanager-pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: alertmanager
namespace: kube-system
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
2.4、AlertManager 的Deployment
[root@master-01 altermanager]# cat altermanager-Deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: alertmanager
namespace: kube-system
spec:
replicas: 1
selector:
matchLabels:
app: alertmanager
template:
metadata:
name: alertmanager
labels:
app: alertmanager
spec:
containers:
- name: alertmanager
image: prom/alertmanager:latest
args:
- "--config.file=/etc/alertmanager/config.yml"
- "--storage.path=/alertmanager"
ports:
- name: alertmanager
containerPort: 9093
volumeMounts:
- name: config-volume #挂载配置文件
mountPath: /etc/alertmanager
- name: alertmanager
mountPath: /alertmanager
- name: alertmanager-templates #挂载模板文件
mountPath: /usr/local/prometheus/alertmanager/template/
volumes:
- name: config-volume
configMap:
name: alertmanager-config
- name: alertmanager-templates
configMap:
name: alertmanager-templates
- name: alertmanager
persistentVolumeClaim:
claimName: alertmanager
2.5、AlertManager 的Service
[root@master-01 altermanager]# cat alertmanager-Service.yaml
apiVersion: v1
kind: Service
metadata:
name: alertmanager
namespace: kube-system
annotations:
prometheus.io/scrape: 'true'
prometheus.io/path: /
prometheus.io/port: '8080'
spec:
selector:
app: alertmanager
type: NodePort
ports:
- port: 9093
targetPort: 9093
nodePort: 31000
2.6、AlertManager 的Ingress
[root@master-01 altermanager]# cat altermanager-ing.yaml
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: altermanager
namespace: kube-system
spec:
rules:
- host: k8s.altermanager.test.site
http:
paths:
- path: /
backend:
serviceName: alertmanager
servicePort: 9093