云计算百科
云计算领域专业知识百科平台

Kubernetes生产运维15:排障不该靠运气,怎么用监控、告警和复盘把稳定性沉淀下来

Kubernetes生产运维15:排障不该靠运气,怎么用监控、告警和复盘把稳定性沉淀下来

在这里插入图片描述

写在前面

这是本专栏的最后一篇。前面十四篇讲的都是"出了问题怎么查":Pod Pending、CrashLoopBackOff、OOM、Service、DNS、Ingress、存储、节点、探针、资源、权限、升级。

但如果每次都靠出事后救火,人会越来越累,问题会反复发生。真正的稳定性不是排障能力,而是一个闭环:

监控让问题可见
→ 告警在合适的时候叫醒合适的人
→ 排障定位并恢复(前十四篇)
→ 复盘把这次故障变成改进
→ 改进回流到监控、告警和系统设计
→ 同类问题不再发生或更快被发现

这一篇讲怎么建立这个闭环:用什么方法监控、SLO怎么定、告警怎么才不吵、复盘怎么做才有用。它把前面所有排障经验收敛成一个可持续的体系。

本文按照SRE通行方法和Kubernetes官方监控机制整理。由于当前没有连接可验证的实验集群,示例指标和输出均为说明性重建,不是生产原始记录。SLO阈值、告警规则要结合自身业务和容量确定,本文给的是方法和起点,不是可照抄的具体数值。

在这里插入图片描述


一、监控什么:RED和USE两种视角

监控最怕的是装了一堆指标却不知道该看哪个。RED和USE是两个互补的框架,帮你抓重点。

1.1 RED:从服务视角看

RED针对每个服务,看三个指标:

  • Rate(请求量):每秒请求数
  • Errors(错误率):失败请求的比例
  • Duration(延迟):请求耗时,看P50、P95、P99

RED回答的是"用户体验好不好"。服务出问题,通常先在错误率或延迟上体现。

1.2 USE:从资源视角看

USE针对每个资源(CPU、内存、磁盘、网络),看三个指标:

  • Utilization(利用率):资源用了多少
  • Saturation(饱和度):排队等待的程度,如CPU限流、内存压力
  • Errors(错误):资源层面的错误

USE回答的是"资源够不够、有没有瓶颈"。前面讲的OOM、CPU限流、磁盘压力,都属于USE视角。

1.3 两者配合

  • 用户报慢或报错,先看RED定位是哪个服务
  • 再用USE看这个服务依赖的资源有没有瓶颈
  • RED是症状,USE常是原因

在Kubernetes里,RED来自应用和网关指标,USE来自节点和容器指标(如前面用过的工作集内存、CPU限流、节点压力)。

在这里插入图片描述


二、SLO:定义"多好才算好"

2.1 为什么需要SLO

没有SLO,“稳定"是个说不清的词。SLO(服务等级目标)把它量化:比如"99.9%的请求在300毫秒内成功返回”。有了SLO,才能判断当前是不是够好、该不该投入改进。

几个概念:

  • SLI:服务等级指标,实际测量值,如成功率、延迟
  • SLO:目标,如成功率≥99.9%
  • 错误预算:1减去SLO,即允许的不完美。99.9%的SLO意味着有0.1%的错误预算

2.2 错误预算怎么用

错误预算是个很实用的概念:

  • 预算还充足:可以更激进地发布、升级、做变更
  • 预算快用完:放慢变更、优先做稳定性,别再冒险

它把"要稳定还是要快"这个永恒矛盾变成了可量化的决策,而不是拍脑袋吵架。

2.3 SLO要基于用户体验

SLO应该反映用户真正在乎的东西,通常是核心链路的成功率和延迟,而不是"CPU利用率低于80%"这种资源指标。资源指标是USE的事,SLO是面向用户的。

一个常见错误是给什么都定SLO,结果没有重点。先给核心业务链路定,其他慢慢来。


三、告警:少而准,叫醒该叫醒的人

3.1 告警疲劳是真正的危险

告警太多比太少更危险。当一个人每天收到几百条告警,他会开始忽略所有告警,包括真正重要的那条。这就是告警疲劳。

前面每篇都提到"告警不能只匹配某个状态",比如不能只匹配phase=Pending、不能一次重启就告警。原因就在这:噪声告警会淹没真问题。

