文章

SRE 面试备战手册

SRE 面试备战手册

基于 2026-08-03 模拟面试整理,覆盖 JD 全维度考点、标准答案、薄弱点分析与补强计划。关联知识库已有笔记,形成完整知识网络。

概述

目标岗位:SRE 工程师,JD 核心四条:

  1. MTTR/MTBF 体系建设,线上稳定性负责
  2. 云基础架构(容量规划、高可用、问题响应、根因定位)
  3. SRE 工具链与稳定性工程建设
  4. SRE Agent 等 AI 应用提效落地

候选人背景:东北大学 985 本科(非 CS 科班),轻松健康集团运维开发工程师,负责互联网医疗 C 端业务 SRE。

JD 拆解与匹配度

序号职责面试考察点
1MTTR/MTBF 体系建设SLO/SLI 定义、MTTR 四段模型、错误预算管理、RCA 闭环
2云基础架构K8s 调度/HPA/资源治理、故障排查方法论、高可用设计
3SRE 工具链CI/CD、监控告警体系、自动化巡检、Runbook
4SRE Agent / AI 提效LLM Tool Calling、AIOps 架构、知识库设计、Agent 循环
要求匹配度说明
211+ 学历优先,计算机相关⚠️ 部分985 满足学历,但专业为资源循环科学与工程
2 年以上经验✅ 满足2022.06 至今约 4 年,SRE 方向约 2 年
熟悉 Golang/Python⚠️ 偏弱项目中用了 Python/Go,但代码基础能力需加强
熟悉 SRE 方法论⚠️ 偏弱有实践但缺乏体系化认知
AI 应用对运维提效✅ 亮点AI 根因分析、AI 巡检、Ops Workbench 方向高度匹配

自我介绍优化

[!warning] 原始回答的问题 “核心竞争力是勇于学习新事物” — 学习意愿是基本盘,不是核心竞争力。面试官想听的是”你做了什么别人做不了的事”。

[!tip] 优化版本 “我是徐航,东北大学 985 本科,目前在轻松健康集团负责互联网医疗 C 端业务的 SRE 与运维开发。

核心竞争力三点:

  1. AI 驱动的故障定位:独立设计 AI 根因分析系统,融合 SkyWalking 链路、SLS 日志和 Prometheus 指标,通过 LLM Tool Calling 渐进式分析,故障定位时间从约 1 小时降至约 30 分钟,降幅 50%。
  2. K8s 规模化治理:管理 4 套 ACK 环境、200 节点、1000 微服务、3000 Pod,负责容量规划、HPA 策略、OOM/Pending 治理,保障核心业务 99.9% 可用性。
  3. 运维全栈开发:Python/Go/Rust 均有项目落地,独立开发 OpsAgent(Go)、mySSH(Rust)、SSL 证书分发平台(Python+React 全栈)等工具。“

SLI / SLO / MTTR / MTBF 体系

[!info] 关联笔记 详见 MTTR 与 MTBF 体系详解,本节为面试精简版。根因定位方法论见 根因定位方法论

SLI 与 SLO

SLI = 成功请求数 / 总请求数    (必须精确定义"成功")
SLO = SLI ≥ 99.9%              (目标值)

“成功”必须精确定义——面试必答:

维度必须回答举例
哪些请求算全量 HTTP 请求还是特定接口?排除健康检查/内部探活
什么状态算成功2xx+3xx?4xx 算不算?5xx 算失败,4xx(客户端错误)不算 SLI 分母
统计窗口28 天滚动窗口Google SRE 标准做法
采样方式全量还是采样全量采集

错误预算

99.9% 可用性 = 每月允许 43.2 分钟不可用

预算消耗策略:
  < 50%  → 正常发布,可承担风险
  50-80% → 只允许低风险变更
  > 80%  → 冻结非紧急发布
  耗尽   → 完全冻结发布,强制稳定性建设

MTTR 四段拆解

详见 MTTR 与 MTBF 体系详解,面试精简版:

故障发生 ──→ 检测 ──→ 响应 ──→ 诊断 ──→ 修复 ──→ 恢复
         |-- MTTD --||-- MTTA --||-- Diagnose --||-- Fix --|

MTTR = MTTD + MTTA + Diagnose + Fix
阶段全称含义优化手段
MTTDMean Time To Detect故障发生到告警触发告警规则优化、指标采集频率
MTTAMean Time To Acknowledge告警触发到人工响应值班机制、告警分级、告警收敛
Diagnose诊断时间开始排查到定位根因日志/链路/指标关联、AI 根因分析
Fix修复时间定位根因到执行恢复回滚、扩容、切流、自动化 Runbook

[!tip] 关键连接点 你的 AI 根因分析项目 = 优化 Diagnose 环节。这就是项目跟 JD 第 1 条的连接点,面试时一定要这样表述。

