提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会
文章目录
前言
在云原生监控体系中,Prometheus 负责采集指标与触发告警,而 Alertmanager 则承担告警路由、分组与通知分发的核心职责。然而,原生 Alertmanager 的配置方式较为复杂,尤其在多租户场景下,维护单一的全局配置文件往往带来安全风险与运维负担。Kubernetes 生态中的 AlertmanagerConfig 自定义资源(CRD)正是为解决这一问题而生——它允许用户在命名空间级别独立声明告警接收器、路由规则与抑制策略,实现细粒度的权限隔离与声明式管理
一、AlertmanagerConfig简介
AlertmanagerConfig 是Prometheus Operator提供的命名空间级 CRD 自定义资源,用来替代手动写 Secret 维护 alertmanager.yml 告警配置文件
核心作用
- 配置告警路由、分组、抑制规则、告警接收渠道(邮件、钉钉、企业微信、Webhook等)
- 多租户/多业务隔离:不同命名空间、不同业务可以各自写独立告警配置,互不干扰
- 通过标签选择器绑定到指定 Alertmanager 实例,Operator 自动把所有匹配的配置合并成最终的
alertmanager.yml并热加载,不用重启 Alertmanager
二、邮箱配置
2.1 修改alertmanager-alertmanager.yaml
root@k8s-master1:~# cd kube-prometheus/manifests/
root@k8s-master1:~/kube-prometheus/manifests# vim alertmanager-alertmanager.yaml

root@k8s-master1:~/kube-prometheus/manifests# kubectl replace alertmanager-alertmanager.yaml
2.2 添加alertmanagerconfig.yaml
root@k8s-master1:~/kube-prometheus/manifests# vim email-alertmanagerconfig.yaml
apiVersion: monitoring.coreos.com/v1alpha1
kind: AlertmanagerConfig
metadata:
name: email-config
namespace: monitoring
# 标签必须被Alertmanager CR的alertmanagerConfigSelector匹配
labels:
alertmanagerConfig: email
# 告警配置规则主体
spec:
route:
# 按照告警级别severity进行分组,相同级别告警合并推送
groupBy: ['severity']
# 首次等待时间:收到告警后等待30秒,收集同组多条告警再一次发送
groupWait: 30s
# 同组告警发送间隔:上一组告警发送后,5分钟内新触发的同组告警不再单独推送
groupInterval: 5m
# 重复告警推送间隔:同一告警持续未恢复,每12小时重复发送一次告警通知
repeatInterval: 12h
# 默认告警接收人
receiver: 'Default'
# 子路由规则列表,用于对不同条件的告警做路由分发
routes:
# 第一条子路由规则
- matchers:
- matchType: =
name: severity
value: critical
#- matchers:
#- matchType: =
# name: severity
# value: warning 还可有warning分组或者其他分组
receiver: Default
# 告警接收器配置
receivers:
# 第一个接收器
- name: Default
emailConfigs:
- to: 'bestluqing@163.com' # 告警接收邮箱
from: 'bestluqing@163.com' # 告警发送方
smarthost: 'smtp.163.com:465' # 163邮箱SMTP服务+端口
authUsername: 'bestluqing@163.com' # SMTP服务认证用户名
authPassword:
# 存储SMTP邮箱授权码
name: smtp-secret
key: password
sendResolved: true # 开启告警恢复通知
requireTLS: false # 关闭强制TLS校验
# 第二个接收器,空接收器,可用于丢弃不需要的告警
- name: 'null-receiver'
root@k8s-master1:~/kube-prometheus/manifests# kubectl apply -f email-alertmanagerconfig.yaml
登录alertmanager页面,可以看到config已经更新了

2.3 详解config
我们在Alertmanager页面查看配置时会发现,config展示的完整配置和我们编写的email-alertmanagerconfig.yaml并不一致,配置中多出了大量从未手动定义过的参数
出现该现象的核心原因是:我们自定义的email-alertmanagerconfig.yaml仅属于用户侧的片段式配置,并非Alertmanager最终生效的完整配置文件
Alertmanager最终加载运行的完整配置,由三部分内容合并渲染生成:Prometheus Operator内置的全局默认配置 + Alertmanager CR自带的默认路由模板 + 我们编写的AlertmanagerConfig自定义配置
下面我们逐一梳理这些自动生成的默认配置项,这部分内容至关重要,直接决定了告警能否正常触发并成功推送



2.4 添加secret.yaml
此前配置的email-alertmanagerconfig.yaml中引用了Secret用于存放邮箱授权码,当前该Secret尚未创建,接下来我们完成Secret的创建操作
登录163邮箱,选择“设置”,开启SMTP服务,其他邮箱类似操作

root@k8s-master1:~/kube-prometheus/manifests# vim email-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: smtp-secret
namespace: monitoring
type: Opaque
stringData:
password: 授权码
root@k8s-master1:~/kube-prometheus/manifests# kubectl apply -f email-secret.yaml
2.5 添加rule.yaml
我们已经完成告警发送渠道配置,编写了email-alertmanagerconfig.yaml告警接收器配置文件
我目前有一套mysql高可用集群,接下来将以mysql集群为例演示如何配置对应的 Prometheus 告警触发规则
root@k8s-master1:~/kube-prometheus/manifests# kubectl get pod
NAME READY STATUS RESTARTS AGE
mysql-rep-master-0 2/2 Running 6 (127m ago) 44h
mysql-rep-slave-0 2/2 Running 4 (127m ago) 44h
mysql-rep-slave-1 2/2 Running 4 (127m ago) 44h
我们可以先查看 MySQL 集群已采集的监控指标,包括 MySQL 运行状态、SQL 线程与 IO 线程数量、数据库连接数等核心指标,再基于这些指标配置对应的告警触发规则
mysql运行状态