3.2 告症状,而不是告原因

好的告警原则:对用户可感知的症状告警,而不是对每个可能的原因告警。

  • 症状告警:错误率超过SLO、延迟P99恶化、核心接口不可用
  • 原因告警:某个Pod重启了、某个节点CPU高了

原因层面的东西太多、太容易抖动,适合放进仪表盘供排查时看,而不是都变成会叫醒人的告警。当症状告警响了,再用原因层面的指标去定位(这正是前十四篇做的事)。

3.3 告警要可执行

每条会叫醒人的告警都应该:

  • 对应一个真实的、需要人介入的问题
  • 有明确的处理指引(Runbook链接)
  • 分级:紧急的才叫醒人,次要的进工单或看板

如果一条告警响了大家都不知道要干嘛,或者响了也不用管,它就该被删掉或降级。

3.4 结合前面的排障经验降噪

前面各篇的降噪原则汇总起来就是:

  • Pending:区分正常等待(WaitForFirstConsumer、SchedulingGated)和真正调度不上
  • 重启:按重启速率和持续时间告警,不是一次重启就告警
  • OOM:区分周期尖峰和持续泄漏
  • 节点NotReady:区分短暂抖动和持续不可恢复
  • 集体重启:这种模式反而要专门告警

在这里插入图片描述


四、故障复盘:让每次故障都变成改进

4.1 复盘的目的是改进,不是追责

Postmortem(故障复盘)最重要的原则是对事不对人(blameless)。如果复盘变成追责大会,大家就会隐瞒信息、推卸责任,真正的根因反而查不清。

对事不对人不是不追究,而是把注意力放在"系统为什么允许这个错误发生、怎么让它下次不发生",而不是"谁按错了按钮"。人会犯错是常态,好的系统应该能容错。

4.2 一份复盘该有什么

  • 故障时间线:什么时候发生、什么时候发现、什么时候恢复,关键动作的时间点
  • 影响:影响了什么、多大范围、多久(基于事实,不夸大)
  • 根因:用前面的排障方法定位到的真正原因,而不是表面现象
  • 止损和恢复过程:做了什么让它恢复
  • 行动项:具体的、有负责人、有截止时间的改进,这是复盘最有价值的部分

4.3 行动项要落到闭环上

复盘的行动项应该回流到这个闭环的各环节:

  • 监控:这次故障有没有对应的监控?没有就补
  • 告警:有没有提前告警?告警是不是太晚或太吵?
  • 系统设计:能不能从设计上避免?比如加PDB、改探针、调QoS
  • Runbook:把这次的处理过程沉淀成Runbook,下次更快

行动项如果只是"下次注意",等于没有。要具体到"给X服务配PDB,负责人A,本周内"。

4.4 区分事实和推断

复盘里要像排障一样区分已确认的事实和推断。前面反复强调的"不把相关性写成因果"“单一指标不能定根因”,在复盘里同样适用。一份好的复盘经得起追问:每个结论背后的证据是什么。

在这里插入图片描述


五、C级生产化重建案例:一次告警太晚的复盘

5.1 先说明哪些是真的,哪些是重建的

下面不是作者声称亲历的具体事故,而是根据监控告警机制和复盘方法构造的生产化重建,用于演示复盘怎么做。

内容证据属性
RED、USE、SLO、错误预算和告警降噪的方法 SRE通行方法与Kubernetes监控机制
一次因告警太晚导致故障扩大的复盘 机制一致的重建场景
时间线、影响描述、指标数值 为讲解构造的说明性信息
只监控资源没监控用户症状导致发现晚 模拟根因,不是某次事故原始记录

所有内容按合理机制编排,但不是某次真实事故的原始记录,读者不能把下面的时间或数值引用为真实数据。

5.2 复盘:一次发现太晚的服务降级

故障时间线(说明性重建):

相对时间事件
T+00 某依赖开始变慢,核心接口延迟和错误率缓慢上升
T+15分 用户开始反馈变慢,客服转告
T+20分 值班才介入,此时错误已持续20分钟
T+35分 定位到依赖问题并降级恢复

