Kubernetes Pod停留在Init状态排查

在部署Kubernetes集群时,遇到apiserver初始化始终停留在 Init:0/1 状态。这种情况的排查有一定方式方法,记录如下:

Init container

当Kubernetes的Pod始终停留在init状态,意味着这个pod包含了 init container 无法完成: 这里可以观察 init:N/M 表示pod包含M个Init容器,其中N个已经完成,例如上文 Init:0/1 表示Pod只有一个容器需要初始化,其中完成初始化的容器是0个。

排查方法

要排查Pod无法启动原因,可以依次使用以下命令:

  • kubectl describe pods pod-XXX :

获取pod信息,这个步骤是最基本步骤,可以获得events,例如上例中,就可以看到Pod无法启动的事件原因:

Warning  FailedMount  25m (x410 over 14h)  kubelet  MountVolume.SetUp failed for volume "xxxxx-configs" : configmaps "xxxxx-configs-520" not found
Warning  FailedMount  7s (x411 over 14h)   kubelet  Unable to mount volumes for pod "apiserver-795c56f6bd-4n9k8_example-cluster(5ba50edb-7ae9-4ec6-8ce5-17918426db4d)": timeout expired waiting for volumes to attach or mount for pod "example-cluster"/"apiserver-795c56f6bd-4n9k8". list of unmounted volumes=[xxxxx-configs]. list of unattached volumes=[master-pki ...]

可以看到原因是无法挂载卷

  • kubectl logs pod-XXX :

检查pod中容器日志

  • kubectl logs pod-XXX -c init-container-xxx :

如果一个pod中有多个容器,则必须指定容器 -c init-container-xxx 才能看到对应日志

  • kubectl describe node node-XXX :

有可能需要检查pod所在节点的事件日志

  • kubectl get events :

有可能需要检查整个集群的事件日志

  • journalctl -xeu kubelet | tail -n 10 :

检查systemd的kubelet日志

  • journalctl -xeu docker | tail -n 1 :

检查docker日志

参考