Kubernetes Pod 故障诊断
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_3c6cb52e/kubernetes-pod-crash-diagnostics-3
技能介绍
Pod 反复重启时,你缺的不是命令,而是线索
CrashLoopBackOff 和 OOMKilled 是 Kubernetes 里最“会说话”的两类故障——Pod 不会静默死亡,它会留下一串证据:退出码、事件、上一次容器的日志。但人工排查时,这些证据散落在三四个命令的输出里,很容易被忽略。真正棘手的往往是那些“看起来像镜像问题”却实际是探针配置错误的场景:镜像启动需要 20 秒,而 liveness probe 的 initialDelaySeconds 只给了 5 秒,容器被反复杀死重启,日志里却只写着探针超时。
这个技能要解决的就是“证据收集 + 根因定位”这一段机械但容易遗漏的工作。
它如何工作
核心流程分三步:
kubectl describe pod:拉取 Pod 当前状态、重启次数、各容器退出码以及 Events 段,识别 OOMKilled、ImagePullBackOff、Unhealthy 等关键信号kubectl logs --previous:读取崩溃前容器的上一份日志,而不是当前(可能已退出)容器的输出kubectl get events:补充 Pod 级事件之外的集群视角信息
拿到输出后,它会解析几类关键信息:
- 退出码:如 137(SIGKILL,常由 OOM 或探针杀死)、1 或 2(应用自身启动失败)、127(入口命令不存在)
- 资源限制:对照
resources.limits.memory与实际用量,确认是否被 cgroup OOM killer 终止 - 探针配置:检查 liveness/readiness probe 的
initialDelaySeconds、timeoutSeconds是否与应用启动耗时匹配
适用边界与注意点
- 它诊断的是“已经发生”的崩溃,不负责预测或容量规划
- 日志输出依赖容器写 stdout/stderr;只写日志文件、不输出到标准输出的应用,能拿到的信息有限
- Events 有默认 TTL,刚发生几分钟内的故障才有完整记录
- 需要集群访问权限,且
kubectl上下文必须指向正确的命名空间 - 只能基于已有证据推理,无法访问源码或 CI 产物,复杂场景仍需人工结合部署流水线排查
使用场景
- 线上 Pod 陷入 CrashLoopBackOff,需要快速收集退出码、事件和崩溃前日志定位原因
- 容器因内存超限被 OOMKilled,需要结合资源限制判断是配置不足还是用量突增
- Pod 反复重启但当前日志为空,需要提取上一次容器的日志才能看到报错信息
- 新服务上线即崩溃,需要对比 liveness 探针参数与应用启动耗时确认是否被误杀
适合人员
- Kubernetes 平台 SRE:值班时需要在最短时间内对故障 Pod 做出根因判断并上报处置方向
- 后端开发工程师:自己负责的服务反复重启,需要看懂退出码与探针配置以区分应用缺陷和运维配置问题
- 云原生运维工程师:负责多集群稳定性,需要建立 Pod 崩溃排查的标准流程而非临时命令拼凑
- DevOps 工程师:在发布新版本后需要快速判断 CrashLoopBackOff 是镜像问题还是资源限制过低