某互联网公司的微服务集群曾长期受困于告警乱象:单晚触发 200 + 条告警,其中 80% 是重复的 “Pod 重启”“CPU 使用率临时飙升” 等非关键告警,导致运维团队陷入 “告警疲劳”;而真正致命的 “数据库连接池耗尽” 告警被淹没在噪音中,直到用户反馈服务不可用才被发现。更严重的是,即使及时发现故障,也需运维人员手动执行 “重启服务”“扩容实例” 等操作,平均故障恢复时间(MTTR)超过 30 分钟。这正是传统告警体系的核心痛点:告警噪音大、分级不清晰、缺乏自愈能力,无法适应云原生环境下微服务的动态性与复杂性。本文将以 Prometheus Alertmanager 为核心,结合 Grafana、Kubernetes HPA/Job、Argo Rollouts 等工具,构建智能告警与故障自愈体系,实现 “精准告警、分级响应、自动恢复、根因追溯” 的全流程运维闭环。

一、传统告警体系的痛点与智能告警的价值

1. 传统告警体系的四大核心痛点

在云原生微服务架构中,传统基于 “阈值触发” 的告警机制已无法满足运维需求,主要痛点体现在:

  • 告警噪音泛滥:仅依赖静态阈值(如 “CPU 使用率> 80% 触发告警”),未考虑业务波动(如大促期间 CPU 临时飙升)、瞬时抖动(如 1 秒内内存使用率突增后回落),导致大量误报、重复告警,运维人员陷入 “告警疲劳”,错过关键故障;
  • 分级响应缺失:所有告警同等对待(如 “Pod 重启” 与 “数据库不可用” 均发送最高级别通知),未根据故障影响范围(如影响单个用户 / 全量用户)、紧急程度(如可延迟处理 / 需立即介入)进行分级,导致资源错配;
  • 缺乏自愈能力:告警仅作为 “通知工具”,无法自动执行修复操作(如 “Pod 崩溃后自动重启”“数据库连接池耗尽时自动扩容”),必须依赖人工介入,延长故障恢复时间;
  • 根因定位困难:告警信息孤立(如仅提示 “接口响应慢”),未关联相关指标(如 CPU 使用率、数据库查询耗时)、调用链、日志,运维人员需在多个工具间切换,手动拼凑故障线索,定位根因效率低;
  • 动态适配不足:云原生环境下,微服务实例动态伸缩、Pod 频繁创建销毁,传统告警的静态配置(如固定监控目标 IP)无法适配,导致告警遗漏或误报(如实例扩容后未更新告警阈值)。

电商支付服务的告警困境:

支付服务在大促期间,因流量突增触发 “CPU 使用率> 80%” 告警,运维人员收到通知后紧急介入,却发现是正常业务峰值导致的临时飙升;而同期 “支付数据库连接池耗尽” 的告警,因被大量 CPU 告警淹没未被及时处理,最终导致 10% 的支付请求失败,影响营收。

2. 智能告警与故障自愈的核心价值

一套完善的云原生智能告警体系,需实现 “精准检测、分级告警、自动自愈、根因关联”,核心价值包括:

  • 精准告警,减少噪音:结合动态阈值(如基于历史数据的 95 分位数)、异常模式识别(如 “与上周同期相比响应时间增长 2 倍”)、告警抑制(如 “Pod 崩溃告警触发后,抑制该 Pod 的 CPU 告警”),大幅降低误报率;
  • 分级响应,资源优化:根据故障影响范围(如 P0:影响全量用户,P1:影响部分用户,P2:仅内部测试环境)、紧急程度(如 T0:10 分钟内处理,T1:1 小时内处理,T2:24 小时内处理),配置不同的通知渠道(如 P0 告警发送电话 + 钉钉 + 邮件,P2 仅发送邮件)、响应时限,避免资源浪费;
  • 故障自愈,缩短 MTTR:对可自动化修复的故障(如 Pod 崩溃、配置错误、资源不足),通过 Kubernetes Job、HPA、自定义 Operator 等工具自动执行修复操作(如重启 Pod、扩容实例、回滚配置),无需人工介入,将 MTTR 从分钟级降至秒级;
  • 根因关联,提升效率:告警信息自动关联相关指标(如接口响应慢时关联 CPU、内存指标)、调用链(如定位到下游数据库查询耗时高)、日志(如错误堆栈),并生成故障诊断报告,运维人员无需手动拼凑线索;
  • 动态适配,适应云原生:基于 Kubernetes 原生资源(如 Service、Deployment)动态发现监控目标,结合 Prometheus Operator 的声明式配置,实现告警规则的自动更新(如实例扩容后同步调整告警阈值),适配动态环境。

