Kubernetes自愈场景测试:基于SLO的事件触发验证 - 第4节

4.1 Prometheus 整体架构与核心组件

Prometheus 是 Kubernetes 生态中最主流的监控与告警系统,其架构围绕“拉取(Pull)指标、本地存储、规则评估、告警分发”四个核心环节设计。理解其组件关系是编写告警规则和配置 Alertmanager 的前提。

架构要点:Prometheus Server 通过 Service Discovery 发现目标,周期性拉取指标并存储于本地 TSDB;同时独立运行告警规则评估,将触发后的告警推送给 Alertmanager,由后者完成去重、分组、静默和路由分发。
Prometheus 核心架构组件关系 Prometheus Server TSDB 本地存储 HTTP Server / API 规则评估引擎 服务发现 (K8s SD) 拉取 (Pull) 指标 被监控目标 K8s Node / Pod Exporter / 应用 cAdvisor / kubelet Alertmanager 分组 / 抑制 静默 / 路由 发送通知 拉取 /metrics 推送告警 通知渠道 Email / Slack PagerDuty / Webhook 钉钉 / 企业微信 Grafana 可视化 PromQL 查询 / 仪表盘 告警规则管理

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
exprPromQL 表达式,返回非空即触发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 创建静默规则,屏蔽特定标签的告警。
Alertmanager 告警处理流程 Prometheus 告警 去重 分组 路由匹配 抑制检查 静默匹配 发送通知 告警经过去重、分组、路由后,依次经过抑制和静默检查,最终发送到匹配的通知渠道

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 设置过短会导致分组失效,过长会延迟告警送达。