退出码是什么
容器退出码是容器主进程结束时返回的数字,用来告诉系统这次运行的结果。零表示正常结束,非零表示异常。被信号强制终止时,退出码等于一百二十八加上信号编号,因此看到一百三十七就代表收到的是强制终止信号。它是判断失败方向的第一层线索,但单凭数字不足以定论。
为什么要结合原因字段一起看
同一个退出码可能对应多种原因:一百三十七既可能是内存超限导致的终止,也可能是探针失败后被执行终止,差别在对象的终止原因字段与事件里。再往下一层,还需要看应用自己输出的最后几行日志。三者组合才能确定是资源问题、探针问题还是应用自身缺陷。
基本信息
| 适用环境 | 任何 Kubernetes 发行版,由容器运行时上报 |
|---|---|
| 零的含义 | 正常结束,一次性任务场景表示成功 |
| 非零含义 | 异常结束,具体含义由应用自行定义 |
| 信号终止 | 退出码为一百二十八加信号编号 |
| 配套字段 | 终止原因、信号、起止时间、重启次数 |
| 取证手段 | 读取上一个实例的日志与对象事件 |
典型使用场景
- 排查反复重启:先看退出码确定是主动退出还是被终止
- 核对任务结果:确认一次性任务是否正常完成
- 识别内存问题:退出码为一百三十七时重点检查内存上限
- 识别探针问题:同样的退出码出现时核对探针事件
- 定位镜像问题:命令不存在或不可执行会给出特定退出码
- 排查优雅退出:观察到终止信号相关退出码时检查信号处理逻辑
获取退出详情
获取退出详情
kubectl get pod web-x -o jsonpath='{.status.containerStatuses[0].lastState.terminated}' # 上一次终止详情
kubectl describe pod web-x | grep -E 'Last State|Exit Code|Reason|Signal' # 关键字段
kubectl logs web-x --previous --tail=100 # 被杀前的日志
kubectl get pod web-x -o jsonpath='{.status.containerStatuses[0].restartCount}' # 重启次数常见退出码含义
| 退出码 | 含义 | 下一步 |
|---|---|---|
| 0 | 正常结束,任务场景表示成功 | 确认是否为预期行为 |
| 1 | 应用自身报错退出 | 读上一次日志找异常 |
| 126 | 命令存在但不可执行 | 检查权限与文件格式 |
| 127 | 找不到命令 | 核对启动命令与镜像内容 |
| 137 | 收到强制终止信号,常见于内存超限 | 看内存上限与终止原因 |
| 143 | 收到终止信号,通常为正常下线 | 确认是否由探针或缩容触发 |
终止原因是独立字段,与退出码组合使用:同一个退出码在不同原因下的处理方式完全不同。
任务完成与容器失败是两个不同的结论,一次性任务正常完成时同样会退出,不代表故障。