ToB企服应用市场:ToB评测及商务社交产业平台

标题: 循规蹈矩--从零开始建设k8s监控之alertmanager+发送飞书(三) [打印本页]

作者: 立山    时间: 2025-1-8 09:13
标题: 循规蹈矩--从零开始建设k8s监控之alertmanager+发送飞书(三)
前言

书接上文,prometheus已经安装好了,监控数据是有了,我们需要对其进行告警,而且可以发送到对应的平台,比如飞书、钉钉等,这里选择用飞书来测试
环境准备

组件版本操作体系Ubuntu 22.04.4 LTSdocker24.0.7alertmanagerv0.27.0下载编排文件

本文所有的编排文件,都在这里
  1. ▶ cd /tmp && git clone git@github.com:wilsonchai8/installations.git && cd installations/prometheus
复制代码
安装alertmanager

alertmanager重要用作对prometheus发来的告警进行响应,包括发送、克制等
  1. ▶ cd installations/prometheus
  2. ▶ kubectl apply -f alertmanager.yaml
复制代码
检查是否启动
  1. ▶ kubectl -n prometheus get pod -owide | grep alertmanager
  2. alertmanager-5b6d594f6c-2swpw        1/1     Running   0          69s   10.244.0.17    minikube       <none>           <none>
复制代码
访问页面
  1. ▶ kubectl get node -owide
  2. NAME       STATUS   ROLES           AGE    VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
  3. minikube   Ready    control-plane   6d2h   v1.26.3   192.168.49.2   <none>        Ubuntu 20.04.5 LTS   6.8.0-45-generic   docker://23.0.2
  4. ▶ kubectl -n prometheus get svc | grep alertmanager
  5. alertmanager         NodePort   10.110.182.95    <none>        9093:30297/TCP   70s
复制代码
http://192.168.49.2:30297

测试alertmanager

1. 定义一个测试的deployment
  1. ▶ kubectl create deployment busybox-test --image=registry.cn-beijing.aliyuncs.com/wilsonchai/busybox:latest -- sleep 33333
  2. deployment.apps/busybox-test created
  3. ▶ kubectl get pod
  4. NAME                           READY   STATUS    RESTARTS   AGE
  5. busybox-test-fcb69d5f9-tn8vx   1/1     Running   0          6s
复制代码
2. 定义告警规则

我们定义当deployment的副本是为0就告警,修改prometheus configmap
在最底部追加,相当于新增一个配置文件,里面专门定义告警规则
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: prometheus-cm
  5.   labels:
  6.     name: prometheus-cm
  7.   namespace: prometheus
  8. data:
  9.   prometheus.yml: |-
  10.     global:
  11.       scrape_interval: 5s
  12.       evaluation_interval: 5s
  13.     alerting:
  14.       alertmanagers:
  15.         - static_configs:
  16.             - targets: ['alertmanager:9093']
  17.     rule_files:
  18.       - /etc/prometheus/*.rules
  19.     scrape_configs:
  20.       - job_name: 'prometheus'
  21.         static_configs:
  22.         - targets: ['localhost:9090']
  23.       - job_name: "prometheus-kube-state-metrics"
  24.         static_configs:
  25.           - targets: ["kube-state-metrics.kube-system:8080"]
  26.       - job_name: 'kubernetes-nodes'
  27.         tls_config:
  28.           ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
  29.         bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
  30.         kubernetes_sd_configs:
  31.         - role: node
  32.         relabel_configs:
  33.         - source_labels: [__address__]
  34.           regex: '(.*):10250'
  35.           replacement: '${1}:9100'
  36.           target_label: __address__
  37.           action: replace
  38.         - action: labelmap
  39.           regex: __meta_kubernetes_node_label_(.+)
  40. # 从这里是新加的
  41.   prometheus.rules: |-
  42.     groups:
  43.     - name: test alert
  44.       rules:
  45.       - alert: deployment replicas is 0
  46.         expr: kube_deployment_spec_replicas == 0
  47.         for: 30s
  48.         labels:
  49.           severity: slack
  50.         annotations:
  51.           summary: deployment replicas is 0
复制代码
然后重启prometheus,检察告警是否生效

3. 触发告警
  1. ▶ kubectl scale --replicas=0 deploy busybox-test
复制代码
等待些许片刻,检察alertmanager页面

已经有告警触发了
发送到飞书

我们已经有一个告警了,但是目前没法关照出来,需要给他告警到飞书去
1. 创建飞书的告警群组,并创建机器人拿到机器人的webhook

webhook:
  1. https://open.feishu.cn/open-apis/bot/v2/hook/*******************
复制代码
2. 创建发送消息的服务

这里我们选用python tornado web服务来接收从alertmanager发送的告警信息
  1. from tornado.ioloop import IOLoop
  2. import tornado.httpserver as httpserver
  3. import tornado.web
  4. import requests
  5. import json
  6. WEBHOOK_URL = 'https://open.feishu.cn/open-apis/bot/v2/hook/********'
  7. def send_to_feishu(msg_raw):
  8.     headers = { 'Content-Type': 'application/json' }
  9.     for alert in msg_raw['alerts']:
  10.         msg = '## 告警发生 ##\n'
  11.         msg += '\n'
  12.         msg += '告警:{}\n'.format(alert['labels']['alertname'])
  13.         msg += '时间:{}\n'.format(alert['startsAt'])
  14.         msg += '级别:{}\n'.format(alert['labels']['severity'])
  15.         msg += '详情:\n'
  16.         msg += '    deploy:{}\n'.format(alert['labels']['deployment'])
  17.         msg += '    namespace:{}\n'.format(alert['labels']['namespace'])
  18.         msg += '    content:{}\n'.format(alert['annotations']['summary'])
  19.         data = {
  20.             'msg_type': 'text',
  21.             'content': {
  22.                 'text': msg
  23.             }
  24.         }
  25.         res = requests.Session().post(url=WEBHOOK_URL, headers=headers, json=data)
  26.         print(res.json())
  27. class SendmsgFlow(tornado.web.RequestHandler):
  28.     def post(self, *args, **kwargs):
  29.         send_to_feishu(json.loads(self.request.body.decode('utf-8')))
  30. def applications():
  31.     urls = []
  32.     urls.append([r'/sendmsg', SendmsgFlow])
  33.     return tornado.web.Application(urls)
  34. def main():
  35.     app = applications()
  36.     server = httpserver.HTTPServer(app)
  37.     server.bind(10000, '0.0.0.0')
  38.     server.start(1)
  39.     IOLoop.current().start()
  40. if __name__ == "__main__":
  41.     try:
  42.         main()
  43.     except KeyboardInterrupt as e:
  44.         IOLoop.current().stop()
  45.     finally:
  46.         IOLoop.current().close()
复制代码
本脚本已上传至仓库
3. 修改alertmanager configmap

修改alertmanager的configmap,把webhook_configs改为sendmsg的api地址
  1. apiVersion: v1
  2. kind: ConfigMap
  3. metadata:
  4.   name: alertmanager-config
  5.   namespace: prometheus
  6. data:
  7.   alertmanager.yml: |-
  8.     global:
  9.       resolve_timeout: 5m
  10.     route:
  11.       group_by: ['alertname', 'cluster']
  12.       group_wait: 30s
  13.       group_interval: 5m
  14.       repeat_interval: 5m
  15.       receiver: default
  16.     receivers:
  17.     - name: 'default'
  18.       webhook_configs:
  19.         - url: 'http://127.0.0.1:10000/sendmsg'
复制代码
重启alertmanager
4. 检查飞书


至此,一个简单告警流程制作完成
联系我


至此,本文竣事
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4