容器和 Kubernetes 中的退出码
在 Kubernetes 中,Pod 中容器的退出状态(exitCode
)表示容器进程退出时的状态码。这个 exitCode
通常是应用程序或 shell 返回的标准 UNIX/Linux 退出码。理解常见的 exitCode
有助于我们快速定位容器异常退出的原因。
一、常见 exitCode
及含义(基础类)
exitCode | 含义说明 | 常见原因 |
---|---|---|
0 | 成功退出(正常) | 容器程序已完成任务或被优雅终止 |
1 | 一般性错误(General Error) | 程序内部异常,shell 命令失败等 |
2 | 不正确的用法(Misuse of shell builtins) | 脚本语法错误、参数错误等 |
126 | 命令无法执行 | 权限问题、不是可执行文件,例如:Permission denied |
127 | 命令未找到 | 程序或脚本路径不对、可执行文件缺失,例如:command not found |
128 | 无效的退出码(Invalid argument to exit) | 一般由 exit 调用非法参数引起 |
137 | 被信号 SIGKILL 杀死(9) | 容器被 OOM(内存溢出)或 kubelet 强制杀死(如 kubectl delete pod ) |
139 | 被信号 SIGSEGV 杀死(11) | 段错误(如访问了非法内存),C/C++ 程序常见 |
143 | 被信号 SIGTERM 杀死(15) | 通常是 Pod 正常终止(kubectl delete 、升级等),但没优雅处理 SIGTERM |
二、信号类退出码
Linux 中信号导致的进程退出,其 exitCode
= 128 + 信号值。例如:
信号值 | 信号名 | exitCode | 说明 |
---|---|---|---|
9 | SIGKILL | 137 | 强制终止(不能被捕获),如 OOM |
11 | SIGSEGV | 139 | 段错误,空指针或非法内存访问 |
15 | SIGTERM | 143 | 默认的优雅终止信号 |
1 | SIGHUP | 129 | 终端挂起或配置变更触发 |
2 | SIGINT | 130 | Ctrl+C 或终端中断 |
三、结合 Kubernetes 日常排查建议
情况 | 可能 ExitCode | 建议排查方向 |
---|---|---|
容器一秒内反复重启 | 1 、2 | 查看容器日志,有无配置错误、参数缺失 |
OOM 被杀 | 137 | kubectl describe pod 看 OOMKilled=true ,检查内存限制是否太小 |
程序未找到 | 127 | 镜像中是否缺少主程序/脚本,路径是否正确 |
权限不足 | 126 | 文件是否有执行权限(chmod +x ) |
突然退出无日志 | 139 | C/C++ 程序崩溃,建议加 core dump 分析 |
优雅退出失败 | 143 | 容器没处理 SIGTERM,需支持 PreStop / trap 信号处理 |
四、如何查看 exitCode
kubectl get pod <pod-name> -o jsonpath='{.status.containerStatuses[*].state.terminated.exitCode}'
或者:
kubectl describe pod <pod-name>
查看 Terminated 状态下的 exitCode 与 reason。
五、一篇不错的文章
Exit Codes in Docker and Kubernetes: The Complete Guide