文章

根因定位方法论 (RCA)

根因定位方法论 (RCA)

一句话:RCA 不是”找到谁犯了错”,而是系统化地缩小故障域,直到找到那个如果修复了、同类故障就不再发生的根因

概述

你的 K8s 故障排查方法论操作层的排查框架(从控制面往下查),本篇是方法论层的通用 RCA——适用于任何系统、任何故障类型。

排查方法论 = "怎么查"(工具、命令、路径)
RCA 方法论 = "怎么想"(分析、推理、验证)

两者互补:排查方法论帮你快速缩小范围,RCA 方法论帮你从现象挖到根因。

RCA 核心原则

原则含义反面案例
对事不对人分析系统漏洞,不追究个人责任”XX 改错了配置” → 应该问”为什么配置变更没有防护”
根因 ≠ 表面原因表面原因是”做了什么导致故障”,根因是”为什么允许这样做""数据库连接数超限” → 根因可能是”缺少连接池限制 + 没有容量告警”
一个故障可能有多个根因不要只找到一个就停变更引发故障 → 根因1: 变更无灰度;根因2: 缺少回滚机制;根因3: 监控未覆盖
假设驱动,而非猜测驱动每一步都基于证据排除假设”可能是网络问题” → 要用数据验证,而不是拍脑袋
时间线是基础还原完整时间线,找到因果链跳过时间线直接猜根因,容易遗漏关键关联

方法一:5-Whys 分析法

核心思路

对每个”为什么”,连续追问 5 次(或更多),直到找到可操作的根因——即修复它后,同类故障不再发生。

实战示例

现象:线上 502 错误率飙升

Why 1: 为什么 502 增加?
→ Nginx upstream 连接超时

Why 2: 为什么 upstream 连接超时?
→ 后端服务 Pod 响应变慢

Why 3: 为什么 Pod 响应变慢?
→ Pod 内存使用率 98%,触发 OOM 临界

Why 4: 为什么内存使用率高?
→ 新版本引入内存泄漏(未释放缓存)

Why 5: 为什么内存泄漏能上线?
→ CI 缺少长时间压力测试;Code Review 未覆盖资源管理

根因:
  1. CI 流水线缺少长时间稳定性测试(> 30 min 压测)
  2. Code Review checklist 未包含资源释放检查

Action Items:
  1. CI 增加 30 分钟稳定性压测阶段
  2. Code Review checklist 新增资源管理检查项
  3. 部署 OOM 早期告警(内存 > 85% 告警)

5-Whys 的坑

表现解法
停得太早只问了 2-3 层就给出”根因”问到”可以改流程/制度”的层面才停
分叉不追一个 Why 可能有多个答案,只追了一个每层画分叉树,多路并行追
变成追责”为什么你改了不测试”改成”为什么变更流程允许不测试就上线”
线性思维假设因果是单链的实际故障常是多因叠加,用故障树补充

方法二:故障树分析 (FTA)

核心思路

从故障现象出发,自顶向下拆解成子事件,用布尔逻辑(AND/OR)组合,直到到达基本事件(可直接验证的叶子节点)。

graph TD
    TOP[502 错误率飙升] --> OR1{OR}
    OR1 --> A[upstream 不可达]
    OR1 --> B[upstream 响应超时]
    
    A --> AND1{AND}
    AND1 --> A1[Pod 被驱逐]
    AND1 --> A2[Endpoint 未及时更新]
    
    B --> OR2{OR}
    OR2 --> B1[Pod 内存泄漏]
    OR2 --> B2[下游 DB 慢查询]
    
    A1 --> A1a[节点资源压力]
    A1 --> A1b[Pod 无资源 Limit]
    
    A2 --> A2a[Endpoint Controller 延迟]
    
    B1 --> B1a[新版本内存泄漏]
    B1 --> B1b[CI 缺少稳定性测试]
    
    B2 --> B2a[慢查询未索引]
    B2 --> B2b[缺少慢查询告警]

符号说明

符号含义示例
AND 门所有子事件同时发生才触发父事件Pod 被驱逐 AND Endpoint 未更新 → upstream 不可达
OR 门任一子事件发生即触发父事件内存泄漏 OR DB 慢查询 → 响应超时
基本事件叶子节点,可直接验证/修复CI 缺少稳定性测试

实战步骤

  1. 定义顶事件:描述故障现象(精确、可量化)
  2. 第一层拆解:用 OR 门列出所有可能的原因分类
  3. 逐层深入:对每个子事件继续拆解,直到基本事件
  4. 验证排除:用监控数据/日志/时间线验证每个基本事件是否成立
  5. 确认根因:所有”成立”的基本事件都是根因

方法三:时间线还原法

核心思路

从监控指标、变更记录、告警日志中重建精确的时间线,找到因果关联。

时间线模板

| 时间 | 事件 | 来源 | 影响 | 验证状态 |
|------|------|------|------|----------|
| 14:00 | 发版 v2.3.1 | ArgoCD | 新版本上线 | ✓ 变更日志 |
| 14:05 | 内存使用率开始上升 | Grafana | 内存泄漏趋势 | ✓ 监控图表 |
| 14:15 | 内存 > 85% 告警 | Alertmanager | 早期预警 | ✓ 告警记录 |
| 14:20 | Pod 开始 OOMKilled | K8s Events | Pod 重启 | ✓ kubectl describe |
| 14:22 | 502 错误率开始上升 | Grafana | 用户可感知 | ✓ Nginx 日志 |
| 14:25 | SEV1 告警触发 | PagerDuty | On-Call 被叫醒 | ✓ 告警系统 |
| 14:30 | On-Call 开始响应 | 工单系统 | MTTA = 5min | ✓ 工单记录 |
| 14:35 | 定位到新版本内存泄漏 | Grafana + 日志 | MTTI = 5min | ✓ 排查日志 |
| 14:40 | 触发回滚 | ArgoCD | 恢复操作 | ✓ ArgoCD 日志 |
| 14:45 | 502 错误率归零 | Grafana | 恢复完成 | MTTR = 23min |