sql线程数

io线程数

root@k8s-master1:~/kube-prometheus/manifests# vim mysql-rule.yaml
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
app: kube-prometheus-stack
role: alerting-rules
prometheus: kube-prometheus-stack-prometheus
name: prometheus-mysql-alerts
namespace: monitoring # 请替换为你的Prometheus所在namespace
spec:
groups:
- name: mysql
rules:
# ==================== 1. 集群可用性告警 ====================
- alert: MySQLDown
expr: mysql_up == 0
for: 1m
labels:
severity: critical
# mysql宕机告警通过AlertmanagerConfig配置的邮箱接收,那么必须添加这个标签,不然匹配不到父路由
namespace: monitoring
annotations:
summary: "MySQL实例 {{ $labels.instance }} 已宕机"
description: "Prometheus 无法连接到 {{ $labels.pod }} 上的 MySQL 实例。这通常意味着 mysqld 进程已停止或 exporter 无法连接。"
# ==================== 2. 主从复制告警 ====================
# 2.1 复制延迟过高
- alert: MySQLReplicationLagHigh
expr: mysql_slave_status_seconds_behind_source > 30
for: 2m
labels:
severity: warning
# mysql宕机告警通过AlertmanagerConfig配置的邮箱接收,那么必须添加这个标签,不然匹配不到父路由
namespace: monitoring
annotations:
summary: "MySQL 复制延迟较高"
description: "从库 {{ $labels.pod }} (实例: {{ $labels.instance }}) 复制落后主库 {{ $value }} 秒。请检查网络延迟或主库写入负载。"
# 2.2 复制线程停止
- alert: MySQLReplicationSQLThreadDown
expr: mysql_slave_status_replica_sql_running == 0
for: 1m
labels:
severity: critical
# mysql宕机告警通过AlertmanagerConfig配置的邮箱接收,那么必须添加这个标签,不然匹配不到父路由
namespace: monitoring
annotations:
summary: "MySQL 复制 SQL 线程停止"
description: "从库 {{ $labels.pod }} 的 SQL 线程未运行,数据同步已中断。请检查 relay log 是否有损坏或错误。"
- alert: MySQLReplicationIOThreadDown
expr: mysql_slave_status_replica_io_running == 0
for: 1m
labels:
severity: critical
# mysql宕机告警通过AlertmanagerConfig配置的邮箱接收,那么必须添加这个标签,不然匹配不到父路由
namespace: monitoring
annotations:
summary: "MySQL 复制 IO 线程停止"
description: "从库 {{ $labels.pod }} 的 IO 线程未运行,无法从主库获取二进制日志,网络连接可能已断开。"
# ==================== 3. 实例健康告警 ====================
- alert: MySQLTooManyConnections
expr: >-
mysql_global_status_threads_connected
/ mysql_global_variables_max_connections > 0.8
for: 5m
labels:
severity: warning
# mysql宕机告警通过AlertmanagerConfig配置的邮箱接收,那么必须添加这个标签,不然匹配不到父路由
namespace: monitoring
annotations:
summary: "MySQL 连接数超过阈值"
description: "实例 {{ $labels.pod }} 当前连接数使用率已超过 80%,请排查慢查询或应用连接池配置。"
- alert: MySQLInnoDBBufferPoolLowFree
expr: >-
(mysql_global_variables_innodb_buffer_pool_size - mysql_global_status_innodb_buffer_pool_bytes_data) / mysql_global_variables_innodb_buffer_pool_size < 0.05
for: 5m
labels:
severity: warning
# mysql宕机告警通过AlertmanagerConfig配置的邮箱接收,那么必须添加这个标签,不然匹配不到父路由
namespace: monitoring
annotations:
summary: "MySQL InnoDB Buffer Pool 可用空间不足"
description: "实例 {{ $labels.pod }} InnoDB Buffer Pool 可用空间低于 5%,磁盘 I/O 可能会显著增加,建议扩容内存。"
2.5 测试告警
告警通知
进入mysql slave pod内部,关闭sql线程,测试一下能不能收到告警
root@k8s-master1:~/kube-prometheus/manifests# kubectl exec -it mysql-rep-slave-0 /bin/bash
I have no name!@mysql-rep-slave-0:/$ mysql -uroot -p'Root@12345'
mysql> STOP REPLICA SQL_THREAD;
登录Prometheus可以看到sql线程数据变为0


登录163邮箱,可以看到收到了告警消息

恢复通知
进入mysql slave pod内部,启动sql线程,测试一下能不能收到恢复消息
root@k8s-master1:~/kube-prometheus/manifests# kubectl exec -it mysql-rep-slave-0 /bin/bash
I have no name!@mysql-rep-slave-0:/$ mysql -uroot -p'Root@12345'
mysql> START REPLICA SQL_THREAD;
登录Prometheus可以看到sql线程数为1


登录163邮箱可以看到收到了恢复邮件

到此,邮件告警配置就到此结束了!
注:
文中若有疏漏,欢迎大家指正赐教。
本文为100%原创,转载请务必标注原创作者,尊重劳动成果。
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~

8106

被折叠的 条评论
为什么被折叠?



