一、前言
? ? 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: ConfigMap
apiVersion: v1
metadata:
name: alertmanager
namespace: prometheus
data:
alertmanager.yml: |-
global:
resolve_timeout: 1m
smtp_smarthost: 'smtp.qq.com:25' #配置告警邮箱服务器
smtp_from: '123456@qq.com' #告警发送到的邮箱
smtp_auth_username: '123456@qq.com'
smtp_auth_password: 'ioasdgxvovclbsfb' #授权码,在邮箱里面获取
smtp_require_tls: false
wechat_api_url: "https://qyapi.weixin.qq.com/cgi-bin/" #企业微信的api接口,统一固定的
wechat_api_corp_id: "ww7490f1231244252" #上面获取的企业微信中的企业id
templates:
- '/etc/alertmanager/template/*.tmpl' #使用告警模板
route:
group_by: ['alertname_wechat']
group_wait: 30s #告警等待发送时间
group_interval: 5m
repeat_interval: 15m #重复告警的再次发送时间
receiver: wechat #调用的告警组件,下面配置的组件名称
receivers:
- name: 'wechat'
wechat_configs:
- send_resolved: true
corp_id: ww7490f1231244252 #上面获取的企业微信中的企业id
to_user: '@all' #发送给所有人
agent_id: 1000002 #上面获取的企业微信应用中的agentid
api_secret: J6WJQ7QXEY5zodi12342352342 #上面获取的企业微信应用中的secret
编辑alertmanage使用的告警模板,使用configmap服务挂载
vi?configmap-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: ConfigMap
metadata:
name: wechat
namespace: prometheus
以上的变量取值都来自于配置的prometheus告警配置和alertmanage的值
?
?编辑部署alertmanage服务的deployment的yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: alertmanager
namespace: prometheus
labels:
app: alertmanager
spec:
replicas: 1
selector:
matchLabels:
app: alertmanager
template:
metadata:
labels:
app: alertmanager
spec:
containers:
- name: alertmanager
image: "prom/alertmanager"
imagePullPolicy: "IfNotPresent"
args:
- "--config.file=/etc/alertmanager/alertmanager.yml"
ports:
- containerPort: 9093
readinessProbe:
httpGet:
path: /#/status
port: 9093
initialDelaySeconds: 30
timeoutSeconds: 30
volumeMounts:
- name: config-volume #挂载配置文件
mountPath: /etc/alertmanager
- name: wechat-tmpl #挂载告警规则模板
mountPath: /etc/alertmanager/template
- name: tz-config
mountPath: /etc/localtime
resources:
limits:
cpu: 10m
memory: 50Mi
requests:
cpu: 10m
memory: 50Mi
volumes:
- name: config-volume #使用配置文件的configmap
configMap:
name: alertmanager
- name: wechat-tmpl #使用规则模板的configmap
configMap:
name: wechat
- name: tz-config
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
编辑alertmanage服务对外访问的service的yaml
vi service.yaml
apiVersion: v1
kind: Service
metadata:
name: svc-alertmanager
namespace: prometheus
spec:
type: NodePort
ports:
- port: 9093
protocol: TCP
targetPort: 9093
nodePort: 30011
selector:
app: alertmanager
创建命名空间
kubectl create namespace prometheus
创建所有yaml服务
kubectl apply -f?configmap-wechat.yaml
kubectl apply -f?configmap.yaml
kubectl apply -f deployment.yaml?
kubectl apply -f?service.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服务使用企业微信告警配置完成