3. 主流智能告警工具对比

工具组合

核心优势

自愈能力

分级告警

根因关联

适用场景

Prometheus Alertmanager+Grafana+K8s HPA/Job

云原生友好、配置灵活、与 K8s 深度集成

中(支持基础自愈)

支持(通过标签分级)

需手动关联

中大型云原生微服务集群

PagerDuty+Opsgenie

专业分级告警、值班调度、事故管理

弱(需集成第三方工具)

强(多维度分级)

重视告警流程规范化的企业

Datadog+Ansible

AI 异常检测、全栈指标关联、自动运行手册

强(支持复杂自愈脚本)

强(自动关联日志 / 调用链)

企业级全栈监控场景

Zabbix+Shell 脚本

部署简单、支持传统 IT 环境

弱(需自定义脚本)

混合 IT 环境(传统 + 云原生)

Elastic Alerting+Elastic Agent

日志 + 指标联动告警、异常模式识别

中(支持基础自愈)

强(日志指标关联)

以日志为核心的监控场景

二、智能告警核心技术:从阈值触发到异常识别

1. 告警触发策略:超越静态阈值

传统告警依赖静态阈值(如 “CPU 使用率> 80%”),无法适应云原生环境的动态变化,智能告警需结合多种触发策略:

1.1 动态阈值:基于历史数据的自适应调整

动态阈值不依赖固定数值,而是基于监控指标的历史数据(如过去 7 天、30 天)计算基准值,当当前指标偏离基准值达到一定程度时触发告警,适用于业务波动大的场景(如电商大促、直播峰值)。

实现方式(PromQL 示例)

  • 基于历史分位数:接口响应时间超过过去 7 天同一时段的 95 分位数 2 倍,触发告警:

http_request_duration_seconds{service="payment-service", endpoint="/pay"} > 2 * quantile_over_time(0.95, http_request_duration_seconds{service="payment-service", endpoint="/pay"}[7d:1h])

  • 基于同比增长:当前 QPS 比上周同期增长超过 1.5 倍,且持续 5 分钟(排除瞬时波动):

increase(http_requests_total{service="payment-service"}[5m]) / increase(http_requests_total{service="payment-service"}[5m] offset 7d) > 1.5

1.2 异常模式识别:捕捉非阈值类异常

部分异常无法通过阈值触发(如 “接口响应时间波动频率突然增加”“调用链中新增异常节点”),需通过异常模式识别算法(如标准差、变异系数、趋势分析)检测。

实现方式(PromQL 示例)

  • 标准差异常:接口响应时间的标准差超过过去 1 小时平均值的 3 倍(波动过大):

stddev_over_time(http_request_duration_seconds{service="payment-service"}[1h]) > 3 * avg_over_time(http_request_duration_seconds{service="payment-service"}[1h])

  • 趋势异常:CPU 使用率在 10 分钟内持续上升,且累计增长超过 30%(非瞬时抖动):

(avg_over_time(node_cpu_usage_seconds_total{mode!="idle"}[5m] offset 0m) - avg_over_time(node_cpu_usage_seconds_total{mode!="idle"}[5m] offset 10m)) / avg_over_time(node_cpu_usage_seconds_total{mode!="idle"}[5m] offset 10m) > 0.3

1.3 告警抑制与分组:减少重复噪音

通过告警抑制(高优先级告警触发后,抑制低优先级关联告警)、告警分组(将同一服务、同一类型的告警合并为一条通知),避免重复通知,突出关键信息。

示例:Prometheus Alertmanager 抑制规则

当 “支付服务 Deployment 不可用”(高优先级)告警触发后,抑制该 Deployment 下所有 Pod 的 “CPU 使用率高”“内存使用率高”(低优先级)告警:

