介绍
前篇文章做了kubernetes 的 监控,基于prometheus与grafana部署,监控是做好了,但是还缺乏告警机制,没有告警机制监控就白做了,prometheus的告警就是alertmanager来做。 而在部署kube-prometheus的时候,alertmanager也是部署完成,这里只需要稍加修改alertmanager即可实现告警
配置 alertmanager
打开之前部署prometheus与grafana部署,里面有alertmanager的地址http://alertmanager.xxlaila.cn/
,打开界面点击 Status
按钮我们可以查看到alertmanager的默认配置。
1 | global: |
这个默认配置是alertmanager目录下alertmanager-secret.yaml
文件生成的,这个配置文件是通过base64加密过的,可以使用base64解密查看
原alertmanager-secret.yaml
1
2
3
4
5
6
7
8apiVersion: v1
data:
alertmanager.yaml: Imdsb2JhbCI6CiAgInJlc29sdmVfdGltZW91dCI6ICI1bSIKInJlY2VpdmVycyI6Ci0gIm5hbWUiOiAibnVsbCIKInJvdXRlIjoKICAiZ3JvdXBfYnkiOgogIC0gImpvYiIKICAiZ3JvdXBfaW50ZXJ2YWwiOiAiNW0iCiAgImdyb3VwX3dhaXQiOiAiMzBzIgogICJyZWNlaXZlciI6ICJudWxsIgogICJyZXBlYXRfaW50ZXJ2YWwiOiAiMTJoIgogICJyb3V0ZXMiOgogIC0gIm1hdGNoIjoKICAgICAgImFsZXJ0bmFtZSI6ICJXYXRjaGRvZyIKICAgICJyZWNlaXZlciI6ICJudWxsIg==
kind: Secret
metadata:
name: alertmanager-main
namespace: monitoring
type: Opaque解密alertmanager-secret.yaml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16# echo "Imdsb2JhbCI6CiAgInJlc29sdmVfdGltZW91dCI6ICI1bSIKInJlY2VpdmVycyI6Ci0gIm5hbWUiOiAibnVsbCIKInJvdXRlIjoKICAiZ3JvdXBfYnkiOgogIC0gImpvYiIKICAiZ3JvdXBfaW50ZXJ2YWwiOiAiNW0iCiAgImdyb3VwX3dhaXQiOiAiMzBzIgogICJyZWNlaXZlciI6ICJudWxsIgogICJyZXBlYXRfaW50ZXJ2YWwiOiAiMTJoIgogICJyb3V0ZXMiOgogIC0gIm1hdGNoIjoKICAgICAgImFsZXJ0bmFtZSI6ICJXYXRjaGRvZyIKICAgICJyZWNlaXZlciI6ICJudWxsIg==" |base64 -d
"global":
"resolve_timeout": "5m"
"receivers":
- "name": "null"
"route":
"group_by":
- "job"
"group_interval": "5m"
"group_wait": "30s"
"receiver": "null"
"repeat_interval": "12h"
"routes":
- "match":
"alertname": "Watchdog"
"receiver": "null"
配置的结构差不多是一致的,内容嘛都是默认的。这里我们要实现自己的通知,就需要改改啦,这里我使用了企业微信来进行告警,企业微信申请参考。这里我们要新建一个alertmanager.yaml 文件,这个文件名不能随便命名,可以看到alertmanager-secret.yaml是这么定义的。也可以在kubernetes的dashbord界面看到alertmanager 的安装参数也是这个。可以进入容器看到这个文件,默认路径在/etc/alertmanager/config/alertmanager.yaml。
新建alertmanager.yaml
1 | global: |
参数:
- global: 全局配置。定义一些全局的公共参数,如全局的SMTP配置,企业微信,钉钉,这里配置了企业邮箱和企业微信。
- templates: 模版。定义告警通知时的模板,如邮件模板、企业微信告警模版。
- route: 告警路由。根据标签匹配,确定当前告警应该如何处理。
- receivers: 接收人,可以是一个邮箱也可以是企业微信,也可以是一个webhook,这里我配置的企业微信的运维部门。是一个抽象的东西。
- inhibit_rules: 抑制规则。设置合理的抑制规则可以减少垃圾告警的产生
这里要定义一个默认的接受方式- name: 'default'
,否则会出错误。错误如下:
1 | level=error ts=2019-12-06T08:36:25.005Z caller=coordinator.go:124 component=configuration msg="Loading configuration file failed" file=/etc/alertmanager/config/alertmanager.yaml err="root route must specify a default receiver" |
.tmpl模板的配置
- wechat.default.message.tmpl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44# cat > wechat.default.message.tmpl <<EOF
{{ define "wechat.default.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
=====================
{{- end }}
===告警详情===
告警详情: {{ $alert.Annotations.message }}
故障时间: {{ $alert.StartsAt.Format "2019-11-06 17:01:01" }}
===参考信息===
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }}{{- end }}
=====================
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
告警类型: {{ $alert.Labels.alertname }}
告警级别: {{ $alert.Labels.severity }}
=====================
{{- end }}
===告警详情===
告警详情: {{ $alert.Annotations.message }}
故障时间: {{ $alert.StartsAt.Format "2019-11-06 17:01:01" }}
恢复时间: {{ $alert.EndsAt.Format "2019-11-06 17:01:01" }}
===参考信息===
{{ if gt (len $alert.Labels.instance) 0 -}}故障实例ip: {{ $alert.Labels.instance }};{{- end -}}
{{- if gt (len $alert.Labels.namespace) 0 -}}故障实例所在namespace: {{ $alert.Labels.namespace }};{{- end -}}
{{- if gt (len $alert.Labels.node) 0 -}}故障物理机ip: {{ $alert.Labels.node }};{{- end -}}
{{- if gt (len $alert.Labels.pod_name) 0 -}}故障pod名称: {{ $alert.Labels.pod_name }};{{- end }}
=====================
{{- end }}
{{- end }}
{{- end }}
EOF
建立alertmanager-main
删除原有的配置项
1 | # kubectl delete secret alertmanager-main -n monitoring |
部署alertmanager secret
重新部署alertmanager secret有两种方式,第一种是把建立好的alertmanager.yaml 通过base64加密以后覆盖之前文件的base64内容,wechat.default.message.tmpl模版文件也是一样。整体格式如下
1 | # cat alertmanager-secret.yaml |
这种创建比较麻烦,每次修改文件都要去生成一次。不方便。所以可以使用以下方式,简单快捷。
1 | # kubectl create secret generic alertmanager-main --from-file=alertmanager.yaml,wechat.default.message.tmpl -n monitoring |
部署完成以后,Secret 对象将会挂载到 AlertManager 对象创建的 AlertManager Pod 中去。等一小会就企业微信就可以收到告警信息