若Pod停留在Pending状态,说明该Pod不能被调度到某一个节点上。通常是由于资源依赖、资源不足、该Pod使用了hostPort、污点和容忍等原因导致集群中缺乏需要的资源。
Pod的状态为Pending。
查看Pod的事件,根据事件描述,定位Pod不能被调度到节点的原因。主要原因有以下几类:
创建Pod时,需要依赖于集群中ConfigMap、PVC等资源。例如,Pod添加存储卷声明前,存储卷声明需要先与存储卷绑定。
如果您使用了hostPort,那么Deployment或ReplicationController中 Replicas 值不能超过集群中的节点数,因为每个实例的任意端口只有一个。如果该端口被其他应用占用,将导致Pod调度失败。因此建议您不要使用hostPort,您可以使用Service访问Pod,更多信息,请参见 Service 。
Replicas
当您在Pod的事件中看到 Taints 或 Tolerations 时,说明是由于污点导致,您可以删除污点或者给Pod设置容忍。更多信息,请参见 管理污点 、 创建无状态工作负载Deployment 和 污点和容忍 。
若Pod停留在ImagePullBackOff状态,说明此Pod已被调度到某个节点,但拉取镜像失败。
Pod的状态为ImagePullBackOff。
通过查看该Pod的事件描述,查看具体拉取失败的镜像名称。
docker pull [$Image]
[$Image]
以command拼写成commnd为例,说明拼写问题排查方法。
kubectl apply -f
--validate
kubectl apply --validate -f XXX.yaml
XXX] unknown field: commnd XXX] this may be a false alarm, see https://gXXXb.XXX/6842pods/test
kubectl get pods [$Pod] -o yaml > pod.yaml
[$Pod]
kubectl get pods
Pod状态为Terminating。
Pod停留在Terminating状态一段时间后会被自动删除。若Pod一直停留在Terminating状态,可执行如下命令强制删除:
kubectl delete pod [$Pod] -n [$namespace] --grace-period=0 --force
当节点的内存、磁盘空间、文件系统的inode和操作系统可分配的PID等资源中的一个或者多个达到特定的消耗水平,就会引发kubelet主动地驱逐节点上一个或者多个Pod,以回收节点资源。
Pod的状态为Evicted。
status.message
kubectl get pod [$Pod] -o yaml -n [$namespace]
status: message: 'Pod the node had condition: [DiskPressure].' phase: Failed reason: Evicted
kubectl get pods -n [$namespace]| grep Evicted | awk '{print $1}' | xargs kubectl delete pod -n [$namespace]
当集群中的容器使用超过其限制的内存,容器可能会被终止,触发OOM(Out Of Memory)事件,导致容器异常退出。关于OOM事件,请参见 为容器和Pod分配内存资源 。
kubectl get pod [$Pod] -o wide -n [$namespace]
预期输出:
NAME READY STATUS RESTARTS AGE IP NODE pod_name 1/1 Running 0 25h 172.20.6.53 cn-hangzhou.192.168.0.198
/var/log/message
out of memory