route:

group_by: ['alertname', 'service', 'deployment'] # 按告警名、服务名、Deployment分组

group_wait: 30s # 分组等待时间(收集同组告警后合并发送)

group_interval: 5m # 同组告警再次发送间隔

repeat_interval: 1h # 同一告警重复发送间隔

receiver: 'default-receiver'

routes:

- match:

severity: 'critical' # 高优先级告警(P0)

receiver: 'critical-receiver'

continue: true # 继续向下匹配抑制规则

inhibit_rules:

- source_match:

severity: 'critical' # 源告警(高优先级)

target_match:

severity: 'warning' # 目标告警(低优先级)

equal: ['service', 'deployment'] # 仅抑制同一服务、同一Deployment的低优先级告警

2. 告警分级标准:建立响应体系

基于故障的影响范围、紧急程度、业务价值,建立标准化的告警分级体系,确保资源合理分配:

告警级别

影响范围

紧急程度

业务影响

通知渠道

响应时限

处理流程

P0(致命)

全量用户 / 核心业务中断

需立即介入(10 分钟内)

直接影响营收 / 用户留存

电话 + 钉钉群 @所有人 + 邮件 + 短信

10 分钟内

运维 + 开发紧急响应,启动故障预案

P1(严重)

部分用户(>10%)/ 非核心业务中断

需快速处理(1 小时内)

影响部分用户体验,无直接营收损失

钉钉群 @值班人员 + 邮件

1 小时内

值班运维处理,必要时联动开发

P2(一般)

少量用户(<10%)/ 功能异常

可延迟处理(4 小时内)

影响极小,用户可通过其他方式规避

钉钉群通知 + 邮件

4 小时内

运维常规处理,无需开发介入

P3(提示)

内部测试环境 / 非业务影响

可 24 小时内处理

无用户影响,仅需记录跟踪

仅邮件通知,无需实时响应

24 小时内

运维定期处理(如周末统一优化)

示例:P0 级告警场景

  • 支付服务所有实例崩溃,导致全量支付请求失败;
  • 数据库主从切换失败,核心业务数据无法读写;
  • 网关服务宕机,所有用户无法访问应用。

示例:P3 级告警场景

  • 测试环境某 Pod 重启次数超过 5 次;
  • 监控系统自身指标(如 Prometheus 存储使用率 > 80%);
  • 非核心服务(如后台管理系统)的接口响应时间超过 2 秒。

三、实战:基于 Prometheus 的智能告警体系搭建

1. 环境准备

  • 基础环境:Kubernetes 1.24 + 集群、Prometheus 2.40+、Alertmanager 0.25+、Grafana 9.0+;
  • 工具依赖:Prometheus Operator(用于声明式配置告警规则)、kube-state-metrics(采集 K8s 资源指标)、blackbox-exporter(监控 HTTP/ICMP 可用性);
  • 自愈工具:Kubernetes HPA(弹性伸缩)、Job(一次性修复任务)、Custom Resource Definitions(CRD,如 Argo Rollouts 用于灰度发布回滚)。

2. 核心配置:Prometheus 告警规则与 Alertmanager

通过 Prometheus Operator 的PrometheusRule CRD 定义告警规则,结合 Alertmanager 配置分级通知、抑制规则,实现精准告警。

2.1 定义智能告警规则(prometheus-rules.yaml)

涵盖 K8s 资源、微服务指标、业务指标的分级告警规则,结合动态阈值、异常模式识别:

apiVersion: monitoring.coreos.com/v1

kind: PrometheusRule

metadata:

name: cloud-native-alert-rules

namespace: monitoring

labels:

release: prometheus-stack # 与Prometheus实例标签匹配

spec:

groups:

# 1. K8s资源告警(P0/P1级)

- name: kubernetes-resources

rules:

# P0:Deployment可用实例数为0(核心业务中断)

- alert: DeploymentUnavailable

expr: kube_deployment_status_replicas_available{namespace=~"production|staging"} == 0

for: 2m

labels:

severity: critical # P0级

alert_level: P0

business_domain: k8s-resource

annotations:

summary: "Deployment {{ $labels.deployment }} 无可用实例"

