alertmanager告警配置

介绍

         前篇文章做了kubernetes 的 监控,基于prometheus与grafana部署,监控是做好了,但是还缺乏告警机制,没有告警机制监控就白做了,prometheus的告警就是alertmanager来做。 而在部署kube-prometheus的时候,alertmanager也是部署完成,这里只需要稍加修改alertmanager即可实现告警

配置 alertmanager

        打开之前部署prometheus与grafana部署,里面有alertmanager的地址http://alertmanager.xxlaila.cn/,打开界面点击 Status 按钮我们可以查看到alertmanager的默认配置。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
global:
resolve_timeout: 5m
http_config: {}
smtp_hello: localhost
smtp_require_tls: true
pagerduty_url: https://events.pagerduty.com/v2/enqueue
hipchat_api_url: https://api.hipchat.com/
opsgenie_api_url: https://api.opsgenie.com/
wechat_api_url: https://qyapi.weixin.qq.com/cgi-bin/
victorops_api_url: https://alert.victorops.com/integrations/generic/20131114/alert/
route:
receiver: "null"
group_by:
- job
routes:
- receiver: "null"
match:
alertname: Watchdog
group_wait: 30s
group_interval: 5m
repeat_interval: 12h
receivers:
- name: "null"
templates: []

        这个默认配置是alertmanager目录下alertmanager-secret.yaml文件生成的,这个配置文件是通过base64加密过的,可以使用base64解密查看

  • 原alertmanager-secret.yaml

    1
    2
    3
    4
    5
    6
    7
    8
    apiVersion: 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
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
global:
resolve_timeout: 5m
smtp_smarthost: 'smtp.exmail.qq.com:465'
smtp_from: 'admin@admin.com'
smtp_auth_username: 'admin@admin.com'
smtp_auth_password: '123456'
smtp_require_tls: true
hipchat_api_url: 'https://hipchat.foobar.org/'
wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' # 企业微信地址
wechat_api_secret: 'KJfj93rijk903240i--234jsnjkhf23sjkfjsfsd' # 企业微信Secret
wechat_api_corp_id: 'wwa98457kdsnfk8' # 企业微信CorpId
templates:
- '*.tmpl'
route:
group_by: ['alertname']
group_wait: 30s
group_interval: 5m
repeat_interval: 1h
receiver: default
routes:
- receiver: 'wechat'
continue: true
inhibit_rules:
- source_match:
receivers:
- name: 'default'
email_configs:
- to: 'hahah@admin.com'
send_resolved: true
- name: 'wechat'
wechat_configs:
- send_resolved: true
corp_id: 'wwa98457kdsnfk8' # 企业微信CorpId
to_user: '@all' # 接受人,都是all
to_party: '' # 接收组的id
message: '{{ template "wechat.default.message" . }}' # 发送消息的模版
agent_id: '1000021' # 企业微信自定义应用的id

参数

  • 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
2
3
4
5
6
7
8
9
10
11
# cat alertmanager-secret.yaml 
apiVersion: v1
data:
alertmanager.yaml: bash64
template_1.tmpl: bash64
template_2.tmpl: bash64
kind: Secret
metadata:
name: alertmanager-main
namespace: monitoring
type: Opaque

        这种创建比较麻烦,每次修改文件都要去生成一次。不方便。所以可以使用以下方式,简单快捷。

1
# kubectl create secret generic alertmanager-main --from-file=alertmanager.yaml,wechat.default.message.tmpl -n monitoring

        部署完成以后,Secret 对象将会挂载到 AlertManager 对象创建的 AlertManager Pod 中去。等一小会就企业微信就可以收到告警信息

验证

alertmanager web界面的config信息会发生变化

img
img

企业微信

img

坚持原创技术分享,您的支持将鼓励我继续创作!
0%