MTBF 提升

K8s 容量与 HPA 故障排查

[!info] 关联笔记 弹性伸缩详见 弹性伸缩策略,故障排查详见 故障生命周期管理

场景题

某核心服务配 HPA:CPU request=2 核,target utilization=80%,min=2,max=20。大促流量来了,Pod 从 2 扩到 20,但扩容跟不上,出现 503。

HPA 关键参数

参数作用默认值
target utilization触发扩容的 CPU 阈值80%
scaleUp behavior扩容速率限制max(2, 当前×25%) 每 15 秒
scaleDown behavior缩容速率限制更保守
HPA controller 轮询间隔多久评估一次15 秒
metrics-server 延迟指标采集延迟15-30 秒

排查思路(自上而下)

步骤排查方向关键命令
HPA 扩得慢不慢kubectl describe hpa <name> 看 Events、LastScaleTime
Pod 有没有 Pendingkubectl get pods -o wide + kubectl describe pod
Pod Ready 慢不慢kubectl describe pod 看 Events 中的 Readiness probe
Ready 了流量没进来SLB/Ingress backend health check 更新状态
下游瓶颈DB/Redis 连接数和负载

根因概率排序

根因概率说明
节点不足导致 Pending集群没有多余节点可调度,最常见
HPA 扩容速率限制中高默认 behavior 太保守
Pod 冷启动慢应用初始化 + readiness probe 延迟
上游 LB 健康检查延迟SLB backend 更新有延迟
下游依赖瓶颈水平扩容不解决下游

HPA 加速扩容配置

behavior:
  scaleUp:
    stabilizationWindowSeconds: 0  # 不做稳定窗口等待
    policies:
      - type: Percent
        value: 100
        periodSeconds: 15           # 每 15 秒最多扩 100%
    selectPolicy: Max

[!tip] 预防措施 预扩节点池、优化 readiness probe 缩短 initialDelaySeconds、大促前手动扩到目标副本数。

AI 根因分析系统架构

[!info] 关联笔记 SRE Agent 落地详见 SRE Agent 运维落地实践,LLM 辅助 RCA 详见 LLM 辅助 RCA 与日志分析,AIOps 详见 AIOps 实践与智能运维

系统整体架构

graph TD
    ALERT[告警系统 Prometheus] -->|Webhook| ENTRY[AI根因分析入口<br/>构建初始Context]
    ENTRY --> LLM[LLM 推理 + Tool Calling 循环]
    LLM -->|调用| TOOLS[Tool 注册表]
    TOOLS --> T1[query_skywalking_trace]
    TOOLS --> T2[query_sls_logs]
    TOOLS --> T3[query_prometheus_metrics]
    TOOLS --> T4[query_k8s_status]
    TOOLS --> T5[query_k8s_events]
    TOOLS --> T6[search_rca_knowledge]
    LLM -->|输出| RESULT[根因分析 + 处理建议]
    RESULT --> KB[知识库/案例库<br/>结构化存储]
    KB -.->|相似度匹配| LLM

502 故障分析完整链路

[!example] 标准示例:502 错误率飙升的渐进式分析

Round 1 — 定位故障层

  • LLM 思考:502 是网关错误,先看调用链定位失败在哪一跳
  • → Toolquery_skywalking_trace(service="service-A", time_range="最近10分钟")
  • → 结果:SLB→Ingress→service-A 正常,service-A→service-B 大量 502
  • → 收敛:故障在 service-A → service-B 这一跳

Round 2 — 查后端日志

  • LLM 思考:service-B 连不上或异常,查日志
  • → Toolquery_sls_logs(service="service-B", keyword="error", time_range="最近10分钟")
  • → 结果:日志出现 “OOMKilled” / “connection refused”
  • → 收敛:service-B Pod 可能挂了

Round 3 — 确认 Pod 状态

  • → Toolquery_k8s_status(namespace="prod", resource="service-B")
  • → 结果:3/5 Ready,2 个 Pod 处于 CrashLoopBackOff
  • → Toolquery_k8s_events(namespace="prod", resource="service-B")
  • → 结果:“OOMKilled”,最近 5 分钟重启 8 次

Round 4 — 监控指标确认

  • → Toolquery_prometheus_metrics(metric="container_memory_working_set_bytes", service="service-B")
  • → 结果:内存使用在流量高峰突增到 limit 上限

Round 5 — 输出根因和建议

  • 根因:service-B memory limit (512Mi) 过低,流量高峰 OOM,Pod CrashLoop
  • 建议:提升 limit 至 1Gi、检查 HPA、排查内存泄漏

Round 6 — 知识库沉淀

  • 存入:{症状:"502飙升", 根因:"OOM", 服务:"service-B", 方案:"提升limit"}
  • 下次类似告警优先匹配历史案例,加速收敛

