Pod 卡在 Pending:调度器四道关卡,先读 Events 再动节点
kubectl get pod 看到 Pending,很多人第一反应是去查网络和镜像。方向就错了:Pending 意味着调度器还没把 Pod 绑定到任何节点,容器根本没被创建,镜像也没开始拉。所以排查入口只有一个,就是 describe 出来的 Events,那里会直接写出调度器拒绝的原因。 我习惯把这四类原因按调度器实际过滤的顺序排一遍,从节点资源开始,到存储结束。顺着读一遍,基本不会漏。 第一关:资源账本对不对得上 调度看的是每个节点上所有 Pod 的 requests 之和,不是实际用量。很多人拿节点规格去比,觉得 8 核 16G 的机器跑一个 4 核的 Pod 绰绰有余,却忽略了 allocatable 小于 capacity。kubelet 要预留系统资源,CCE 节点上还会有 kube-reserved 和 system-reserved,加上 DaemonSet 常驻占用的那部分,可分配量往往比规格少一到两成。 判断方法是 kubectl describe node,看 Allocated resources 那一段的 requests 百分比,而不是看 top。如果某个节点的 requests 已经接近 100%,请求 4 核的 Pod 当然排不进去。另一种常见情况是 request 写得过大而 limit 没写,调度器只认 request,Pod 会被自己虚报的需求挡住。 第二关:节点亲和与污点容忍 nodeSelector 和 requiredDuringSchedulingIgnoredDuringExecution 这种硬亲和,是必须满足的条件,写错一个 label 值就会一直 Pending,Events 里会写 node(s) didn't match node selector。 污点更容易被忽略。节点只要有 NoSchedule 或 NoExecute 污点,Pod 就必须带对应的 toleration。CCE 新建节点池时经常带初始化污点,GPU 节点也常打专用污点,Pod 没写 toleration 就会全量卡住。注意 NoExecute 还会把已经跑着的 Pod 驱逐出去,现象会从 Pending 变成反复重启,排查时要分清。 第三关:拓扑打散与反亲和 topologySpreadConstraints 的 whenUnsatisfiable 设成 DoNotSchedule 时,maxSkew 一旦无法满足,副本就会停在 Pending。单可用区或单节点的小集群里,这类配置几乎必然卡住,因为打散的域不够。 podAntiAffinity 的 required 同理:要求同一节点不能有同类 Pod,但集群只有一个可调度节点时,第二个副本就永远起不来。这两种情况 Events 会写 node(s) didn't match pod affinity rules 或 didn't satisfy topology spread constraints,看到这类消息先去看副本数和节点数的关系,而不是继续算资源。 第四关:存储与端口 PVC 没绑定,Pod 就排不上。WaitForFirstConsumer 模式下 PVC 本身是 Pending,要等调度器先选节点再建卷,这时候 Pod Pending 是正常的中间态,看 Events 里有 waiting for first consumer 就不要急着改配置。 另一个容易被忽略的上限是每节点最大 Pod 数。CCE 默认 110,节点上小 Pod 特别多时会被这个数卡住,Events 会写 Too many pods。还有 hostPort 冲突:两个 Pod 抢同一个节点的同一端口,后到的那个排不上去。 我的排查顺序 先把 kubectl describe pod 的 Events 从下往上读,最后一条 Unschedulable 消息基本就是答案;然后 kubectl describe node 交叉验证 Allocated resources 和 Taints;最后看副本数与节点数的关系,确认是不是拓扑约束过严。 如果资源确实紧张,可以考虑 PriorityClass 配合抢占,高优先级 Pod 会驱逐低优先级 Pod 腾位置,但这是有代价的操作,要确认被驱逐的业务能接受。更稳的做法是把 request 调准,而不是一上来就加节点。 一句话总结:Pending 是调度阶段的拒绝,先把 Events 读完整,四道关卡逐个对号,别从网络和镜像开始猜。 参考(纯文本): https://kubernetes.io/docs/concepts/scheduling-eviction/ https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/ https://support.huaweicloud.cn/usermanual-cce/cce_10_0010.html
- 点赞
- 收藏
- 关注作者
评论(0)