查看重启前日志是什么
容器崩溃重启后,当前实例的日志往往是空的或只有启动失败的一行,因为真正的报错发生在已经被终止的上一个实例里。加上查看上一个实例的参数后,kubectl 会从节点上读取那个已终止容器的日志文件,把崩溃现场交给你。
什么时候读不到内容
只保留紧邻的上一个实例:如果容器已经连续重启多次,更早的实例日志已经被覆盖,可取的内容有限。另外,容器从未真正启动过(一直停在创建或调度阶段)时,根本不存在上一个实例,此时应转向查看对象事件。
基本信息
| 适用环境 | 任何 Kubernetes 发行版,需要 pods 与 pods/log 权限 |
|---|---|
| 语法 | kubectl logs <pod> --previous [-c 容器] [选项] |
| 读取对象 | 紧邻的上一个已终止容器实例的日志 |
| 保留范围 | 仅上一个实例,更早的被覆盖 |
| 无内容的情况 | 容器从未启动,或实例刚被清理 |
| 常用搭配 | 配合描述信息里的上一次终止原因一起看 |
典型使用场景
- 反复重启排查:当前实例正常,但报错发生在上一次退出之前
- 启动即退出:进程在初始化阶段就失败,错误只出现在上一次实例里
- 内存超限核对:被终止之前的日志常能看出内存分配异常
- 探针杀进程:确认是否因检查失败被动终止
- 发布回滚取证:新版本崩溃后取现场,作为修复依据
- 写复盘材料:保留上一次实例的关键日志片段作为证据
常用示例
常用示例
kubectl logs web-x --previous # 读上一次实例日志
kubectl logs web-x -c app --previous --tail=200 # 指定容器并只看末尾
kubectl describe pod web-x | sed -n '/Last State/,+4p' # 上一次终止原因与退出码
kubectl get pod web-x -o jsonpath='{.status.containerStatuses[0].restartCount}' # 重启次数
kubectl get pod web-x -o jsonpath='{.status.containerStatuses[0].lastState.terminated.reason}'两个信息源的分工
| 信息源 | 能回答什么 | 局限 |
|---|---|---|
| 上一次实例日志 | 应用退出前打印了什么 | 只有紧邻的上一个实例 |
| 上一次终止状态 | 退出码、原因、信号、起止时间 | 不含应用输出 |
| 对象事件 | 是否被探针终止、是否被驱逐 | 有过期时间 |
| 当前实例日志 | 现在在做什么 | 崩溃前的输出不在其中 |
查看按容器维度保留,多容器对象需要指定是哪一个容器,否则会提示选择或直接报错。
在上一次终止状态里能看到原因字段,用来区分是被强制终止、正常结束还是启动失败。