前言

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

环境准备

组件 版本
操作系统 Ubuntu 22.04.4 LTS
docker 24.0.7
alertmanager v0.27.0

下载编排文件

本文所有的编排文件,都在这里

 cd /tmp && git clone git@github.com:wilsonchai8/installations.git && cd installations/prometheus

安装alertmanager

alertmanager主要用作对prometheus发来的告警进行响应,包括发送、抑制等

 cd installations/prometheus
kubectl apply -f alertmanager.yaml

检查是否启动

 kubectl -n prometheus get pod -owide | grep alertmanager
alertmanager-5b6d594f6c-2swpw 1/1 Running 0 69s 10.244.0.17 minikube <none> <none>

访问页面

 kubectl get node -owide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
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 kubectl -n prometheus get svc | grep alertmanager
alertmanager NodePort 10.110.182.95 <none> 9093:30297/TCP 70s

http://192.168.49.2:30297

测试alertmanager

1. 定义一个测试的deployment

 kubectl create deployment busybox-test --image=registry.cn-beijing.aliyuncs.com/wilsonchai/busybox:latest -- sleep 33333
deployment.apps/busybox-test created kubectl get pod
NAME READY STATUS RESTARTS AGE
busybox-test-fcb69d5f9-tn8vx 1/1 Running 0 6s

2. 定义告警规则

我们定义当deployment的副本是为0就告警,修改prometheus configmap

在最底部追加,相当于新增一个配置文件,里面专门定义告警规则

apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-cm
labels:
name: prometheus-cm
namespace: prometheus
data:
prometheus.yml: |-
global:
scrape_interval: 5s
evaluation_interval: 5s alerting:
alertmanagers:
- static_configs:
- targets: ['alertmanager:9093'] rule_files:
- /etc/prometheus/*.rules scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090'] - job_name: "prometheus-kube-state-metrics"
static_configs:
- targets: ["kube-state-metrics.kube-system:8080"] - job_name: 'kubernetes-nodes'
tls_config:
ca_file: /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
bearer_token_file: /var/run/secrets/kubernetes.io/serviceaccount/token
kubernetes_sd_configs:
- role: node
relabel_configs:
- source_labels: [__address__]
regex: '(.*):10250'
replacement: '${1}:9100'
target_label: __address__
action: replace
- action: labelmap
regex: __meta_kubernetes_node_label_(.+) # 从这里是新加的
prometheus.rules: |-
groups:
- name: test alert
rules:
- alert: deployment replicas is 0
expr: kube_deployment_spec_replicas == 0
for: 30s
labels:
severity: slack
annotations:
summary: deployment replicas is 0

然后重启prometheus,查看告警是否生效

3. 触发告警

 kubectl scale --replicas=0 deploy busybox-test

等待些许片刻,查看alertmanager页面

已经有告警触发了

发送到飞书

我们已经有一个告警了,但是目前没法通知出来,需要给他告警到飞书去

1. 创建飞书的告警群组,并创建机器人拿到机器人的webhook

webhook:

https://open.feishu.cn/open-apis/bot/v2/hook/*******************

2. 创建发送消息的服务

这里我们选用python tornado web服务来接收从alertmanager发送的告警信息

from tornado.ioloop import IOLoop
import tornado.httpserver as httpserver
import tornado.web
import requests
import json WEBHOOK_URL = 'https://open.feishu.cn/open-apis/bot/v2/hook/********' def send_to_feishu(msg_raw):
headers = { 'Content-Type': 'application/json' }
for alert in msg_raw['alerts']:
msg = '## 告警发生 ##\n'
msg += '\n'
msg += '告警:{}\n'.format(alert['labels']['alertname'])
msg += '时间:{}\n'.format(alert['startsAt'])
msg += '级别:{}\n'.format(alert['labels']['severity'])
msg += '详情:\n'
msg += ' deploy:{}\n'.format(alert['labels']['deployment'])
msg += ' namespace:{}\n'.format(alert['labels']['namespace'])
msg += ' content:{}\n'.format(alert['annotations']['summary'])
data = {
'msg_type': 'text',
'content': {
'text': msg
}
}
res = requests.Session().post(url=WEBHOOK_URL, headers=headers, json=data)
print(res.json()) class SendmsgFlow(tornado.web.RequestHandler):
def post(self, *args, **kwargs):
send_to_feishu(json.loads(self.request.body.decode('utf-8'))) def applications():
urls = []
urls.append([r'/sendmsg', SendmsgFlow])
return tornado.web.Application(urls) def main():
app = applications()
server = httpserver.HTTPServer(app)
server.bind(10000, '0.0.0.0')
server.start(1)
IOLoop.current().start() if __name__ == "__main__":
try:
main()
except KeyboardInterrupt as e:
IOLoop.current().stop()
finally:
IOLoop.current().close()

本脚本已上传至仓库

3. 修改alertmanager configmap

修改alertmanager的configmap,把webhook_configs改为sendmsg的api地址

apiVersion: v1
kind: ConfigMap
metadata:
name: alertmanager-config
namespace: prometheus
data:
alertmanager.yml: |-
global:
resolve_timeout: 5m
route:
group_by: ['alertname', 'cluster']
group_wait: 30s
group_interval: 5m
repeat_interval: 5m
receiver: default
receivers:
- name: 'default'
webhook_configs:
- url: 'http://127.0.0.1:10000/sendmsg'

重启alertmanager

4. 检查飞书

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

联系我

  • 联系我,做深入的交流


至此,本文结束

在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

循序渐进--从零开始建设k8s监控之alertmanager+发送飞书(三)的更多相关文章

  1. Python发送飞书消息

    #!/usr/bin/python3.8 # -*- coding:UTF-8 -*- import os, sys sys.path.append(os.path.dirname(os.path.a ...

  2. Jenkins+Allure测试报告+飞书机器人发送通知

    一.前言 之前讲了jenkins如何设置定时任务执行脚本,结合实际情况,本篇讲述在jenkins构建成功后,如何生成测试报告,以及推送飞书(因为我公司用的是飞书,所以是发送到飞书机器人). 本次实践搞 ...

  3. Prometheus K8S中部署Alertmanager

    Prometheus K8S中部署Alertmanager 设置告警和通知的主要步骤如下:一.部署Alertmanager二.配置Prometheus与Alertmanager通信三.配置告警 1. ...

  4. [转帖]从零开始入门 K8s:应用编排与管理:Job & DaemonSet

    从零开始入门 K8s:应用编排与管理:Job & DaemonSet https://www.infoq.cn/article/KceOuuS7somCYbfuykRG 陈显鹭 阅读数:193 ...

  5. Prometheus 监控报警系统 AlertManager 之邮件告警

    转载自:https://cloud.tencent.com/developer/article/1486483 文章目录1.Prometheus & AlertManager 介绍2.环境.软 ...

  6. k8s监控api调用

    k8s监控api调用 curl -s --cacert /etc/kubernetes/ssl/ca.pem -basic -u fengjian:fengjian --insecure -X GET ...

  7. 通过Fiddler监控Java应用发送请求及相应数据

    Fiddler可以很好的监控浏览器发送的各种请求及响应数据,对于JAVA程序默认情况下是无法监控的,但实际需求中需要监控JAVA程序发送HTTP请求及返回数据是否正确. Fiddler默认配置的监听端 ...

  8. 从零开始搭建前端监控系统(三)——实现控制iframe前进后退

    前言 本系列文章旨在讲解如何从零开始搭建前端监控系统. 项目已经开源 项目地址: https://github.com/bombayjs/bombayjs (web sdk) https://gith ...

  9. [转帖]从零开始入门 K8s | 手把手带你理解 etcd

    从零开始入门 K8s | 手把手带你理解 etcd https://zhuanlan.zhihu.com/p/96721097 导读:etcd 是用于共享配置和服务发现的分布式.一致性的 KV 存储系 ...

  10. 从零开始入门 K8s | Kubernetes 存储架构及插件使用

    本文整理自<CNCF x Alibaba 云原生技术公开课>第 21 讲. 导读:容器存储是 Kubernetes 系统中提供数据持久化的基础组件,是实现有状态服务的重要保证.Kubern ...

随机推荐

  1. 开源一款AI聊天工具

    学习Spring AI项目,开发一款问答工具 AI大模型请注册并生成API密钥 获取API密钥地址:https://bigmodel.cn/console/overview 开源地址:LuckyAI ...

  2. 增强 vw/rem 移动端适配,适配宽屏、桌面端、三折屏

    vw 和 rem 是两个神奇的 CSS 长度单位,认识它们之前,我一度认为招聘广告上的"像素级还原"是一种超能力,我想具备这种能力的人,一定专业过硬.有一双高分辨率的深邃大眼睛. ...

  3. vue通过ollama接口调用开源模型

    先展示下最终效果: 第一步:先安装ollama,并配置对应的开源大模型. 安装步骤可以查看上一篇博客: ollama搭建本地ai大模型并应用调用  第二步:需要注意两个配置,页面才可以调用 1)OLL ...

  4. 灵活轻巧的java接口自动化测试实战

    前言 无论是自动化测试还是自动化部署,撸码肯定少不了,所以下面的基于java语言的接口自动化测试,要想在业务上实现接口自动化,前提是要有一定的java基础. 如果没有java基础,也没关系.这里小编也 ...

  5. 2023NOIP A层联测23 T2 涂鸦

    2023NOIP A层联测23 T2 涂鸦 模拟赛一道博弈,剩下仨全期望,我: 思路 其实我也不是很会 考虑设 \(f_{mst}\),为 \(n*m\) 个格被压成一个二进制 \(mst\),转移到 ...

  6. NOIP2023模拟2联测23 T2 害怕

    NOIP2023模拟2联测23 T2 害怕 好像写了一种出题人意料之外的算法. 思路 在生成树上加入白边,白边和若干条蓝色边形成环,环上的蓝色边必须要分配比该白色边更小的边权(最小生成树). 给每一条 ...

  7. CommonsCollections6(基于ysoserial)

    环境准备 JDK1.8(8u421)我以本地的JDK8版本为准.commons-collections(3.x 4.x均可这里使用3.2版本) cc3.2: <dependency> &l ...

  8. 切换自己为www-data用户

    突发奇想的想把切换为www-data用户去看看会怎么样.然后做了一个尝试 由于我安装了lamp环境,所以有www-data用户,用它可以来执行web php ,以及安全放心的跑cli(避免权限过高执行 ...

  9. PA1-总结

    前言 代码全是自己写的,没看过参考代码,思路也有部分和指导书不一样,算是个原创?然后毕竟pa1是简单的部分,也没有什么值得骄傲的地方,只是作为一次记录. 毕竟自己的水平还是有限,可能部分地方会有些bu ...

  10. .NET云原生应用实践(六):多租户初步

    本章目标 多租户简介 实现public租户下的用户数据隔离 出于开发进度考虑,本章暂不会完全实现多租户的整套体系,而是会实现其中的一小部分:基于默认public租户的数据隔离,并在本章节中会讨论多租户 ...