基于Prometheus的全方位监控平台--告警平台(Alertmanager)部署管理一、AlertManager简介1.1、AlertManager 常用的功能1.2、Prometheus 和 AlertManager 的关系二、部署搭建Alertmanager2.1、创建AlertManager数据的存储PVC资源 alertmanager-storage.yaml
2.2、创建AlertManager配置文件ConfigMap(邮件方式)2.3、创建AlertManager部署文件 alertmanager-deploy.yaml
2.4、创建AlertManager外部服务暴露 alertmanager-ingress.yaml
三、AlertManager的三个核心概念3.1、分组3.2、抑制3.3、静默四、Prometheus添加告警配置五、总结
alertmanager-storage.yaml
xxxxxxxxxx
apiVersion v1
kind PersistentVolumeClaim
metadata
name alertmanager-pvc
namespace monitor
spec
accessModes
ReadWriteMany
storageClassName"nfs-storage"
resources
requests
storage 5Gi
xxxxxxxxxx
apiVersion v1
kind ConfigMap
metadata
name alertmanager-config
namespace monitor
data
alertmanager.yml -
global
resolve_timeout 1m
smtp_smarthost'smtp.exmail.qq.com:465' # 邮箱服务器的SMTP主机配置
smtp_from'zhdya@zhdya.cn' # 发送邮件主题
smtp_auth_username'zhdya@zhdya.cn' # 登录用户名
smtp_auth_password'XXXyfXBjd6J73DwYTjn' # 此处的auth password是邮箱的第三方登录授权密码,而非用户密码
smtp_require_tls false # 有些邮箱需要开启此配置,这里使用的是企微邮箱,仅做测试,不需要开启此功能。
templates
'/etc/alertmanager/*.tmpl'
route
group_by'env''instance''type''group''job''alertname''cluster' # 报警分组
group_wait 5s # 在组内等待所配置的时间,如果同组内,5秒内出现相同报警,在一个组内出现。
group_interval 1m # 如果组内内容不变化,合并为一条警报信息,2m后发送。
repeat_interval 2m # 发送报警间隔,如果指定时间内没有修复,则重新发送报警。
receiver'email'
routes
receiver'devops'
match
severity critical22
group_wait 5s
group_interval 5m
repeat_interval 30m
receivers
name'email'
email_configs
to'zhdya@qq.com'
send_resolvedtrue
html'{{ template "email.to.html" . }}'
name'devops'
email_configs
to'zhdyaa@163.com,10000@qq.com'
send_resolvedtrue
html'{{ template "email.to.html" . }}'
inhibit_rules# 抑制规则
source_match# 源标签警报触发时抑制含有目标标签的警报,在当前警报匹配 servrity: 'critical'
severity'critical'
target_match
severity'warning' # 目标标签值正则匹配,可以是正则表达式如: ".*MySQL.*"
equal'alertname' 'dev' 'instance' # 确保这个配置下的标签内容相同才会抑制,也就是说警报中必须有这三个标签值才会被抑制。
wechat.tmpl -
"wechat.default.message" define
- if gt (len .Alerts.Firing) 0 -
- range $index $alert := .Alerts -
- if eq $index 0
========= 监控报警 =========
告警状态: .Status
告警级别: .Labels.severity
告警类型: $alert.Labels.alertname
故障主机 $alert.Labels.instance
告警主题 $alert.Annotations.summary
告警详情 $alert.Annotations.message $alert.Annotations.description ;
触发阀值: .Annotations.value
故障时间 ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"
========= = end = =========
- end
- end
- end
- if gt (len .Alerts.Resolved) 0 -
- range $index $alert := .Alerts -
- if eq $index 0
========= 告警恢复 =========
告警类型: .Labels.alertname
告警状态: .Status
告警主题 $alert.Annotations.summary
告警详情 $alert.Annotations.message $alert.Annotations.description ;
故障时间 ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05"
恢复时间 ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05"
- if gt (len $alert.Labels.instance) 0
实例信息 $alert.Labels.instance
- end
========= = end = =========
- end
- end
- end
- end
email.tmpl -
"email.from" xxx.com end define
"email.to" xxx.com end define
"email.to.html" define
- if gt (len .Alerts.Firing) 0 -
range .Alerts
========= 监控报警 =========<br>
告警程序 prometheus_alert <br>
告警级别 .Labels.severity <br>
告警类型 .Labels.alertname <br>
告警主机 .Labels.instance <br>
告警主题 .Annotations.summary <br>
告警详情 .Annotations.description <br>
触发时间 .StartsAt.Format "2006-01-02 15:04:05" <br>
========= = end = =========<br>
end end -
- if gt (len .Alerts.Resolved) 0 -
range .Alerts
========= 告警恢复 =========<br>
告警程序 prometheus_alert <br>
告警级别 .Labels.severity <br>
告警类型 .Labels.alertname <br>
告警主机 .Labels.instance <br>
告警主题 .Annotations.summary <br>
告警详情 .Annotations.description <br>
触发时间 .StartsAt.Format "2006-01-02 15:04:05" <br>
恢复时间 .EndsAt.Format "2006-01-02 15:04:05" <br>
========= = end = =========<br>
end end -
- end
参数说明:
xxxxxxxxxx
global
resolve_timeout 5m ##超时,默认5min
smtp_smarthost'smtp.exmail.qq.com:25'
smtp_from'xxxxxxx'
smtp_auth_username'xxxx'
smtp_auth_password'123'
smtp_require_tlsfalse
templates##告警模板(可定义多个)
'/etc/alertmanager/*.tmpl'
##route:用来设置报警的分发策略。Prometheus的告警先是到达alertmanager的根路由(route),alertmanager的根路由不能包含任何匹配项,因为根路由是所有告警的入口点
##另外,根路由需要配置一个接收器(receiver),用来处理那些没有匹配到任何子路由的告警(如果没有配置子路由,则全部由根路由发送告警),即缺省
##接收器。告警进入到根route后开始遍历子route节点,如果匹配到,则将告警发送到该子route定义的receiver中,然后就停止匹配了。因为在route中
##continue默认为false,如果continue为true,则告警会继续进行后续子route匹配。如果当前告警仍匹配不到任何的子route,则该告警将从其上一级(
##匹配)route或者根route发出(按最后匹配到的规则发出邮件)。查看你的告警路由树,https://www.prometheus.io/webtools/alerting/routing-tree-editor/,
##将alertmanager.yml配置文件复制到对话框,然后点击"Draw Routing Tree"
route
group_by'env''instance''type''group''job''alertname''cluster' ##用于分组聚合,对告警通知按标签(label)进行分组,将具有相同标签或相同告警名称(alertname)的告警通知聚合在一个组,然后作为一个通知发送。如果想完全禁用聚合,可以设置为group_by: [...]
group_wait 10s ##当一个新的告警组被创建时,需要等待'group_wait'后才发送初始通知。这样可以确保在发送等待前能聚合更多具有相同标签的告警,最后合并为一个通知发送
group_interval 2m ##当第一次告警通知发出后,在新的评估周期内又收到了该分组最新的告警,则需等待'group_interval'时间后,开始发送为该组触发的新告警,可以简单理解为,group就相当于一个通道(channel)
repeat_interval 10m ##告警通知成功发送后,若问题一直未恢复,需再次重复发送的间隔(根据实际情况来调整)
receiver'email' ##配置告警消息接收者,与下面配置的对应,例如常用的 email、wechat、slack、webhook 等消息通知方式。
routes##子路由
receiver'wechat'
match##通过标签去匹配这次告警是否符合这个路由节点;也可以使用match_re进行正则匹配
severity error ##标签severity为error时满足条件使用wechat警报
continue true ##匹配到这个路由后是否继续匹配,默认flase
receivers##配置报警信息接收者信息
name'email' ##警报接收者名称
email_configs
to'xxxxxx' ##接收警报的email(可引用模板文件中定义的变量),可定义多个
## html: '{{ template "email.to.html" .}}' ##发送邮件的内容(调用模板文件中的)
helo'alertmanager.com' #alertmanager的地址
send_resolved true #故障恢复后通知
name'wechat'
wechat_configs
corp_id xxxxxxxxx ##企业信息
to_user'@all' ##发送给企业微信用户的ID,这里是所有人
agent_id xxxxx ##企业微信AgentId
api_secret xxxxxxxxx ##企业微信Secret
## message: '{{ template "wechat.default.message" .}}' ##发送内容(调用模板里面的微信模板)
send_resolved true ##故障恢复后通知
inhibit_rules##抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)
source_match
severity'critical'
target_match
severity'warning'
equal'alertname' 'dev' 'instance'
alertmanager-deploy.yaml
xxxxxxxxxx
apiVersion v1
kind Service
metadata
name alertmanager
namespace monitor
labels
k8s-app alertmanager
spec
type ClusterIP
ports
name http
port9093
targetPort9093
selector
k8s-app alertmanager
---
apiVersion apps/v1
kind Deployment
metadata
name alertmanager
namespace monitor
labels
k8s-app alertmanager
spec
replicas1
selector
matchLabels
k8s-app alertmanager
template
metadata
labels
k8s-app alertmanager
spec
containers
name alertmanager
image prom/alertmanager v0.24.0
imagePullPolicy IfNotPresent
ports
name http
containerPort9093
args
## 指定容器中AlertManager配置文件存放地址 (Docker容器中的绝对位置)
"--config.file=/etc/alertmanager/alertmanager.yml"
## 指定AlertManager管理界面地址,用于在发生的告警信息中,附加AlertManager告警信息页面地址
"--web.external-url=https://alertmanager.kubernets.cn"
## 指定监听的地址及端口
'--cluster.advertise-address=0.0.0.0:9093'
## 指定数据存储位置 (Docker容器中的绝对位置)
"--storage.path=/alertmanager"
resources
limits
cpu 1000m
memory 512Mi
requests
cpu 1000m
memory 512Mi
readinessProbe
httpGet
path /-/ready
port9093
initialDelaySeconds5
timeoutSeconds10
livenessProbe
httpGet
path /-/healthy
port9093
initialDelaySeconds30
timeoutSeconds30
volumeMounts
name data
mountPath /alertmanager
name config
mountPath /etc/alertmanager
name configmap-reload
image jimmidyson/configmap-reload v0.7.1
args
"--volume-dir=/etc/config"
"--webhook-url=http://localhost:9093/-/reload"
resources
limits
cpu 100m
memory 100Mi
requests
cpu 100m
memory 100Mi
volumeMounts
name config
mountPath /etc/config
readOnlytrue
volumes
name data
persistentVolumeClaim
claimName alertmanager-pvc
name config
configMap
name alertmanager-config
alertmanager-ingress.yaml
xxxxxxxxxx
apiVersion networking.k8s.io/v1
kind Ingress
metadata
namespace monitor
name alertmanager-ingress
spec
ingressClassName nginx
rules
host alertmanager.kubernets.cn
http
paths
pathType Prefix
backend
service
name alertmanager
port
number9093
path /
访问验证:
xxxxxxxxxx
$ curl http://alertmanager.kubernets.cn
被触发的警报合并为一个警报进行通知,避免瞬间突发性的接受大量警报通知,使得管理员无法对问题进行快速定位。
场景:
在Kubernetes集群中,运行着重量级规模的实例,即便是集群中持续很小一段时间的网络延迟或者延迟导致网络抖动,也会引发大量类似服务应用无法连接 DB
的故障。如果在警报规则中定义每一个应用实例都发送警报,那么到最后的结果就是会有大量的警报信息通过Alertmanager发送给咱们的运维及研发小伙伴。
Inhibition
是 当某条警报已经发送,停止重复发送由此警报引发的其他异常或故障的警报机制。
场景:
在我们的灾备体系中,当原有集群故障宕机业务彻底无法访问的时候,会把用户流量切换到备份集群中,这样为故障集群及其提供的各个微服务状态发送警报机会失去了意义,此时, Alertmanager 的抑制特性就可以在一定程度上避免管理员收到过多无用的警报通知。
Silences
提供了一个简单的机制,根据标签快速对警报进行静默处理;对传进来的警报进行匹配检查,如果接受到警报符合静默的配置,Alertmanager 则不会发送警报通知。
场景:
修改ConfigMap资源文件prometheus-config.yaml,改动内容如下:
修改 prometheus-config.yaml
xxxxxxxxxx
apiVersion v1
kind ConfigMap
metadata
name prometheus-config
namespace monitoring
data
prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
external_labels:
cluster: "kubernetes"
############ 添加配置 Aertmanager 服务器地址 ###################
alerting:
alertmanagers:
- static_configs:
- targets: ["alertmanager:9093"]
############ 指定告警规则文件路径位置 ###################
rule_files
/etc/prometheus/*-rule.yml
按上面方法重载 Prometheus,打开 Prometheus 的 Target 页面,就会看到 上面定义的 mysql-exporter
任务
xxxxxxxxxx
curl -XPOST http://prometheus.kubernets.cn/-/reload
Prometheus UI查看配置和告警规则是否生效
告警规则是否生效:
xxxxxxxxxx
$ curl -XPOST -H 'Content-Type: application/json' http://alertmanager.kubernets.cn/api/v1/alerts -d '[{"labels":{"severity":"critical22"},"annotations":{"summary":"This is a test alert"}}]'