当前位置: 首页 > news >正文

k8s监控方案实践(二):集成Alertmanager告警与钉钉Webhook通知

k8s监控方案实践(二): 集成Alertmanager告警与钉钉Webhook通知

文章目录

  • k8s监控方案实践(二): 集成Alertmanager告警与钉钉Webhook通知
  • 一、Alertmanager简介
    • 1. 什么是Alertmanager?
    • 2. Prometheus与Alertmanager的工作流程
  • 二、Alertmanager实战部署
    • 1. 创建Namespace(prometheus-namespace.yaml)
    • 2. 创建ConfigMap(alertmanager-config.yaml)
    • 3. 创建Service(alertmanager-svc.yaml)
    • 4. 创建Deployment(alertmanager-deploy.yaml)
    • 5. 部署所有资源
  • 三、Prometheus告警规则配置
    • 1. 配置Pormetheus告警规则
    • 2. 配置Prometheus与Alertmanager通信
  • 四、集成钉钉Webhook
    • 1. 创建ConfigMap(webhook-dingtalk-config.yaml)
    • 2. 创建Service(webhook-dingtalk-svc.yaml)
    • 3. 创建Deployment(webhook-dingtalk-deploy.yaml)
    • 4. 创建模板文件(webhook-dingtalk-templates.yaml )
    • 5. 部署所有资源
  • 总结


随着容器化和微服务架构的不断发展,系统的复杂性与日俱增,构建一套完善的监控与告警体系已成为保障系统稳定运行的关键。在上一篇文章中,我们介绍了如何在 Kubernetes 中部署 Prometheus,并集成 Node Exporter 实现对节点资源的基础监控,为整体可观测性打下了坚实基础。

在本篇中,我们将继续完善监控体系,重点介绍如何部署 Alertmanager 并配置 Prometheus 告警规则,帮助我们及时感知系统异常,并通过钉钉、飞书等方式实现告警通知,进一步提升运维响应能力与系统可靠性。

一、Alertmanager简介

1. 什么是Alertmanager?

Alertmanager 是 Prometheus 生态中的核心组件之一,主要用于接收 Prometheus 发送的告警(Alerts),并按照用户定义的规则对这些告警进行:

  • 去重(Deduplication):避免重复告警干扰
  • 分组(Grouping):相似告警聚合成一条,提升可读性
  • 抑制(Silencing):在特定情况下抑制某些告警,如在维护窗口中
  • 路由(Routing):按标签或规则将不同告警分发到不同的接收人或平台
  • 通知(Notification):最终将告警通过 Email、Slack、Webhook、飞书、钉钉等方式发送出去

2. Prometheus与Alertmanager的工作流程

Alertmanager 并不主动采集数据,它只处理告警。以下是 Prometheus 与 Alertmanager 的协作流程:

  • Prometheus 定期根据配置文件中定义的告警规则(alerting rules)对收集到的时间序列数据进行评估
  • 当满足某条规则的触发条件时,Prometheus 会将该规则对应的 Alert(告警)发送给 Alertmanager
  • Alertmanager 收到告警后,进行上述的去重、分组、路由和通知
  • 用户通过接收端(如钉钉群、邮箱等)接收到告警信息

✅ 提示:Prometheus 与 Alertmanager 之间通过 HTTP 协议通信,默认使用端口 9093 接收告警。

g.cn/direct/31da7451a2e34431b7ce7606e6722ebf.png)

二、Alertmanager实战部署

1. 创建Namespace(prometheus-namespace.yaml)

创建名为prometheus的命名空间,用于隔离部署监控相关资源

apiVersion: v1
kind: Namespace
metadata:name: prometheus

2. 创建ConfigMap(alertmanager-config.yaml)

配置 Alertmanager 的基本设置,包括告警的路由、分组规则、抑制规则以及通知方式等。下面配置了钉钉 webhook 作为告警接收渠道