影响(基于事实,不夸大): 核心接口一段时间内成功率下降、延迟升高,具体数值以监控为准,这里不编造精确的用户数和金额。

为什么发现晚(根因分析):

监控体系里只配了USE视角的资源告警(CPU、内存),核心接口的错误率和延迟这种RED症状指标虽然有仪表盘,但没有配成告警。所以资源没到阈值时,没有任何告警,直到用户反馈才发现。

只监控了资源利用率,没对用户症状告警
+ 依赖变慢不体现在本服务的CPU内存上
+ RED的错误率延迟只在看板里,没配告警
+ 于是靠用户反馈发现,晚了约20分钟
= 告警设计缺陷导致发现晚,放大了影响

这不是排障能力问题,是监控告警设计问题。

5.3 行动项(回流到闭环)

行动项类型说明
给核心接口的错误率和P99延迟配SLO告警 告警 症状告警而非只有资源告警
定义核心链路SLO和错误预算 SLO 让"多好算好"可量化
依赖变慢时本服务的降级预案写成Runbook Runbook 下次更快恢复
复盘同类服务是否也只有资源告警 监控 举一反三

每条都有明确内容,落地后能让"发现晚"这个问题不再重演。这就是复盘的价值:不是记录一次事故,而是让系统变得更能自我发现问题。

5.4 这个案例说明什么

前十四篇的排障能力,解决的是"发现问题后怎么查"。但这个案例的问题出在"太晚才发现"。再强的排障能力,也补偿不了监控告警设计的缺陷。所以稳定性是个闭环,缺一环都不行。


六、把整个专栏收敛成闭环

回顾整个专栏,它其实就是这个闭环的展开:

闭环环节对应专栏内容
排障方法 第01篇方法论、第02篇kubectl工具箱
具体排障 第03到13篇各类故障
升级与变更 第14篇集群升级
监控告警复盘 本篇
证据原则 贯穿全专栏:区分事实与推断、单变量验证、不把相关当因果

如果说前面十四篇教的是"怎么查",这一篇想说的是:最好的排障是不用排障。通过监控让问题可见、告警及时准确、复盘持续改进,让系统越来越少出问题、出了也能更快发现和恢复。

排障能力是底线,稳定性闭环才是目标。


七、稳定性闭环检查清单

监控
[ ] 核心服务有没有RED(请求量、错误率、延迟)
[ ] 关键资源有没有USE(利用率、饱和度、错误)
[ ] 前面各类故障有没有对应的监控指标

SLO
[ ] 核心链路有没有定义SLO和错误预算
[ ] SLO是否基于用户体验而非资源指标

告警
[ ] 是不是对用户症状告警,而不是对每个原因告警
[ ] 每条会叫醒人的告警是否可执行、有Runbook
[ ] 是否避免了告警疲劳(噪声告警降级或删除)
[ ] 正常等待、短暂抖动是否被排除,避免误告警

复盘
[ ] 复盘是否对事不对人
[ ] 是否有时间线、影响、根因、行动项
[ ] 行动项是否具体、有负责人、有截止时间
[ ] 行动项是否回流到监控、告警和系统设计
[ ] 是否区分了事实和推断


八、常见误区

误区1:监控指标堆一堆却没重点

用RED和USE抓重点,而不是什么都监控。

误区2:给资源利用率定SLO

SLO应基于用户体验,资源是USE的事。

误区3:对每个原因都告警

原因太多太抖,应对用户症状告警,原因放看板供排查。

误区4:告警越多越安全

告警疲劳会让人忽略真问题,少而准更安全。

误区5:复盘变成追责

会导致隐瞒,应对事不对人。

误区6:复盘行动项是"下次注意"

要具体、有负责人、有截止时间。

误区7:以为排障能力强就够了

发现晚、告警缺失,再强的排障也补偿不了。

误区8:复盘不区分事实和推断

和排障一样,不能把相关当因果、单指标定根因。


九、面试怎么说

60秒版本

我把稳定性看成一个闭环:监控让问题可见、告警及时叫醒人、排障定位恢复、复盘持续改进、改进回流到系统。监控我用RED看服务的请求量错误率延迟、USE看资源的利用率饱和度错误。SLO基于用户体验定,配错误预算来平衡稳定和迭代。告警的核心原则是对用户症状告警而不是对每个原因告警,避免告警疲劳,每条告警都要可执行。复盘对事不对人,要有时间线、根因和具体行动项,行动项回流到监控告警和设计。排障能力是底线,但最好的排障是通过这个闭环让系统少出问题、快发现。