关键信息源

信息源提供什么查询方式
CI/CD 系统变更时间、变更内容ArgoCD / Jenkins / GitHub Actions 日志
K8s EventsPod 生命周期事件kubectl get events --sort-by='.lastTimestamp'
监控系统指标变化时间点Grafana / Prometheus 查询
告警系统告警触发/恢复时间Alertmanager / PagerDuty
日志系统应用日志、错误日志Loki / ELK
变更管理配置变更、人工操作工单系统 / 审计日志

方法四:假设排除法

核心思路

列出所有可能的假设,逐一用数据验证或排除,最终锁定根因。

实战流程

Step 1: 列出假设
  H1: 网络问题(NAT/防火墙/DNS)
  H2: 数据库问题(慢查询/连接池耗尽/死锁)
  H3: 应用 Bug(内存泄漏/死锁/逻辑错误)
  H4: 资源不足(CPU/内存/磁盘/FD)
  H5: 上游依赖问题(第三方 API / 消息队列)
  H6: 配置错误(环境变量/配置文件/Secret)

Step 2: 验证排除
  H1: 排除 — 网络延迟正常(Ping/Telnet/Cilium Hubble 流量图正常)
  H2: 排除 — DB 连接数正常,慢查询日志无异常
  H3: 待验证 — 内存使用率曲线持续上升,符合泄漏特征
  H4: 部分确认 — 内存资源紧张,但 CPU/磁盘正常
  H5: 排除 — 第三方 API 响应正常
  H6: 排除 — 配置无变更

Step 3: 聚焦验证
  H3 + H4 确认 → 内存泄漏导致 OOM → 触发 Pod 重启 → 502

Step 4: 深挖根因
  为什么泄漏?→ 新版本缓存未设上限
  为什么没发现?→ CI 缺少压测

RCA 工具链

阶段工具用途
时间线重建Grafana + 注释(annotation)在图表上标注事件时间点
变更追踪ArgoCD / Jenkins / 审计日志排查变更引发的故障
指标分析Prometheus + PromQL验证假设(查历史数据)
日志分析Loki / ELK + LogQL/KQL搜索错误日志、关联事件
链路追踪Jaeger / Tempo + OpenTelemetry定位慢调用/错误调用
网络排查Cilium Hubble / tcpdump排除/确认网络层问题
K8s 排查kubectl + K8s Events参考 K8s 故障排查方法论
RCA 记录工单系统 + Postmortem 模板标准化记录

RCA 产出物

每根 RCA 应产出:

  1. 故障时间线(精确到分钟)
  2. 根因列表(可能有多个,分主次)
  3. 影响面评估(受影响用户数、时长、业务损失)
  4. Action Items 清单(含负责人、截止日期、优先级)
  5. 预防措施(短期修复 + 长期改进)

Action Items 模板

action_items:
  - id: AI-001
    type: 短期修复
    description: 部署内存使用率 85% 告警
    owner: 张三
    due_date: 2026-08-05
    status: done
    priority: P1
  
  - id: AI-002
    type: 长期改进
    description: CI 流水线增加 30 分钟稳定性压测阶段
    owner: 李四
    due_date: 2026-08-15
    status: in_progress
    priority: P1
  
  - id: AI-003
    type: 流程改进
    description: Code Review checklist 新增资源管理检查项
    owner: 王五
    due_date: 2026-08-10
    status: pending
    priority: P2

与 K8s 故障排查方法论的联动

故障发生

  ├── 第一步:用 K8s 故障排查方法论快速缩小范围
  │   (控制面 → 节点 → Pod → 网络 → 存储 → 应用层)

  ├── 第二步:用 RCA 方法论深挖根因
  │   (5-Whys / 故障树 / 时间线 / 假设排除)

  └── 第三步:用无指责复盘记录和跟踪
      (Postmortem 模板 → Action Items → 闭环)

常见问题 / 坑点

问题原因解决方案
RCA 变成追责大会文化问题 + 模板设计不当用 Blameless 模板,禁止出现人名,只分析系统漏洞
只找一个根因就停急于结案用故障树确保覆盖所有可能路径
Action Items 不跟踪没有 owner 和截止日期每个 AI 必须有 owner + due_date + 定期 review
RCA 写完就归档没有闭环验证定期回顾 AI 落地情况,验证同类故障是否减少
忽略”差点出事”的事件只复盘已发生故障对 Near-Miss 也做轻量 RCA

关联知识

参考资源

学习时间

内容日期状态
RCA 方法论总览2026-08-03完成:5-Whys、FTA、时间线、假设排除
实战应用待用现有 02-Issues 回溯练习

状态

  • RCA 核心原则
  • 5-Whys 分析法
  • 故障树分析 (FTA)
  • 时间线还原法
  • 假设排除法
  • 工具链
  • Action Items 模板
  • 实战回溯练习