
以Kubernetes为基础的监控体系里面,Prometheus Operator如果你不会用,那么你就out了,Prometheus Operator能够帮助咱们简化Prometheus 实例的部署与管理。
自定义告警规则是运维的关键所在,可以实现主动运维,让被动转变为主动,Operator 通过 PrometheusRule 这一自定义资源(CRD)来进行声明式地管理告警规则,也就实现了无需手动修改 Prometheus 配置文件。
1. 理解 PrometheusRule
PrometheusRule sh 是 Prometheus Operator 提供的核心 CRD 之一。它能够让用户以 Kubernetes 资源的形式定义一组 Alerting Rules 或 Recording Rules。Operator 会自动发现并加载这些规则到关联的 Prometheus 实例中。
PrometheusRule
2. 创建自定义告警规则
下面我就用一个典型的 PrometheusRule YAML 文件示例,方便大家更好的理解,这个示例是一个节点内存使用率过高的告警。
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: custom-node-alerts
namespace: monitoring # 通常与 Prometheus 实例在同一命名空间
labels:
# 关键:此标签必须匹配 Prometheus 资源的 ruleSelector
prometheus: k8s
spec:
groups:
- name: node-alerts
rules:
- alert: HighNodeMemoryUsage
expr: (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100 > 90
for: 5m
labels:
severity: warning
annotations:
summary: "High memory usage on {{ $labels.instance }}"
description: "{{ $labels.instance }} has been using more than 90% memory for the last 5 minutes."
3. 关键配置说明
- metadata.labels: 标签是十分重要的,它连接
PrometheusRule和Prometheus实例,所以我们需要确保标签(如prometheus: k8s)与Prometheus自定义资源中的spec.ruleSelector字段所匹配的标签选择器是一样的。 - spec.groups[].rules[].expr: 使用PromQL 表达式来定义告警的触发条件。上述的示例就是计算了内存使用率百分比。
- for: 我们可以配置告警条件,比如必须持续多久才会从
Pending状态转变为Firing状态,这样做的好处就是规避掉因为瞬时抖动出现的误报。 - annotations: 提供更丰富的上下文信息,这样可以邮件或者其它平台展示充足有用的信息。
4. 应用规则并验证
把我们上述的YAML 内容保存为 custom-rules.yaml,用 kubectl应用它:
# 应用自定义告警规则
kubectl apply -f custom-rules.yaml
# 验证规则是否被成功创建
kubectl get prometheusrules -n monitoring
# 检查 Prometheus UI 中的 "Alerts" 页面,确认新规则已加载
完成以上的过程,你就可以实现,不重启 Prometheus,添加、更新或删除告警规则,这样就能充足保证监控系统的灵活性。
