Kubernetes自愈场景测试:基于SLO的事件触发验证 - 第4节
4.1 Prometheus 整体架构与核心组件
Prometheus 是 Kubernetes 生态中最主流的监控与告警系统,其架构围绕“拉取(Pull)指标、本地存储、规则评估、告警分发”四个核心环节设计。理解其组件关系是编写告警规则和配置 Alertmanager 的前提。
架构要点:Prometheus Server 通过 Service Discovery 发现目标,周期性拉取指标并存储于本地 TSDB;同时独立运行告警规则评估,将触发后的告警推送给 Alertmanager,由后者完成去重、分组、静默和路由分发。
4.2 告警规则编写:从指标到告警事件
告警规则是 Prometheus 评估逻辑的核心载体。每条规则定义一组 PromQL 表达式、持续时间和标签。当表达式返回非空结果且满足持续时间条件时,规则进入 Pending 状态,持续满足后转为 Firing 状态并推送至 Alertmanager。
4.2.1 规则文件结构
groups:
- name: kubernetes-pods
interval: 30s
rules:
- alert: PodCrashLoopBackOff
expr: kube_pod_status_phase{phase="Waiting"} == 1
for: 2m
labels:
severity: critical
annotations:
summary: "Pod {{ $labels.namespace }}/{{ $labels.pod }} 处于 CrashLoopBackOff"
description: "Pod 已持续 CrashLoopBackOff 超过 2 分钟,请立即排查。"
| 字段 | 说明 | 示例值 |
|---|---|---|
alert | 告警名称,需唯一 | PodCrashLoopBackOff |
expr | PromQL 表达式,返回非空即触发 | kube_pod_status_phase{phase="Waiting"} == 1 |
for | 持续时间,防止抖动误报 | 2m |
labels | 附加标签,用于路由和分组 | severity: critical |
annotations | 告警描述信息,支持模板变量 | summary: "Pod {{ $labels.pod }} 异常" |
4.2.2 常用自愈场景告警规则示例
- Pod 状态异常:
kube_pod_status_phase{phase=~"Pending|Unknown|Failed"} == 1 - Pod 重启次数过高:
rate(kube_pod_container_status_restarts_total[5m]) > 0.5 - 节点不可用:
kube_node_status_condition{condition="Ready",status="true"} == 0 - PVC 使用率超过阈值:
kubelet_volume_stats_used_bytes / kubelet_volume_stats_capacity_bytes > 0.9 - HTTP 错误率过高:
sum(rate(http_requests_total{status=~"5.."}[5m])) / sum(rate(http_requests_total[5m])) > 0.05
编写建议:始终为告警规则设置
for 持续时间(建议 1-3 分钟),避免瞬时毛刺导致误告警。同时利用 labels 中的 severity 字段区分告警等级,便于 Alertmanager 做差异化路由。
4.3 Alertmanager 配置:路由、分组与通知
Alertmanager 负责接收 Prometheus 推送的告警,执行去重、分组、静默和路由,最终将通知发送到指定渠道。配置核心在于 route 和 receivers 两部分。
4.3.1 配置结构总览
route:
receiver: 'default-receiver'
group_wait: 30s
group_interval: 5m
repeat_interval: 4h
routes:
- match:
severity: critical
receiver: 'pagerduty-critical'
continue: false
receivers:
- name: 'default-receiver'
email_configs:
- to: 'ops@example.com'
- name: 'pagerduty-critical'
pagerduty_configs:
- routing_key: 'your-pagerduty-key'
| 配置项 | 作用 | 推荐值 |
|---|---|---|
group_wait | 同一组告警首次发送前的等待时间,用于聚合 | 30s |
group_interval | 同一组告警发送新告警的最小间隔 | 5m |
repeat_interval | 已发送告警的重复通知间隔 | 4h |
routes | 基于标签匹配的子路由,支持树形结构 | 按 severity / namespace 分流 |
receivers | 通知接收者定义,支持多种渠道 | Email / Slack / PagerDuty / Webhook |
4.3.2 分组与抑制策略
- 分组(Grouping):将相同标签(如
alertname、namespace)的告警合并为一条通知,避免告警风暴。通过group_by: ['alertname', 'namespace']配置。 - 抑制(Inhibition):当高等级告警(如节点宕机)触发时,自动抑制其衍生告警(如该节点上的 Pod 异常)。通过
inhibit_rules配置。 - 静默(Silence):在维护窗口期,通过 Alertmanager UI 或 API 创建静默规则,屏蔽特定标签的告警。
4.4 自愈场景中的告警配置最佳实践
- 标签标准化:所有告警规则统一使用
severity(critical / warning / info)、team、namespace标签,便于 Alertmanager 路由和分组。 - 避免告警风暴:合理设置
group_interval和repeat_interval,对critical级别告警使用更短的重复间隔(如 1h),对warning使用更长间隔(如 6h)。 - 自愈联动:在告警
annotations中携带自愈 Action 的 Webhook URL 或 Runbook 链接,便于自动化触发修复流程。 - 测试验证:使用
amtool命令行工具或 Alertmanager UI 的“测试告警”功能,验证路由和通知配置是否正确。
常见陷阱:Alertmanager 默认不会自动重试发送失败的通知。对于关键告警,建议在 receiver 中启用
send_resolved: true 并配置重试策略(如 PagerDuty 的自动确认机制)。同时注意 group_wait 设置过短会导致分组失效,过长会延迟告警送达。