一、前言

alertmanage调用企业微信应用告警会比直接使用钉钉告警更麻烦一点,调用企业微信应用告警需要在应用内配置企业可信ip,不然调用企业微信接口就会报错,提示ip地址有风险

二、部署

先自行创建企业微信,再使用管理后台创建应用

记录下agentid和secret值,后面配置调用企业微信告警会用到

往下找到企业可信ip,先按时提示验证企业

会提示让你输入域名,然后给出一个txt文件,需要使用nginx挂载这个txt文件到域名上,要使用该域名访问到该路径,就可以通过验证

只需在该域名的nginx代理中加入一下该配置项,匹配txt结尾的请求,到该root路径下,将txt文件放到该root路径下即可,重新加载nginx配置,就可以去验证企业可信ip了

查看企业微信的企业id

部署alertmanage

创建存放yaml配置的目录

mkdir /opt/alertmanage && cd/opt/alertmanage

编辑alertmanage配置文件,使用configmap服务挂载

vi configmap.yaml

kind: ConfigMapapiVersion: v1metadata:name: alertmanagernamespace: prometheusdata:alertmanager.yml: |-global:resolve_timeout: 1msmtp_smarthost: 'smtp.qq.com:25' #配置告警邮箱服务器smtp_from: '123456@qq.com'#告警发送到的邮箱smtp_auth_username: '123456@qq.com'smtp_auth_password: 'ioasdgxvovclbsfb' #授权码,在邮箱里面获取smtp_require_tls: falsewechat_api_url: "https://qyapi.weixin.qq.com/cgi-bin/"#企业微信的api接口,统一固定的wechat_api_corp_id: "ww7490f1231244252" #上面获取的企业微信中的企业idtemplates:- '/etc/alertmanager/template/*.tmpl' #使用告警模板route:group_by: ['alertname_wechat']group_wait: 30s#告警等待发送时间group_interval: 5mrepeat_interval: 15m #重复告警的再次发送时间receiver: wechat #调用的告警组件,下面配置的组件名称receivers:- name: 'wechat'wechat_configs:- send_resolved: truecorp_id: ww7490f1231244252#上面获取的企业微信中的企业idto_user: '@all' #发送给所有人agent_id: 1000002 #上面获取的企业微信应用中的agentidapi_secret: J6WJQ7QXEY5zodi12342352342#上面获取的企业微信应用中的secret

编辑alertmanage使用的告警模板,使用configmap服务挂载

viconfigmap-wechat.yaml

apiVersion: v1 data:WeChat.tmpl: |- #配置告警消息模板文件{{ define "wechat.default.message" }}{{- if gt (len .Alerts.Firing) 0 -}} #判断是告警信息还是异常恢复信息,是告警则继续往下执行,不是则不往下执行{{- range $index, $alert := .Alerts -}} #循环输出多个告警信息{{- if eq $index 0 -}}#判断是否输出完毕{{- end }}#对应第一个判断=========莓族环境监控报警 =========告警类型: {{ $alert.Labels.alertname }}告警级别: {{ $alert.Labels.severity }}故障主机: {{ $alert.Labels.instance }}告警主题: {{ $alert.Annotations.summary }}告警详情: {{ $alert.Annotations.description }}触发阀值:{{ $alert.Annotations.value }}故障时间: {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}{{ if gt (len $alert.Labels.instance) 0 -}}故障实例: {{ $alert.Labels.instance }}{{- end -}}{{- end }} #对应循环输出告警信息{{- end }} #对应最后一个判断========= = end =========={{- if gt (len .Alerts.Resolved) 0 -}}#判断是告警信息还是异常恢复信息{{- range $index, $alert := .Alerts.Resolved -}}#循环输出多个异常恢复信息{{- if eq $index 0 -}}#判断是否输出完毕{{- end }} #对应第一个判断=========莓族环境异常恢复 =========恢复类型: {{ $alert.Labels.alertname }}恢复级别: {{ $alert.Labels.severity }}系统环境: {{ $alert.Labels.environment }}恢复主题: {{ $alert.Annotations.summary }}告警详情: {{ $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 }} #整个流程结束kind: ConfigMapmetadata:name: wechatnamespace: prometheus

以上的变量取值都来自于配置的prometheus告警配置和alertmanage的值

编辑部署alertmanage服务的deployment的yaml

apiVersion: apps/v1kind: Deploymentmetadata:name: alertmanagernamespace: prometheuslabels:app: alertmanagerspec:replicas: 1selector:matchLabels:app: alertmanagertemplate:metadata:labels:app: alertmanagerspec:containers:- name: alertmanagerimage: "prom/alertmanager"imagePullPolicy: "IfNotPresent"args:- "--config.file=/etc/alertmanager/alertmanager.yml"ports:- containerPort: 9093readinessProbe:httpGet:path: /#/statusport: 9093initialDelaySeconds: 30timeoutSeconds: 30volumeMounts:- name: config-volume #挂载配置文件mountPath: /etc/alertmanager- name: wechat-tmpl#挂载告警规则模板mountPath: /etc/alertmanager/template- name: tz-configmountPath: /etc/localtimeresources:limits:cpu: 10mmemory: 50Mirequests:cpu: 10mmemory: 50Mivolumes:- name: config-volume#使用配置文件的configmapconfigMap:name: alertmanager- name: wechat-tmpl #使用规则模板的configmapconfigMap:name: wechat- name: tz-confighostPath:path: /usr/share/zoneinfo/Asia/Shanghai

编辑alertmanage服务对外访问的service的yaml

vi service.yaml

apiVersion: v1kind: Servicemetadata:name: svc-alertmanagernamespace: prometheusspec:type: NodePortports:- port: 9093protocol: TCPtargetPort: 9093nodePort: 30011selector:app: alertmanager

创建命名空间

kubectl create namespace prometheus

创建所有yaml服务

kubectl apply -fconfigmap-wechat.yaml

kubectl apply -fconfigmap.yaml

kubectl apply -f deployment.yaml

kubectl apply -fservice.yaml

查看服务是否正常

kubectl get pod -n prometheus

可以看到alertmanage服务正常运行,但是查看日志就会发现调用企业微信的应用接口报错,这是因为还没有在企业微信应用里配置企业可信ip

kubectl logs -f –tail=10 alertmanager-6b89d8cd4-mnx5m -n prometheus

上面给出的报错ip地址就是你现在所用的公网地址,将这个地址复制下来,配置到企业微信应用的企业可信ip中

配置完成后,测试告警,企业微信就会收到应用发送的告警信息了

以上的企业微信白名单,可以使用自己企业中的固定公网地址,配置策略路由,将走向qyapi.weixin.qq.com该域名的所有流量都走固定公网地址,注意是调用企业微信api接口的域名,而不是报错给出的那个域名

至此alertmanage服务使用企业微信告警配置完成