description: "命名空间 {{ $labels.namespace }} 下的Deployment {{ $labels.deployment }} 可用实例数为0,已持续2分钟,影响全量用户,请立即处理!"

runbook_url: "https://wiki.example.com/alerts/deployment-unavailable"

grafana_url: "http://grafana.example.com/d/k8s-deployment?var-namespace={{ $labels.namespace }}&var-deployment={{ $labels.deployment }}"

# P1:Pod崩溃次数过多(部分用户受影响)

- alert: PodCrashLooping

expr: increase(kube_pod_status_restart_count{namespace=~"production|staging"}[10m]) > 3

for: 1m

labels:

severity: warning # P1级

alert_level: P1

business_domain: k8s-resource

annotations:

summary: "Pod {{ $labels.pod }} 频繁崩溃"

description: "命名空间 {{ $labels.namespace }} 下的Pod {{ $labels.pod }} 10分钟内重启超过3次,可能影响部分用户,请1小时内处理!"

runbook_url: "https://wiki.example.com/alerts/pod-crash-looping"

logs_url: "http://kibana.example.com/app/discover#/?_a=(filters:!((query:(match:(kubernetes.pod.name:(query:'{{ $labels.pod }}',type:phrase)))))&_g=(time:(from:now-1h%2Fm,to:now))"

# 2. 微服务性能告警(P1/P2级)

- name: microservice-performance

rules:

# P1:接口响应时间异常(基于动态阈值)

- alert: ApiResponseTimeHigh

expr: |

http_request_duration_seconds{namespace="production", service=~"order|payment|user"} >

2 * quantile_over_time(0.95, http_request_duration_seconds{namespace="production", service=~"order|payment|user"}[7d:1h])

for: 5m

labels:

severity: warning # P1级

alert_level: P1

business_domain: microservice

annotations:

summary: "{{ $labels.service }} 服务 {{ $labels.endpoint }} 接口响应慢"

description: "{{ $labels.service }} 服务的 {{ $labels.endpoint }} 接口响应时间({{ $value | humanizeDuration }})超过过去7天同期95分位数的2倍,已持续5分钟,影响部分用户,请1小时内处理!"

trace_url: "http://skywalking.example.com/trace?service={{ $labels.service }}&endpoint={{ $labels.endpoint }}&startTime={{ $value | timestamp | subtract 300 | toInt64 }}"

# P2:接口错误率升高(基于同比异常)

- alert: ApiErrorRateHigh

expr: |

sum(rate(http_requests_total{namespace="production", status=~"5.."}[5m])) by (service, endpoint) /

sum(rate(http_requests_total{namespace="production"}[5m])) by (service, endpoint) >

1.5 * (sum(rate(http_requests_total{namespace="production", status=~"5.."}[5m] offset 7d)) by (service, endpoint) /

sum(rate(http_requests_total{namespace="production"}[5m] offset 7d)) by (service, endpoint))

for: 10m

labels:

severity: info # P2级

alert_level: P2

business_domain: microservice

annotations:

summary: "{{ $labels.service }} 服务 {{ $labels.endpoint }} 接口错误率高"

description: "{{ $labels.service }} 服务的 {{ $labels.endpoint }} 接口错误率({{ $value | humanizePercentage }})比上周同期高50%,已持续10分钟,影响极小,请4小时内处理!"

# 3. 业务指标告警(P0/P1级)

- name: business-metrics

rules:

# P0:支付成功率低于99.9%(核心业务受影响)

- alert: PaymentSuccessRateLow

expr: |

sum(rate(payment_success_total{namespace="production"}[5m])) /

(sum(rate(payment_success_total{namespace="production"}[5m])) + sum(rate(payment_failure_total{namespace="production"}[5m]))) 999

for: 1m

labels:

severity: critical # P0级

alert_level: P0

business_domain: business

annotations:

summary: "支付服务成功率低于99.9%"

description: "支付服务成功率({{ $value | humanizePercentage }})低于99.9%,已持续1分钟,直接影响营收,请立即处理!"

business_dashboard: "http://grafana.example.com/d/payment-dashboard"

2.2 配置 Alertmanager 分级通知与抑制规则(alertmanager-config.yaml)

