本文永久链接: https://www.xtplayer.cn/kubernetes/pod-container-restart-reason-check/

在 K8S 的使用过程中,POD 中容器重启应该是很容易遇到,如下图可以明确的看到 POD 中容器重启的次数。

当遇到容器异常重启,应该进一步的找到容器重启的原因,避免下次再出现相同的问题。下面我将分享定位容器异常重启的几个步骤。

检查 POD 事件

  1. 对于 POD 层面的原因造成的容器重启,比如健康检查等,一般在 POD 事件中会有相应的事件信息。这个时候点击 POD 名称进入 POD 详情页面,然后点击事件则可以看到具体的 POD 事件。

  2. POD 事件非持久性的,默认只保留 1 个小时。所以如果等的时间过长,事件中则没有事件显示。

检查容器退出原因(reason)和状态码

有时候如果容器做了资源限制,比如内存限制了 1G。当容器使用的内存资源超过 1G 时,就会触发 Linux 系统的 OOM(Out Of Memory Killer)机制。当触发 OOM 后,容器进程将会被 KILL 掉,因此容器会停止。

但是在 K8S 集群中,K8S 的机制会保证 POD 中的容器一直可用,因此 K8S 会自动重新创建一个新的容器,旧的容器会一直处于停止状态。

  • 企业版

    在企业版的 rancher 中,鼠标放在状态栏上,可以查看到容器重启的原因。

  • 开源版

    开源版只能通过查看 POD YAML 来查看退出原因(reason)和状态码,在 status.containerStatuses.lastState 字段下可以看到具体的退出原因(reason)和状态码。

  • 常见退出状态码

    • 退出代码 0:一般为容器正常退出
    • 退出代码 1:由于容器中 pid 为 1 的进程错误而失败
    • 退出代码 137:由于容器收到 SIGKILL 信号而失败(手动执行或“oom-killer” [OUT-OF-MEMORY])
    • 退出代码 139:由于容器收到 SIGSEGV 信号而失败
    • 退出代码 143:由于容器收到 SIGTERM 信号而失败

查看退出容器日志

前面已说到,K8S 的机制会保证 POD 中的容器一直可用,因此 K8S 会自动重新创建一个新的容器,旧的容器会一直处于停止状态。因此,如果是容器中进程异常退出导致的容器重启,那么就需要通过旧容器的日志来具体定位问题。

  1. 点击 POD 的查看日志

  2. 在弹出窗口左下角可以看到 以前的容器 复选框

  3. 勾选 以前的容器 复选框后,可以看到日志内容会发生变化。点击 回到底部 则可以看到容器退出前的错误日志