K8s监控告警规则自定义:从零编写你的第一条告警
K8s监控告警规则自定义:从零编写你的第一条告警
很多朋友搭好K8s集群后就忙着部署应用,结果等到服务挂了才发现没有监控告警。
其实通过Prometheus Operator配合Alertmanager,只需要改几个配置就能实现K8s监控告警规则自定义,让你第一时间收到异常通知。
本文不讲复杂的底层原理,只带你从零走通整个流程。
自定义监控告警前要准备好什么
先确认你的集群里已经安装了Prometheus Operator(一般通过Helm部署,名字叫kube-prometheus-stack)。
如果没有,可以搜一下官方文档快速装好。
有了Operator后,默认会有一条叫PrometheusRule的CRD(自定义资源),我们只需要在同一个命名空间下新建一个PrometheusRule对象,就能添加自定义告警。
另外,还要确保Alertmanager也正常运行,并且你已经有一个接收通知的渠道(比如企业微信、钉钉或邮箱)。
一步步创建你的第一条告警规则
1. 编写PrometheusRule YAML文件
创建一个文件custom-alert.yaml,内容如下(注意修改namespace为你自己的命名空间):
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
labels:
app: kube-prometheus-stack
release: prometheus # 根据你的Helm release名称调整
name: custom-alert-rule
namespace: monitoring # Prometheus Operator所在的命名空间
spec:
groups:
- name: example-group
interval: 30s
rules:
- alert: HighMemoryUsage
expr: node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes < 0.1
for: 5m
labels:
severity: warning
annotations:
summary: "节点 {{ $labels.instance }} 内存不足"
description: "节点可用内存低于10%(当前值:{{ $value | humanizePercentage }})"
这个规则的意思是:当节点可用内存低于总内存的10%时,触发告警,持续5分钟才发出通知。for参数可以过滤短暂抖动。
2. 应用规则到集群
运行命令:
kubectl apply -f custom-alert.yaml
如果一切正常,你会看到prometheusrule.monitoring.coreos.com/custom-alert-rule created。
现在Prometheus会自动加载这个规则。
3. 配置Alertmanager接收通知
假设你已经在Alertmanager里定义了一个receiver叫webhook(指向钉钉机器人或Slack)。
只需要在alertmanager.yaml里的routes部分添加一条路由,让它匹配severity: warning的告警并转发到你的receiver。
route:
receiver: 'default-receiver'
group_wait: 10s
group_interval: 5m
repeat_interval: 1h
routes:
- match:
severity: warning
receiver: 'webhook'
更新Alertmanager配置后,需要重启或热加载ConfigMap。
如果用的是Helm,直接修改values.yaml再升级即可。
新手最容易踩的四个坑
- PrometheusRule的namespace必须和Prometheus实例在同一个namespace,否则规则不会被识别。
- 告警表达式里的metric名称要确认存在,可以先在Prometheus UI中执行查询验证。
- for的时间不要设太短(比如10秒),否则网络波动容易造成频繁告警。
- receivers名称必须和Alertmanager配置里的一致,大小写敏感。
如何验证告警规则生效了
最简单的方法是模拟一个低内存场景。
如果你有一个测试节点,可以临时占用内存(比如用stress工具):
kubectl run stress-test --image polinux/stress -- --vm 2 --vm-bytes 1G --timeout 60
然后等待5分钟后,去Prometheus的Alert页面(通常地址是http://)查看告警是否变为FIRING状态。
同时检查你的通知方式(钉钉/邮件)是否收到了告警内容。
如果一切正常,说明你的K8s监控告警规则自定义已经成功跑通了。
写在最后
自定义告警规则是K8s运维的必备技能,本文给你演示的是一个最简单的内存告警示例。
实际生产中你还需要添加CPU、磁盘、Pod重启等规则。
只要掌握了PrometheusRule的写法、表达式和Alertmanager的路由配置,剩下的就是按业务需求灵活调整。
如果你在处理K8s监控告警规则自定义过程中遇到异常,建议先回看避坑部分,再检查Prometheus的日志和UI——绝大多数问题都是namespace和表达式写错了。