如何通过 Exit Code 定位 Pod 异常退出原因

容器与中间件容器服务技术服务知识库
问题描述

如何根据 Pod 异常状态信息中的 Exit Code 进一步定位问题。

问题分析

有时pod退出并没有其他特殊信息提示,根据事件无法定位问题,需要根据Exit Code判断推断退出原因。

问题解决

1.如何查看Exit Code

$ kubectl describe pod -n kube-system <podName> |grep 'Exit Code'
      Exit Code:    1

2.退出状态码说明

  • 状态码需在0 - 255之间。
  • 0表示正常退出。
  • 若因外界中断导致程序退出,则状态码区间为129 - 255。例如,操作系统给程序发送中断信号 kill -9 或 ctrl+c,导致程序状态变为 SIGKILL 或 SIGINT。
  • 通常因程序自身原因导致的异常退出,状态码区间在1 - 128。在某些场景下,也允许程序设置使用129 - 255区间的状态码。
  • 若指定的退出状态码不在0 - 255之间(例如,设置 exit(-1)),此时将会自动执行转换,最终呈现的状态码仍会在0 - 255之间。
  • 若将退出时状态码记为 code,则不同情况下转换方式如下: 当指定的退出时状态码为负数,转换公式为:
256 - (|code| % 256)

当指定的退出时状态码为正数,转换公式为:

code % 256

3.常见异常状态码 137:表示程序被 SIGKILL 中断信号杀死。异常原因可能为:

  • 通常是由于 Pod 中容器内存达到了其资源限制(resources.limits)。例如,内存溢出(OOM)。由于资源限制是通过 Linux 的 cgroup 实现的,当某个容器内存达到资源限制, cgroup 就会将其强制停止(类似于 kill -9),此时通过 describe pod 可以看到 Reason 是 OOMKilled。
  • 宿主机本身资源不够用(OOM),则内核会选择停止一些进程来释放内存。
  • livenessProbe(存活检查)失败,使得 kubelet 停止 Pod。
  • 被恶意木马进程停止。

1和255:通常表示一般错误,具体原因需要通过容器日志进一步定位。例如,可能是设置异常退出使用 exit(1) 或 exit(-1)导致的,而-1将会根据规则转换成255。 如果您有其他问题,欢迎您联系火山引擎技术支持服务

83
0
0
0
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论