POD 中容器异常重启原因定位
本文永久链接: https://www.xtplayer.cn/kubernetes/pod-container-restart-reason-check/
在 K8S 的使用过程中,POD 中容器重启应该是很容易遇到,如下图可以明确的看到 POD 中容器重启的次数。
当遇到容器异常重启,应该进一步的找到容器重启的原因,避免下次再出现相同的问题。下面我将分享定位容器异常重启的几个步骤。检查 POD 事件
对于 POD 层面的原因造成的容器重启,比如健康检查等,一般在 POD 事件中会有相应的事件信息。这个时候点击 POD 名称进入 POD 详情页面,然后点击事件则可以看到具体的 POD 事件。
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 会自动重新创建一个新的容器,旧的容器会一直处于停止状态。因此,如果是容器中进程异常退出导致的容器重启,那么就需要通过旧容器的日志来具体定位问题。
点击 POD 的查看日志
在弹出窗口左下角可以看到 以前的容器 复选框
勾选 以前的容器 复选框后,可以看到日志内容会发生变化。点击 回到底部 则可以看到容器退出前的错误日志