前置检查
在排查异常状态的pod错误之前,先检查一下node状态
kubectl get node
pod状态为CrashLoopBackOff
查看pod日志来定位原因
kubectl log <podname> 或者 找到docker 查日志
kubectl describe pod <podname> -n <namespace>
pod状态为Pending
pod状态为Pending状态,说明调度失败,通常跟污点、标签、cpu、内存、磁盘等资源相关
kubectl describe pod <podname> -n <namespace>
pod状态为Init:0/1
通过kubectl get pod <podname> -n <namespace> -o yaml 查pod的Init Containers,并找到init_container_name
kubectl logs -n <namespace> <podname> -c <init_container_name>
查看Init Container的日志
pod状态为Terminating
第一种
pod或其控制器被删除
解决方法:
查看pod控制器类型和控制器名称,查看其控制器是否正常。
如果正常pod将会被重建,如果pod没有被重建,查看controller-manager是否正常
第二种
pod所在节点状态NotReady导致
解决方法:
检查该节点的网络,cpu,内存,磁盘空间等资源是否正常。
检查该节点的kubelet、docker服务是否正常。
检查该节点的网络插件pod是否正常
第三种
最常见的pod处于Terminating状态的解决办法为强制删除
kubectl delete pods -n <namespace> <name> --grace-period=0 --force
pod状态为Evicted
第一种
kubelet服务启动时存在驱逐限制当节点资源可用量达到指定阈值magefs.available<15%,memory.available<300Mi,nodefs.available<10%,nodefs.inodesFree<5%会优先驱逐Qos级别低的pod以保障Qos级别高的pod可用
解决方法:增加节点资源或将被驱逐的pod迁移到其他空闲资源充足的节点上
第二种
pod所在节点上被打上了NoExecute的污点,此种污点会将该节点上无法容忍此污点的pod进行驱逐
解决方法:查看该节点上的NoExecute污点是否必要。或者pod是否可以迁移到其他节点
第三种
pod所在的节点为NotReady状态
通常可以通过的底部的Events信息来找到一些问题的原因。例如下面例子中可以看到DiskPressure信息,说明跟磁盘相关。
Events:
---- ------ ---- ---- -------
Warning Evicted 61s kubelet, acs.deploy The node had condition: [DiskPressure]
kubectl describe pods ${pod} -n ${namespace}
批量删除状态Evicted的pod,此操作会删除集群里面所有状态为Evicted的pod
ns=`kubectl get ns | awk 'NR>1 {print $1}'`
for i in $ns;do kubectl get pods -n $i | grep Evicted| awk '{print $1}' | xargs kubectl delete pods -n $i ;done
pod状态为Unknown
通常该状态为pod对应节点的为NotReady,
kubectl get node
pod为running,但是Not Ready状态
argo-ui-56f4d67b69-8gshr 0/1 Running
pod的readiness健康检查没过导致的
kubectl get pods -n <namespace> <name> -o yaml
找到健康检查部分,关键字为readiness,然后进入pod中执行
健康检查命令
pod为ContainerCreating状态
kubectl describe pods -n <namespace> <name> 的Events部分
网络分配ip地址失败
Init:CrashLoopBackOff
kubectl get pod -n <namespace> <podname> -o yaml
找到pod的Init Containers,并找到其中的name字段
kubectl logs -n <namespace> <podname> -c <Init Containers_name>
可以查看Init Container的日志来分析原因
PodInitializing
需要查看initContainer的日志
node not ready状态
执行df -h查看各分区的磁盘空间情况
systemctl restart docker
systemctl restart kubelet