根据告警级别配置不同的通知渠道(如 P0 级发送电话 + 钉钉,P1 级仅发送钉钉),并设置抑制规则减少噪音:

apiVersion: monitoring.coreos.com/v1

kind: AlertmanagerConfig

metadata:

name: smart-alert-config

namespace: monitoring

labels:

release: prometheus-stack

spec:

# 全局配置(如SMTP服务器、钉钉机器人)

global:

resolve_timeout: 5m

smtp_from: 'alertmanager@example.com'

smtp_smarthost: 'smtp.example.com:587'

smtp_auth_username: 'alertmanager@example.com'

smtp_auth_password:

name: smtp-secret

key: password

smtp_require_tls: true

# 告警路由规则

route:

group_by: ['alert_level', 'service', 'namespace'] # 按告警级别、服务名、命名空间分组

group_wait: 30s # 等待30秒收集同组告警

group_interval: 5m # 同组告警5分钟内不再重复发送

repeat_interval: 1h # 同一告警1小时内不再重复发送

receiver: 'default-receiver' # 默认接收者

# 分级路由:P0级告警

routes:

- match:

alert_level: P0

receiver: 'p0-alert-receiver'

continue: true # 继续向下匹配抑制规则

# P1级告警

- match:

alert_level: P1

receiver: 'p1-alert-receiver'

continue: true

# P2级告警

- match:

alert_level: P2

receiver: 'p2-alert-receiver'

continue: true

# P3级告警

- match:

alert_level: P3

receiver: 'p3-alert-receiver'

continue: false

# 告警抑制规则:高优先级告警抑制低优先级关联告警

inhibit_rules:

- source_match:

alert_level: P0

target_match:

alert_level: ~"P1|P2|P3"

equal: ['service', 'namespace', 'deployment'] # 仅抑制同一服务、命名空间、Deployment的低优先级告警

target_match_re:

severity: 'warning|info'

- source_match:

alert_level: P1

target_match:

alert_level: ~"P2|P3"

equal: ['service', 'namespace']

target_match_re:

severity: 'info'

# 告警接收者配置

receivers:

# P0级告警接收者:电话+钉钉+邮件

- name: 'p0-alert-receiver'

webhook_configs:

- url: 'https://oapi.dingtalk.com/robot/send?access_token=p0-dingtalk-token' # P0专属钉钉机器人(@所有人)

send_resolved: true

http_config:

tls_config:

insecureSkipVerify: true

message_body: |-

{

"msgtype": "markdown",

"markdown": {

"title": "[P0 致命告警] {{ .CommonLabels.alertname }}",

"text": "### 致命告警(需10分钟内处理)\n" +

"**告警名称**:{{ .CommonLabels.alertname }}\n" +

"**服务名称**:{{ .CommonLabels.service }}\n" +

"**命名空间**:{{ .CommonLabels.namespace }}\n" +

"**开始时间**:{{ .StartsAt.Format "2006-01-02 15:04:05" }}\n" +

"**告警描述**:{{ .CommonAnnotations.description }}\n" +

"**处理手册**:[点击查看]({{ .CommonAnnotations.runbook_url }})\n" +

"**监控仪表盘**:[点击查看]({{ .CommonAnnotations.grafana_url }})\n" +

"@所有人"

}

}

email_configs:

- to: 'ops-team@example.com, dev-team@example.com'

subject: '[P0 致命告警] {{ .CommonLabels.alertname }}'

html: |-

<h2>P0 致命告警(需10分钟内处理)>

告警名称:{{ .CommonLabels.alertname }}

名称:{{ .CommonLabels.service }} {{ .CommonLabels.namespace }}</p>

<p>开始时间:{{ .StartsAt.Format "2006-01-02 15:04:05" }} :{{ .CommonAnnotations.description }}</p>

<p>处理手册:<a href="{{ .CommonAnnotations.runbook_url }}">点击查看</a>

# 电话通知(集成第三方电话告警服务,如PagerDuty)

webhook_configs:

- url: 'https://api.pagerduty.com/v2/enqueue'

send_resolved: true

http_config:

headers:

Authorization: 'Token token=pagerduty-token'

Content-Type: 'application/json'

