本文主要梳理K8S中Pod创建的调度过程以及Pod调度到宿主机后的启动过程,便于日常工作中遇到此类问题的排查思路
Pod调度过程和创建过程思维导图
参考文档: https://github.com/jamiehannaford/what-happens-when-k8s
常见报错梳理
FailedCreatePodSandBox
create pod sandbox发生在pod调度至宿主机后,kubelet调用CRI创建pod sandbox的步骤;对照上面的思维导图;可以发现这个报错是CRI创建pod sandbox失败,包括了调用CNI分配IP和创建路由信息;一般可以结合enevts和kubelet日志以及CNI的运行日志一起排查;
案例参考: https://blog.csdn.net/root_zhong/article/details/127863032
SandboxChanged
也是sandbox相关的报错,具体也是定位kubelet日志以及CNI的运行日志定位问题
案例参考: https://blog.csdn.net/root_zhong/article/details/127855939
Pod状态为Pending
发生在Pod的调度过程;查看Pod的event,主要原因有以下几类:
- 资源依赖; 依赖configmap,PVC等资源。
- 资源不足; request过高,集群没有资源满足调度。
- 使用亲和性不满足条件;
- nodeSelector 使用有误。 污点和容忍。
- 短暂的Pending可能Pod在pull image,可describe查看。
Pod处于Init:Error或Init CrashLoopBackOFf
init 为Pod在宿主机上启动pause容器后准备启动业务容器前的初始化容器;
解决方案; 主要是查看init容器的事件和日志
Pod处于ImagePullBackOff状态
Pod已经调度至节点,但是拉去镜像失败。
解决方案: 根据event描述,确认镜像名称是否正确,可以在目标节点手动pull测试
Pod处于CrashLoopBackOFF状态
表示容器一直处于重启,大部分是容器进程退出导致,少部分可能由于pod sandbox创建失败导致;
解决方案: 查看event事件; 确认容器退出原因,常见原因的有OOM-Kill, Liveness probe failed; 或查看容器退出前日志定位容器异常退出原因。