kubectl describe pod api-7d9f8c6b5-x2k4n | tail -25
kubectl logs api-7d9f8c6b5-x2k4n --previous
kubectl get pod api-7d9f8c6b5-x2k4n -o jsonpath='{.status.containerStatuses[0].lastState}'
Pod 状态 CrashLoopBackOff,RESTARTS 47,kubectl logs 返回空,加 --previous 也只有一行 starting。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,容器在进程真正写日志之前就退出了,stdout 里自然什么都没有。常见是 entrypoint 指向的脚本没有执行权限,或者镜像里缺解释器,内核直接返回 126 或 127。退出原因只留在 lastState 里。
围绕「Pod 空日志排查」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改完隔一天再看一次,当场正常不代表能稳住。
测试环境和线上的差别,往往就在版本号和那几行被忽略的配置上。线上出问题先对时间点,跟发布、备份、任务执行的时刻排一排,能省掉一半功夫。
处理上按这个顺序:先看 describe 里 Last State 的 Exit Code 和 Reason 区分 126 127 137;用 kubectl logs --previous 取上一个容器实例的输出 当前实例可能还没写;把 entrypoint 改成 sh -c 手动执行一次 确认脚本路径和权限;临时把 command 换成 sleep 3600 进容器排查 确认后再换回。
改完只确认一件事:lastState 里能看到 exitCode 126 或 127 改完权限后 RESTARTS 停在 0 不再增长。