message_body: |-

{

"routing_key": "p0-alert-routing-key",

"event_action": "{{ if .Resolved }}resolve{{ else }}trigger{{ end }}",

"payload": {

"summary": "[P0 致命告警] {{ .CommonLabels.alertname }}",

"source": "{{ .CommonLabels.service }}",

"severity": "critical",

"custom_details": {

"description": "{{ .CommonAnnotations.description }}",

"runbook_url": "{{ .CommonAnnotations.runbook_url }}"

}

}

}

# P1级告警接收者:钉钉+邮件

- name: 'p1-alert-receiver'

webhook_configs:

- url: 'https://oapi.dingtalk.com/robot/send?access_token=p1-dingtalk-token' # P1专属钉钉机器人(@值班人员)

send_resolved: true

message_body: |-

{

"msgtype": "markdown",

"markdown": {

"title": "[P1 严重告警] {{ .CommonLabels.alertname }}",

"text": "### ⚠️ 严重告警(需1小时内处理)\n" +

"**告警名称**:{{ .CommonLabels.alertname }}\n" +

"**服务名称**:{{ .CommonLabels.service }}\n" +

"**命名空间**:{{ .CommonLabels.namespace }}\n" +

"**开始时间**:{{ .StartsAt.Format "2006-01-02 15:04:05" }}\n" +

"**告警描述**:{{ .CommonAnnotations.description }}\n" +

"**处理手册**:[点击查看]({{ .CommonAnnotations.runbook_url }})\n" +

"@值班人员"

}

}

email_configs:

- to: 'ops-oncall@example.com'

subject: '[P1 严重告警] {{ .CommonLabels.alertname }}'

html: |-

严重告警(需1小时内处理)>

告警名称:{{ .CommonLabels.alertname }}

名称:{{ .CommonLabels.service }} {{ .CommonLabels.namespace }}</p>

<p>开始时间:{{ .StartsAt.Format "2006-01-02 15:04:05" }} :{{ .CommonAnnotations.description }} P2级告警接收者:仅钉钉

- name: 'p2-alert-receiver'

webhook_configs:

- url: 'https://oapi.dingtalk.com/robot/send?access_token=p2-dingtalk-token' # P2专属钉钉机器人(普通通知)

send_resolved: true

message_body: |-

{

"msgtype": "markdown",

"markdown": {

"title": "[P2 一般告警] {{ .CommonLabels.alertname }}",

"text": "### ℹ️ 一般告警(需4小时内处理)\n" +

"**告警名称**:{{ .CommonLabels.alertname }}\n" +

"**服务名称**:{{ .CommonLabels.service }}\n" +

"**命名空间**:{{ .CommonLabels.namespace }}\n" +

"**开始时间**:{{ .StartsAt.Format "2006-01-02 15:04:05" }}\n" +

"**告警描述**:{{ .CommonAnnotations.description }}\n"

}

}

# P3级告警接收者:仅邮件

- name: 'p3-alert-receiver'

email_configs:

- to: 'ops-team@example.com'

subject: '[P3 提示告警] {{ .CommonLabels.alertname }}'

html: |-

3 提示告警(需24小时内处理)</h2>

{{ .CommonLabels.alertname }}</p>

<p>服务名称:{{ .CommonLabels.service }}</p>

命名空间:{{ .CommonLabels.namespace }}

时间:{{ .StartsAt.Format "2006-01-02 15:04:05" }}</p>

<p>告警描述:{{ .CommonAnnotations.description }}

2.3 部署告警规则与 Alertmanager 配置

# 1. 创建SMTP密码Secret

kubectl create secret generic smtp-secret -n monitoring --from-literal=password="smtp-password"

# 2. 部署Prometheus告警规则

kubectl apply -f prometheus-rules.yaml

# 3. 部署Alertmanager配置

kubectl apply -f alertmanager-config.yaml

# 4. 验证配置:查看Prometheus告警规则是否加载

kubectl port-forward svc/prometheus-stack-kube-prome-prometheus 9090:9090 -n monitoring

# 访问http://localhost:9090/alerts,确认规则状态为"Active"或"Pending"

# 5. 验证Alertmanager配置是否生效