面试必答的关键设计点

  1. 不是一次性丢所有数据给 LLM — 每轮根据上一步结果决定下一步查什么,这是”渐进式收敛”的本质
  2. Tool Calling 的决策权在 LLM — 你设计了 Tool 的 schema 和描述,引导 LLM 走正确排查路径
  3. 知识库不是简单文档 — 结构化的”症状→根因→解决方案”案例库,支持相似度匹配
  4. 护栏机制 — 限制最大轮次(防死循环)、加超时控制、加结果校验

告警去重器(代码题)

题目

实现 AlertDeduplicator:相同 service+severity 的告警 5 分钟内只保留第一条,支持并发安全。

Python 实现

import threading
import time
from dataclasses import dataclass


@dataclass
class Alert:
    service: str
    severity: str
    message: str


class AlertDeduplicator:
    def __init__(self, window_seconds: int = 300):
        self._lock = threading.Lock()
        self._last_seen: dict[str, float] = {}  # "service:severity" → timestamp
        self._window = window_seconds
        self._stop = threading.Event()
        t = threading.Thread(target=self._cleanup_loop, daemon=True)
        t.start()

    def should_alert(self, alert: Alert) -> bool:
        key = f"{alert.service}:{alert.severity}"
        now = time.time()
        with self._lock:
            last = self._last_seen.get(key)
            if last is not None and (now - last) < self._window:
                return False  # 窗口内重复,丢弃
            self._last_seen[key] = now
            return True  # 首次或已过期,放行

    def _cleanup_loop(self):
        while not self._stop.wait(60):  # 每 60 秒清理一次
            now = time.time()
            with self._lock:
                expired = [
                    k for k, v in self._last_seen.items()
                    if (now - v) >= self._window
                ]
                for k in expired:
                    del self._last_seen[k]

    def stop(self):
        self._stop.set()

Go 实现

package main

import (
    "sync"
    "time"
)

type Alert struct {
    Service  string
    Severity string
    Message  string
}

type AlertDeduplicator struct {
    mu       sync.Mutex
    lastSeen map[string]time.Time
    window   time.Duration
    stopCh   chan struct{}
}

func NewAlertDeduplicator(window time.Duration) *AlertDeduplicator {
    d := &AlertDeduplicator{
        lastSeen: make(map[string]time.Time),
        window:   window,
        stopCh:   make(chan struct{}),
    }
    go d.cleanupLoop()
    return d
}

func (d *AlertDeduplicator) ShouldAlert(a Alert) bool {
    key := a.Service + ":" + a.Severity
    d.mu.Lock()
    defer d.mu.Unlock()

    now := time.Now()
    if last, ok := d.lastSeen[key]; ok {
        if now.Sub(last) < d.window {
            return false // 窗口内重复,丢弃
        }
    }
    d.lastSeen[key] = now
    return true // 首次或已过期,放行
}

func (d *AlertDeduplicator) cleanupLoop() {
    ticker := time.NewTicker(1 * time.Minute)
    defer ticker.Stop()
    for {
        select {
        case <-ticker.C:
            d.mu.Lock()
            now := time.Now()
            for key, last := range d.lastSeen {
                if now.Sub(last) >= d.window {
                    delete(d.lastSeen, key)
                }
            }
            d.mu.Unlock()
        case <-d.stopCh:
            return
        }
    }
}

func (d *AlertDeduplicator) Stop() {
    close(d.stopCh)
}

设计要点

设计决策原因
数据结构用 map/dictO(1) 查找,key 用 service:severity 组合键
并发用 Mutex/Lockmap 不是并发安全的,多协程同时写会 panic
锁粒度在函数级简单够用;高 QPS 可优化为分片锁或 sync.Map
后台清理 goroutine/thread防止 map 无限增长,每分钟扫一次删过期 key
返回 bool 而非直接丢弃让调用方决定处理方式,解耦

[!question] 进阶追问

  • 告警量大锁竞争严重? → 分片锁(按 key hash 分 N 个桶),或 sync.Map
  • 进程重启内存丢了? → 5 分钟窗口短影响有限;严格可用 Redis SET key val EX 300 NX
  • 分布式去重? → Redis: SET service:severity:timestamp NX EX 300,TTL 自动过期

面试评估总结

各板块评分

板块评分关键问题补强方向
SLI/SLO/MTTR⚠️ 偏弱99.9% 写简历但讲不清落地;MTTR/MTBF 不了解理解 MTTR 四段模型,把 AI 项目定位为优化 Diagnose 环节
K8s/云原生⚠️ 中下HPA 场景排查思路浅,概念混淆手动跑命令,理解 behavior policies 参数
AI/AIOps 项目⚠️ 有亮点方向对但讲不清系统细节画架构图:Tool 列表→LLM 循环→知识库→输出
代码能力❌ 需补强不能默写基础并发代码去重器、限流器、生产者消费者,手写一遍

