容器和 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 建议排查方向
容器一秒内反复重启 12 查看容器日志,有无配置错误、参数缺失
OOM 被杀 137 kubectl describe podOOMKilled=true,检查内存限制是否太小
程序未找到 127 镜像中是否缺少主程序/脚本,路径是否正确
权限不足 126 文件是否有执行权限(chmod +x
突然退出无日志 139 C/C++ 程序崩溃,建议加 core dump 分析
优雅退出失败 143 容器没处理 SIGTERM,需支持 PreStop / trap 信号处理

四、如何查看 exitCode

kubectl get pod  -o jsonpath='{.status.containerStatuses[*].state.terminated.exitCode}'

或者:

kubectl describe pod 

查看 Terminated 状态下的 exitCode 与 reason。

五、一篇不错的文章

Exit Codes in Docker and Kubernetes: The Complete Guide

你可能感兴趣的:(k8s,kubernetes,容器,云原生)