kubectl port-forward svc/prometheus-stack-kube-prome-alertmanager 9093:9093 -n monitoring

# 访问http://localhost:9093/#/status,查看"Configuration"是否正确加载

3. Grafana 智能告警:可视化异常检测

Grafana 除了作为指标可视化工具,还支持基于仪表盘面板的智能告警(如 “图表中指标超过动态阈值”),尤其适合业务人员配置告警(无需编写 PromQL)。

3.1 创建 Grafana 动态阈值告警

以 “支付服务成功率仪表盘” 为例,创建基于动态阈值的告警:

  1. 进入 Grafana → 打开 “支付服务成功率仪表盘” → 编辑 “支付成功率” 面板;
  1. 点击 “Alert” 标签 → “Create Alert”;
  1. 配置告警规则:
    • Alert name:“支付成功率低于 99.9%(Grafana)”;
    • Evaluation interval:5s(告警评估间隔);
    • Condition
      • Query:选择支付成功率的 PromQL 查询(sum(rate(payment_success_total[5m])) / (sum(rate(payment_success_total[5m])) + sum(rate(payment_failure_total[5m]))));
      • Reducer:Mean(取平均值);
      • Threshold:.999;
      • For:1m(持续 1 分钟触发);
    • Dynamic threshold(可选):启用 “Dynamic threshold”,设置 “Based on 7 days of history”,告警阈值自动基于过去 7 天的历史数据调整(如 “低于历史同期 95% 的值”);
  1. 配置通知渠道:
    • 选择 “p0-alert-receiver”(与 Alertmanager 的 P0 接收者一致);
    • 设置告警消息模板,包含仪表盘链接、当前成功率等信息;
  1. 保存告警,启用 “Enable alert”。

####Enable alert”。

3.2 Grafana 告警与 Prometheus 告警的协同

Grafana 告警与 Prometheus 告警并非互斥,而是互补:

  • Prometheus 告警:适合底层指标(如 CPU 使用率、Pod 重启次数)、复杂 PromQL 逻辑(如动态阈值、同比异常)的告警,配置灵活但需了解 PromQL;
  • Grafana 告警:适合业务仪表盘(如支付成功率、订单量)的告警,可视化配置、无需编写 PromQL,适合业务人员使用;
  • 协同策略:底层指标告警由 Prometheus 负责,业务指标告警由 Grafana 负责,两者共享 Alertmanager 的分级通知与抑制规则,确保告警体系统一。

四、故障自愈实战:从告警到自动修复

1. 自愈场景分类与实现方案

根据故障类型,云原生环境下的自愈场景可分为三类,对应不同的实现方案:

自愈场景

故障描述

实现工具

修复逻辑

资源不足自愈

CPU / 内存使用率过高、数据库连接池耗尽

K8s HPA、Vertical Pod Autoscaler(VPA)

基于指标自动扩容实例数(HPA)、调整 Pod 资源限制(VPA)

实例故障自愈

Pod 崩溃、容器无响应、实例健康检查失败

K8s Deployment 重启策略、Pod Disruption Budget(PDB)

自动重启故障 Pod、确保最小可用实例数(PDB)

配置错误自愈

配置参数错误(如数据库地址写错)、版本回滚需求

Argo Rollouts、K8s Job

自动回滚到上一个稳定版本、执行配置修复脚本(Job)

依赖故障自愈

数据库主从切换、缓存集群故障

自定义 Operator、Service Mesh(如 Istio)

自动切换数据库从库、路由流量到备用缓存集群

2. 实例故障自愈:Pod 崩溃自动重启与扩容

以 “支付服务 Pod 崩溃” 为例,通过 K8s Deployment 重启策略、HPA 实现自愈:

2.1 Deployment 配置自愈策略(payment-deployment.yaml)

apiVersion: apps/v1

kind: Deployment

metadata:

name: payment-service

namespace: production

spec:

replicas: 3

selector:

matchLabels:

app: payment-service

strategy:

rollingUpdate:

maxSurge: 1 # 滚动更新时最大额外实例数

maxUnavailable: 0 # 滚动更新时最小可用实例数

template:

metadata:

labels:

app: payment-service

spec:

containers:

- name: payment-service

image: registry.example.com