[!success] 核心优势

  • 985 院校背景(东北大学)
  • AI+运维项目方向与 JD 高度匹配
  • 技术栈广(Python/Go/Rust),有技术热情和自驱力
  • 个人项目(OpsAgent/mySSH/Ops Workbench)有实际落地

[!warning] 核心风险

  • 非计算机科班,CS 基础需证明
  • SRE 方法论缺乏体系化认知
  • 代码能力需要面试中直接证明
  • 简历每一条都可能被深挖

补强行动计划

第一优先级:面试前必做

  • 理解 MTTR 四段模型 — 能画出完整链路,关联 MTTR 与 MTBF 体系详解
  • 准备 AI 项目架构图 — 告警入口→Tool 列表(函数签名)→LLM 循环→知识库→输出
  • 准备 502 分析完整案例 — 按 Round 1-6 格式,准备一个真实经历过的故障
  • 手写代码练习 — 告警去重器、令牌桶限流器,Go 和 Python 各一遍

第二优先级:面试前建议做

  • HPA 实操 — 在测试集群跑 kubectl describe hpa,理解 behavior 参数
  • SLO 定义练习 — 为自己负责的业务写一个完整的 SLI/SLO 定义文档
  • 错误预算计算 — 算清楚 99.9% 对应的每月允许不可用时间
  • Tool Calling 原型 — 用 OpenAI API 写一个最简的 Tool Calling 循环(3 个 Tool 即可)

第三优先级:长期建设

  • CS 基础 — 数据结构(map/queue/heap)、操作系统(进程/线程/锁)、网络(TCP/HTTP/DNS)
  • SRE 经典阅读 — 《SRE: Google 运维解密》《The SRE Workbook》
  • 开源贡献 — 参与 kube-prometheus、prometheus-operator 等
  • 代码刷题 — LeetCode 中等难度,重点:并发、数据结构、字符串处理

面试高频问题清单(自测)

SRE 方法论

  1. 你负责的业务 SLO 是什么?SLI 怎么定义的?错误预算怎么管理?
  2. MTTR 和 MTBF 你们怎么度量?MTTR 拆成几个阶段?每个阶段怎么优化?
  3. 你们做不做混沌工程?做不做变更冻结?RCA 的 action item 怎么跟踪闭环?
  4. 你经历过的最严重的一次线上故障是什么?讲一下从发现到恢复的全过程。

K8s / 云原生

  1. HPA 的扩容和缩容策略分别是什么?默认值是多少?怎么加速扩容?
  2. Pod 状态有哪些?Pending 和 CrashLoopBackOff 分别怎么排查?
  3. requests 和 limits 的区别?不设 limits 会怎样?HPA 依赖哪个?
  4. 你们 K8s 网络模型是什么?CNI 用的什么?NetworkPolicy 用过吗?

AI / AIOps

  1. 你的 AI 根因分析系统,LLM 具体做了什么决策?Tool Calling 的流程画出来。
  2. 知识库是怎么建设的?RAG?向量库?图结构?相似度怎么算的?
  3. LLM 分析出错了怎么办?有没有护栏机制?结果怎么校验?
  4. 你觉得 AI 在 SRE 领域还有哪些应用场景?SRE Agent 应该具备什么能力?

代码能力

  1. 写一个令牌桶限流器(支持并发安全)
  2. 写一个简单的 HTTP 健康检查器(并发检查多个 endpoint,超时控制)
  3. 写一个日志 tail 工具(监听文件变化,实时输出新增内容)

关联知识

参考资源

状态

  • JD 拆解与匹配度分析
  • 自我介绍优化
  • SLI/SLO/MTTR/MTBF 考点整理
  • K8s/HPA 故障排查标准答案
  • AI 根因分析系统架构与示例
  • 告警去重器代码实现(Python + Go)
  • 面试评估与补强计划
  • 高频自测题清单
  • SRE 面试补全内容 — 15 道自测题完整答案 + 3 道代码题实现 + 深度补充
  • SRE 面试扩展题库 — 25 道扩展题:简历深挖 + 监控/CI-CD/系统设计/Linux/网络/行为面试
  • SRE 面试 GitOps与ServiceMesh专题 — 18 道专题题:GitOps/ArgoCD 架构与生产实践 + Istio 流量管理/mTLS/熔断 + 综合落地路线
  • SRE 面试 BOSS直聘专项 — 16 道题:BOSS 业务理解 + 混沌工程 + 高可用设计 + 容灾建设 + 生产敏感性 + 6年经验画像
  • 实际面试验证