Kubernetes Pod不断自动重启--Exit Code = 0

文章目录

      • 1 问题
      • 2 解决方案

1 问题

最近在搞kubernetes,我制作了一个容器,然后使用k8s以Depolyment的方式进行部署,但是可以看到容器的状态在Rnning->Complete->CrashLoopBackOff这三个状态间转换,为查看原因我使用了如下指令:

#获取pod信息
kubectl get pods -o wide -n <namespace-name>
#查看pod log
kubectl logs <pod-name>
#查看pod详细信息
kubectl describe <pod-name>

通过上述指令,我发现Pod是正常退出(即Exit code = 0)的,也就是说Pod是正常启动的,然后就运行结束了。由于k8s中Pod的默认restartPolicy为Always,也就是说Pod会不断进行重启。最后,通过执行一些脚本,我发现Pod不断自动重启的原因是没有Pid=1的进程,或者说Pod启动时执行的脚本是1号进程,但脚本执行完之后就没有1号进程了,所以Pod相当于运行结束了。可以查看如下链接:https://segmentfault.com/a/1190000009583997。

2 解决方案

我做的容器启动时默认就会执行一个shell脚本,刚才也说了这个脚本就是容器的1号进程,和上面的链接中描述的方法一样,我在脚本中加了如下内容:

echo "PID of this script: $$"
echo "PPID of this script: $PPID"
echo "UID of this script: $UID"

发现确实如链接中描述的那样。也就是说我们需要保留这个1号进程(注:1号进程是所有进程的祖先,是必须要存在的),不让它死亡,这样容器就会一直处于running状态。那如何保留这个1号进程呢?其实方法也比较简单,下面简单提供2中方法:

  • 方法1:在shell脚本末尾添加如下内容
tail -f /var/log/*
  • 方法2:在shell脚本添加一个死循环
while true; do
    sleep 100;
done

相关参考:

  1. docker运行nginx为什么要使用 daemon off
  2. Kubernetes为容器设置启动时要执行的命令及其入参
  3. Google指南:构建容器的最佳做法
  4. Kubernetes故障排查指南-分析容器退出状态码
  5. Kubernetes Pod异常排错

你可能感兴趣的:(Kubernetes,Pod启动,docker)