3分钟场景版本

举个复盘的例子。一次核心接口变慢,靠用户反馈才发现,已经影响了二十分钟。复盘时我们对事不对人,先拉时间线:依赖什么时候开始变慢、什么时候用户反馈、什么时候介入恢复。根因不是排障不力,而是监控告警设计缺陷:我们只配了CPU内存这些资源告警,而依赖变慢不体现在本服务的资源上,核心接口的错误率和延迟只在看板里没配告警,所以资源没超阈值时没人被叫醒。这是典型的只有USE没有RED告警。行动项很具体:给核心接口配错误率和P99延迟的SLO告警、定义核心链路SLO和错误预算、把降级预案写成Runbook、排查其他服务是否也只有资源告警,每条都有负责人和截止时间。这次复盘的价值不是记录事故,而是让系统下次能自己更早发现同类问题。这也是我理解的稳定性:排障是底线,闭环是目标,最好的排障是不用排障。


十、延伸问答

1. RED和USE什么关系

RED从服务视角看用户体验,USE从资源视角看瓶颈,RED是症状USE常是原因,配合使用。

2. SLO该怎么定

基于用户体验的核心指标,如成功率和延迟,先给核心链路定,不要给什么都定。

3. 错误预算有什么用

把稳定和迭代的矛盾量化:预算足可以激进变更,预算紧就放慢做稳定性。

4. 为什么告警太多危险

告警疲劳会让人忽略所有告警包括真问题,少而准更安全。

5. 告症状还是告原因

对用户可感知的症状告警,原因太多太抖,放看板供排查。

6. 复盘为什么要对事不对人

追责会导致隐瞒,查不清根因,应聚焦系统怎么改进。

7. 复盘行动项怎么才有用

具体、有负责人、有截止时间,并回流到监控告警和系统设计。

8. 排障能力强还需要这些吗

需要。发现晚、告警缺失,再强的排障也补偿不了,稳定性是闭环。


小结

  • 稳定性是闭环:监控、告警、排障、复盘、改进回流,缺一不可。
  • RED看服务的请求量错误率延迟,USE看资源的利用率饱和度错误。
  • SLO基于用户体验定,错误预算平衡稳定和迭代。
  • 告警对用户症状而非每个原因,避免告警疲劳,每条要可执行。
  • 复盘对事不对人,要有时间线、根因和具体行动项。
  • 行动项回流到监控、告警和系统设计,才让故障变成改进。
  • 复盘和排障一样要区分事实和推断。
  • 排障能力是底线,闭环是目标,最好的排障是不用排障。
  • 专栏结语

    到这里,Kubernetes生产运维实战专栏的十六篇就全部写完了。从排障方法论、各类具体故障,到升级、监控和复盘,串起来是一句话:从现象到证据到根因,用方法而不是运气解决问题,再用闭环让问题越来越少。

    希望这个专栏不只是一份排障手册,而是一种工作方式:遇到问题先分层、先取证、先区分事实和推断,再动手;解决之后补监控、补预防、做复盘。这样无论遇到没见过的新问题,也有一套稳定的方法去面对。

    感谢一路看到这里。

    参考资料

  • Kubernetes官方文档:Monitoring in Kubernetes
  • Kubernetes官方文档:Metrics For Kubernetes System Components
  • Kubernetes官方文档:Logging Architecture
  • Kubernetes官方文档:Resource metrics pipeline
  • Kubernetes官方文档:Observability
  • Prometheus官方文档:Alerting Rules
  • Prometheus官方文档:Alertmanager
  • Grafana Labs:The RED Method
  • Google SRE Book: Service Level Objectives
  • Google SRE Book: Postmortem Culture
  • 注:第9、10项为Google SRE Book的SLO与故障复盘章节,是SRE方法的权威来源;国内网络访问Google站点可能不稳定,可搜索对应中译或镜像阅读。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » Kubernetes生产运维15:排障不该靠运气,怎么用监控、告警和复盘把稳定性沉淀下来
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!