---
kind: ConfigMap
apiVersion: v1
metadata:labels:app: aalertmanagername: alertmanager-confignamespace: prometheus
data:config.yml: |global:#旧的告警3分钟没有更新,则认为告警解决        resolve_timeout: 3mroute:group_by: ['alertname'] #根据告警规则组名进行分组group_wait: 0s       #在组内等待所配置的时间,如果同组内,30秒内出现相同报警,在一个组内出现group_interval: 10s   #控制告警组的发送频率,一条告警消息发送后,等待10秒,发送第二组告警repeat_interval: 1h   #发送报警间隔,如果指定时间内没有修复,则重新发送报警receiver: 'web.hook'receivers:- name: 'web.hook'webhook_configs:    #钉钉 webhook 地址- url: 'http://dingtalk.prometheus.svc.cluster.local:8060/dingtalk/webhook1/send'send_resolved: true     #表示服务恢复后会收到恢复告警inhibit_rules:   #配置抑制告警规则- source_match:severity: 'error'  #如果源告警为 error,目标告警为 warn,则抑制该目标告警target_match:severity: 'warn'equal: ['alertname', 'target', 'job', 'instance']   #相同标签的告警才会抑制- source_match:severity: 'warn'target_match:severity: 'info'equal: ['alertname', 'target', 'job', 'instance']

3. 创建Service(alertmanager-svc.yaml)

为 Alertmanager 创建一个专用的 Service,使其可以暴露给 Prometheus 使用

apiVersion: v1
kind: Service
metadata:name: alertmanagernamespace: prometheuslabels:app: alertmanager
spec:ports:- port: 9093targetPort: 9093protocol: TCPselector:app: alertmanager

4. 创建Deployment(alertmanager-deploy.yaml)

部署 Alertmanager 到 Kubernetes 集群,挂载配置文件并设置必要的启动参数

apiVersion: apps/v1
kind: Deployment
metadata:name: alertmanagernamespace: prometheus
spec:replicas: 1selector:matchLabels:app: alertmanagertemplate:metadata:labels:app: alertmanagerspec:containers:- name: alertmanagerimage: harbor.local/k8s/alertmanager:0.25.0  imagePullPolicy: IfNotPresentports:- containerPort: 9093protocol: TCPargs: - "--config.file=/etc/alertmanager/config.yml"- "--storage.path=/alertmanager"volumeMounts:- mountPath: /etc/alertmanager/name: alertmanager-configvolumes:- name: alertmanager-configconfigMap:name: alertmanager-config

5. 部署所有资源

kubectl apply -f prometheus-namespace.yaml
kubectl apply -f alertmanager-config.yaml
kubectl apply -f alertmanager-svc.yaml
kubectl apply -f alertmanager-deploy.yaml

三、Prometheus告警规则配置

1. 配置Pormetheus告警规则

/kubernetes/prometheus/rules 目录下创建 k8s-node_exporter.yml,用于定义监控条件,例如内存、CPU使用率等告警条件(这里不清楚为什么是这个目录的看上一篇文章)

groups:
- name: K8S服务器告警rules:- alert: "K8S服务器内存告警"expr: 100 - ((node_memory_MemAvailable_bytes{job=~"k8s.*"} * 100) / node_memory_MemTotal_bytes{job=~"k8s.*"}) > 90for: 5m  labels:severity: warnannotations:summary: "{{ $labels.instance }} 内存使用率过高,请尽快处理!"description: '{{ $labels.instance }}内存使用率90%,当前使用率{{ printf "%.2f" .Value }}%.'- alert: "K8S服务器磁盘空间告警"expr: (1 - node_filesystem_avail_bytes{job=~"k8s.*", fstype=~"ext4|xfs"} / node_filesystem_size_bytes{job=~"k8s.*",fstype=~"ext4|xfs"}) * 100 > 90for: 60slabels:severity: warnannotations:summary: "{{ $labels.instance }}磁盘空间使用超过90%了"description: '{{ $labels.instance }}磁盘使用率超过90%,当前使用率{{ printf "%.2f" .Value }}%.'- alert: "K8S服务器CPU告警"expr: 100-(avg(irate(node_cpu_seconds_total{job=~"k8s.*",mode="idle"}[5m])) by(instance)* 100) > 90for: 5mlabels:severity: warninstance: "{{ $labels.instance }}"annotations:summary: "{{$labels.instance}}CPU使用率超过90%了"description: '{{ $labels.instance }}CPU使用率超过90%,当前使用率{{ printf "%.2f" .Value }}%.'- alert: "K8S服务器负载告警"expr: (node_load15{job=~"k8s.*"}) > 50for: 5mlabels:severity: warninstance: "{{ $labels.instance }}"annotations:summary: "{{$labels.instance}}服务器负载异常"description: '{{ $labels.instance }}服务器负载异常,当前负载{{ printf "%.2f" .Value }}%.'- alert: "K8S服务器IO性能告警"expr: ((irate(node_disk_io_time_seconds_total{job=~"k8s.*"}[30m]))* 100)  > 95for: 5mlabels:severity: warnannotations:summary: "{{$labels.instance}} 流入磁盘IO使用率过高,请尽快处理!"description: '{{$labels.instance}} 流入磁盘IO大于95%,当前使用率{{ printf "%.2f" .Value }}%.'

