alertManager 支持很多种报警接收器,比如 slack、微信之类的,其中最为灵活的方式是 webhook ,我们可以定义一个 webhook 来接收报警信息,然后在 webhook 里面去进行处理,可以自定义发送怎样的报警信息,这里实现了一个简单的dingtalk 的 webhook 程序,代码仓库地址:github.com/cnych/alertmanager-dingtalk-hook,现在将这个服务部署到集群中来:
将源码拉取到本地,打包这个服务镜像:
#镜像打包 $ ls app.py Dockerfile requirements.txt $ docker build -t dingtalk-hook:v1 . #这里将镜像推送到AWS ECR上,先创建一个ecr存储库,然后使用以下命令将镜像打tag并推送过去: $ aws ecr get-login-password --region cn-north-1 | docker login --username AWS --password-stdin xxxxxxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn $ docker tag dingtalk-hook:v1 xxxxxxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/dingtalk-hook:v1 $ docker push xxxxxxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/dingtalk-hook:v1 $ docker images | grep dingtalk xxxxxxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/dingtalk-hook v1 d5a82c1f0ab7 3 hours ago 700MB
使用刚打包好的镜像将服务部署到K8S集群中来,对应的资源清单如下:
$ cat dingtalk-hook.yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: dingtalk-hook
namespace: kube-mon
spec:
selector:
matchLabels:
app: dingtalk-hook
template:
metadata:
labels:
app: dingtalk-hook
spec:
containers:
- name: dingtalk-hook
image: xxxxxxxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/dingtalk-hook:v1
imagePullPolicy: IfNotPresent
ports:
- containerPort: 5000
name: http
env:
- name: PROME_URL
value: 10.20.30.40:30219
- name: LOG_LEVEL
value: debug
- name: ROBOT_TOKEN
valueFrom:
secretKeyRef:
name: dingtalk-secret
key: token
- name: ROBOT_SECRET
valueFrom:
secretKeyRef:
name: dingtalk-secret
key: secret
resources:
requests:
cpu: 50m
memory: 100Mi
limits:
cpu: 50m
memory: 100Mi
---
apiVersion: v1
kind: Service
metadata:
name: dingtalk-hook
namespace: kube-mon
spec:
selector:
app: dingtalk-hook
ports:
- name: hook
port: 5000
targetPort: http
对于上面的一些环境变量配置:
ROBOT_TOKEN: 钉钉机器人 TOKEN
PROME_URL: 手动指定跳转后的 Promethues 地址,默认会是 Pod 的地址
LOG_LEVEL: 日志级别,建议设置成 debug
ROBOT_SECRET: 为钉钉机器人的安全设置密钥,机器人安全设置页面,加签一栏下面显示的 SEC 开头的字符串
上面声明的 ROBOT_TOKEN 和 ROBOT_SECRET 环境变量,由于这是一个相对于私密的信息,所以这里从一个 Secret 对象中去获取,通过如下命令创建一个名为 dingtalk-secret 的 Secret:
$ kubectl create secret generic dingtalk-secret --from-literal=token=<钉钉群聊的机器人TOKEN> --from-literal=secret=<钉钉群聊机器人的SECRET> -n kube-mon #部署上面的dingtalk-hook $ kubectl apply -f dingtalk-hook.yaml2、添加alertManager接收器
webhook部署成功后,现在就可以给 alertManager 配置一个 webhook 接收器了,在alertManager的配置中增加一个路由接收器,如下报警信息包含team=node 标签的,将会被路由到 webhook 这个接收器中:
routes:
- receiver: webhook
match:
team: node
receivers:
- name: 'webhook'
webhook_configs:
- url: 'http://dingtalk-hook:5000' #钉钉的 webhook 的 Service 地址
send_resolved: true
修改 alertManager 配置文件后 ,执行 reload 操作使其更新生效:
$ curl -X POST http://alertnamager的地址/-/reload3、测试报警通知
添加一条Prometheus告警规则,触发告警,测试是否能正常发送报警通知,如下规则节点内存使用率大于10%时触发告警:
- alert: Node_MemoryUsage_Above_10%
expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes)) / node_memory_MemTotal_bytes * 100 > 10
for: 2m
labels:
team: node
annotations:
summary: "{{$labels.instance}}: High Memory usage detected"
description: "{{$labels.instance}}: Memory usage is above 86% (current value is: {{ $value }}"
添加报警规则后,更新Prometheus配置,到Prometheus dashboard的 alert 下查看告警信息,可以看到下图,已成功触发报警:
正常钉钉也会收到相关的告警信息通知:



