在生产 Kubernetes 集群中,故障从来不是孤立的。高效的排障并非依赖直觉,而是需要遵循一条由日志、监控与事件三者协同构成的黄金路径。
本文将为你建立一套生产级的排障协作模型,帮助你从“发现问题”到“定位根因”,实现系统化、高效率的故障处理。
1. 先看监控:判断“系统是否异常”
监控回答的核心问题是:系统当前状态“是否正常”?当用户反馈服务缓慢或访问失败时,第一步不应是执行 kubectl logs,而应首先查看监控面板。
你需要重点关注以下三类指标:
① 资源指标(判断是否存在资源瓶颈)
- CPU 使用率 / 节流(Throttling)情况
- 内存使用率 / OOM 事件
- 节点磁盘使用率 / inode 使用情况
- Pod 重启次数
👉 作用:快速判断故障是否由资源不足或系统限制(如 CPU Throttle)引起。
② 服务指标(判断是否影响终端用户)
- 每秒查询率/事务率(QPS/TPS)
- P95 / P99 延迟
- 错误率(5xx 状态码、超时)
👉 作用:量化问题对实际业务的影响范围和程度。
③ Kubernetes 控制面指标
- Pod Ready 状态
- Deployment Available 副本数
- Node Ready 状态
- 调度失败次数
👉 作用:区分问题是出在业务应用本身,还是云原生/IaaS平台层面。
监控的核心价值在于快速定性问题范围,而非直接定位具体代码错误。
2. 再看事件:定位“异常行为的时间线”
事件(Event)回答的问题是:刚才“发生了什么”?
监控告诉你“现状不正常”,而事件则揭示了“不正常是如何发生的”。它是连接“监控异常现象”与“日志具体细节”的关键桥梁。
常见的事件来源包括:
- Scheduler(调度失败)
- Kubelet(镜像拉取失败、探针失败)
- Controller(副本数不一致、Pod驱逐)
- Node(节点NotReady、磁盘压力)
常用排查命令:
kubectl get events --sort-by=.lastTimestamp
kubectl describe pod <pod-name>
kubectl describe node <node-name>
通过事件,你可以清晰地看到:
- Pod 一直处于 Pending 状态的原因
- Pod 被驱逐(Evicted)的具体缘由
- 容器反复重启的触发条件
- Deployment 始终无法达到就绪(Ready)状态的障碍
3. 最后看日志:定位“程序失败的根因”
日志回答的终极问题是:程序“为什么会失败”?
当你通过监控和事件已经明确:
- 哪个 Pod 出现了问题
- 问题大致从何时开始
- 可能是资源、网络还是配置问题
此时再查看日志,排查效率最高。
日志关注重点:
① 应用日志
- 应用启动失败的根本原因
- 配置文件解析错误
- 依赖服务(如数据库、缓存)连接失败
- 业务逻辑中的超时或异常堆栈信息
② 容器 / 系统日志
- 是否因 OOMKilled 被终止
- 是否收到 SIGTERM / SIGKILL 信号
- 就绪或存活探针(Readiness/Liveness Probe)失败详情
- 容器内网络异常
kubectl logs <pod-name>
# 查看之前崩溃容器的日志
kubectl logs <pod-name> -p
日志不应是排障的第一步,而应是锁定问题的“最后一击”。
4. 三者如何协同?一条生产级排障路径
牢记这条黄金路径:监控定范围 → 事件定方向 → 日志定根因。
真实场景示例:
现象:接口响应超时,错误率升高。
① 监控分析
- CPU、内存使用率正常。
- 接口延迟 P99 显著飙升。
- Ready 状态的 Pod 数量减少。
- 推断:可能是部分 Pod 状态不稳定导致。
② 事件追溯
- 发现相关 Pod 被频繁重启。
- 事件显示
Readiness Probe failed。
- 推断:应用在启动后或运行中无法通过健康检查,可能是依赖服务异常或应用自身启动问题。这在部署新应用或更新版本时是常见排查场景。
③ 日志定位
- 查看该 Pod 日志,发现大量“数据库连接超时”错误。
- 或发现配置错误、DNS 解析失败等记录。
- 根因明确:快速针对数据库连接或配置进行修复。
5. 为什么“一上来就查日志”是低效的?
许多故障排查耗时漫长,往往因为始于错误的步骤:直接陷入日志的海洋。
这样做的问题在于:
- 日志量巨大,缺乏有效的时间范围筛选。
- 无法快速识别众多 Pod 中哪一个才是“问题 Pod”。
- 容易将程序运行中的“正常报错”信息误判为故障根因。
遵循“监控-事件-日志”的正确顺序,可以将排障时间从小时级压缩到分钟级。
6. 生产集群的推荐工具组合
为了实现监控、事件、日志的高效协同,生产环境推荐下图所示的工具组合与数据流:

核心并非工具堆砌,而是确保数据流转路径清晰、工具各司其职。 例如,使用 Prometheus 收集指标,EFK/ELK 栈处理日志,并确保数据库与中间件的监控指标也能被有效集成。
7. 总结:排障依赖体系,而非单纯经验
成熟的 Kubernetes 运维体系必须具备以下三种能力:
- 监控:用于提前发现与定性问题。
- 事件:用于理解问题的发生过程与上下文。
- 日志:用于精准定位程序内部的根本原因。
记住这个核心观点:没有监控指引的日志排查如同盲人摸象,没有事件串联的故障分析往往是事后诸葛。
|