在这里插入图片描述
在这里插入图片描述

2. 配置Prometheus与Alertmanager通信

确保 Prometheus 的配置文件已正确配置以与 Alertmanager 通信

data:prometheus.yml: |global:scrape_interval: 15s  #抓取数据的间隔时间scrape_timeout: 10s   #超时时间evaluation_interval: 1m   #评估时间alerting:alertmanagers:- static_configs:- targets: ['alertmanager.prometheus.svc.cluster.local:9093']

在这里插入图片描述

四、集成钉钉Webhook

由于 Alertmanager 本身不直接支持钉钉告警推送,我们通过部署一个中间转发服务来处理 Prometheus 的告警并发送到钉钉。这里使用 prometheus-webhook-dingtalk 服务来实现这一功能

1. 创建ConfigMap(webhook-dingtalk-config.yaml)

创建 webhook-dingtalk-config.yaml,配置钉钉机器人的地址、密钥和告警模板

kind: ConfigMap
apiVersion: v1
metadata:labels:app: dingtalkname: dingtalk-confignamespace: prometheus
data:config.yml: |templates:- /etc/prometheus-webhook-dingtalk/templates/template.tmpl targets: webhook1:url: https://oapi.dingtalk.com/robot/send?access_token=xxx  #替换成实际的钉钉机器人tokensecret: xxx              #加签配置message:text: '{{ template "email.to.message" . }}'    #使用模板格式化消息

2. 创建Service(webhook-dingtalk-svc.yaml)

apiVersion: v1
kind: Service
metadata:name: dingtalknamespace: prometheuslabels:app: dingtalk
spec:ports:- port: 8060targetPort: 8060protocol: TCPselector:app: dingtalk

3. 创建Deployment(webhook-dingtalk-deploy.yaml)

apiVersion: apps/v1
kind: Deployment
metadata:name: prometheus-webhook-dingtalknamespace: prometheus
spec:replicas: 1selector:matchLabels:app: dingtalktemplate:metadata:labels:app: dingtalkspec:containers:- name: webhook-dingtalkimage: harbor.local/k8s/prometheus-webhook-dingtalk:latestimagePullPolicy: IfNotPresentports:- containerPort: 8060protocol: TCPvolumeMounts:- mountPath: /etc/prometheus-webhook-dingtalk/name: dingtalk-config- mountPath: /etc/prometheus-webhook-dingtalk/templates/name: dingtalk-templatesvolumes:- name: dingtalk-configconfigMap:name: dingtalk-config- name: dingtalk-templatesconfigMap:name: dingtalk-templates

4. 创建模板文件(webhook-dingtalk-templates.yaml )

该模板将告警格式化为钉钉支持的 Markdown 格式

---
kind: ConfigMap
apiVersion: v1
metadata:labels:app: dingtalkname: dingtalk-templatesnamespace: prometheus
data:template.tmpl: |{{ define "email.to.message" }}{{- if gt (len .Alerts.Firing) 0 -}}{{- range $index, $alert := .Alerts -}}<font color=#FF0000>=========  **监控告警** ========= </font>  **告警程序:**     Alertmanager   **告警类型:**    {{ $alert.Labels.alertname }}   **告警级别:**    {{ $alert.Labels.severity }}**告警状态:**    {{ .Status }}   **故障主机:**    {{ $alert.Labels.instance }} {{ $alert.Labels.device }}   **告警主题:**    {{ .Annotations.summary }}   **告警详情:**    {{ $alert.Annotations.message }}{{ $alert.Annotations.description}}   **主机标签:**    {{ range .Labels.SortedPairs  }}  </br> [{{ .Name }}: {{ .Value | markdown | html }} ] {{- end }} </br>**故障时间:**    {{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}  <font color=#FF0000>========= = **end** =  ========= </font>{{- end }}{{- end }}{{- if gt (len .Alerts.Resolved) 0 -}}{{- range $index, $alert := .Alerts -}}<font color=#00800>========= **告警恢复** ========= </font>  **告警程序:**     Alertmanager   **告警主题:**    {{ $alert.Annotations.summary }}  **告警主机:**    {{ .Labels.instance }}   **告警类型:**    {{ .Labels.alertname }}  **告警级别:**    {{ $alert.Labels.severity }}**告警状态:**    {{   .Status }}  **告警详情:**    {{ $alert.Annotations.message }}{{ $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" }}  <font color=#00800>========= = **end** =  ========= </font>{{- end }}{{- end }}{{- end }}

5. 部署所有资源

kubectl apply -f webhook-dingtalk-config.yaml
kubectl apply -f webhook-dingtalk-svc.yaml
kubectl apply -f webhook-dingtalk-deploy.yaml
kubectl apply -f webhook-dingtalk-templates.yaml

至此,Alertmanager 配置完毕,Prometheus 告警可以通过钉钉 Webhook 发送通知

在这里插入图片描述


总结

🚀 本篇详细介绍了在 Kubernetes 环境中部署 Prometheus 与 Alertmanager,并结合钉钉 Webhook 实现监控告警通知的完整流程。通过配置告警规则和通知渠道,可以及时掌握集群关键指标变化,提高系统稳定性和运维响应效率。
✅下一篇将介绍如何在 Kubernetes 中部署并配置 Grafana,实现监控数据的可视化展示,打造高效直观的监控面板。

http://www.xdnf.cn/news/353251.html

相关文章:

  • C23 与 MISRA C:2025:嵌入式 C 语言的进化之路
  • 4.3【LLaMA-Factory实战】教育大模型:个性化学习路径生成系统全解析
  • 微服务中 本地启动 springboot 无法找到nacos配置 启动报错
  • 第十六章,网络型攻击防范技术
  • Python 常用内置函数详解(十):help()函数——查看对象的帮助信息
  • 【论文阅读27】-TCN–BiLSTM -滑坡预测
  • 从Dockerfile 构建docker镜像——保姆级教程
  • `待办事项css样式
  • electron 结合 react(cra创建的) 创建桌面应用和打包桌面应用
  • 2025年API安全防御全解析:应对DDoS与CC攻击的智能策略
  • rtsp,。。。。
  • 现代框架对SEO的深度影响
  • 【概念解读】开发中遇到的概念阶段
  • RuntimeError: expected scalar type ComplexDouble but found Float
  • 计算机视觉与深度学习 | 视觉+激光雷达+惯惯性SLAM算法汇总(原理,公式,代码)
  • Java中的分布式缓存与Memcached集成实战
  • 电压取样端口静电浪涌防护方案 之6TS Series瞬态抑制器TVS
  • hz2新建Keyword页面
  • 使用 swift 微调 Qwen3-4b 模型
  • 矩阵短剧系统:如何用1个后台管理100+小程序?深度解析多端绑定技术
  • C++--类中this指针的讲解
  • 从数据孤岛到智能工厂:RG3000边缘网关的数字化转型实践
  • Mac QT水平布局和垂直布局
  • 小红书视频无水印下载方法
  • AI技术与园区运营的深度融合:未来生态型园区的建设路径
  • VS Code配置指南:打造高效的QMK开发环境
  • 老旧 LabVIEW 系统升级改造
  • 系统的从零开始学习电子的相关知识,该如何规划?你是工作了18年的电子工程师,请给出你的建议
  • 三维GIS开发cesium智慧地铁教程(6)添加模型
  • 31【干货】Arcgis属性表常用查询表达式实战大全