【Prometheus Operator 的 AlertmanagerConfig 邮件告警配置部署】

提示:本文原创作品,良心制作,干货为主,简洁清晰,一看就会


前言

在云原生监控体系中,Prometheus 负责采集指标与触发告警,而 Alertmanager 则承担告警路由、分组与通知分发的核心职责。然而,原生 Alertmanager 的配置方式较为复杂,尤其在多租户场景下,维护单一的全局配置文件往往带来安全风险与运维负担。Kubernetes 生态中的 AlertmanagerConfig 自定义资源(CRD)正是为解决这一问题而生——它允许用户在命名空间级别独立声明告警接收器、路由规则与抑制策略,实现细粒度的权限隔离与声明式管理


一、AlertmanagerConfig简介

AlertmanagerConfig 是Prometheus Operator提供的命名空间级 CRD 自定义资源,用来替代手动写 Secret 维护 alertmanager.yml 告警配置文件

核心作用

  1. 配置告警路由、分组、抑制规则、告警接收渠道(邮件、钉钉、企业微信、Webhook等)
  2. 多租户/多业务隔离:不同命名空间、不同业务可以各自写独立告警配置,互不干扰
  3. 通过标签选择器绑定到指定 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%原创,转载请务必标注原创作者,尊重劳动成果。
求赞、求关注、求评论!你的支持是我更新的最大动力,评论区等你~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

成为你的宁宁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值