pod状态异常原因分析

本文详细分析了Kubernetes中Pod的各种异常状态,包括CrashLoopBackOff、Pending、Init:0/1、Terminating、Evicted和Unknown等,并提供了相应的排查和解决方法,如检查Node状态、查看Pod日志、处理资源限制和污点等。

前置检查

在排查异常状态的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

 

 

 

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值