POD报错-BACK-OFF RESTARTING FAILED CONTAINER 的处理姿势

乡下的树 2020年11月01日 764次浏览

部署的一个镜像,执行kubectl get pod testpod01 查看pod状态发现pod一直重启。
查看报错内容为:Back-off restarting failed container

[root@k8s-7-21 opt]# kubectl describe pod testpod01-n infra
……
  Events:
  Type     Reason     Age                    From                        Message
  ----     ------     ----                   ----                        -------
  Warning  BackOff    2m22s (x10 over 4m7s)  kubelet, k8s-7-22.host.top  Back-off restarting failed container

原因1:程序启动异常停止服务,检查日志根据提示解决

# kubectl log  testpod01 -n infra

原因2:程序没有运行在前台,导致pid≠1
解释:Docker 容器启动时,默认会把容器内部第一个进程,也就是pid=1的程序,作为docker容器是否正在运行的依据,如果 docker 容器pid=1的进程挂了,那么docker容器便会直接退出。

解决方式1:
要使Pod持续运行,可以指定一个永远不会完成的任务。
在dp.yaml文件中指定一个启动命令,例如:command: ["/bin/sh", "-ce", "tail -f /dev/null"]
携程applo的官方k8s部署yaml,就是使用这种方式

解决方式2:使用exec执行启动服务命令,这样不会启用新的shell进程。

vi entrypoint.sh
……
exec java -jar 程序包 
说明:entrypoint.sh执行pid为1,如果不用exec,docker执行完脚本pid1就不存在,docker就exit了