适用于 Kubernetes 1.24+、kubectl 1.24+。先记录客户端和服务端版本,并确认版本偏差在官方支持范围内;读取 Pod、Event、PVC 和 Node 需要对应 RBAC 权限。示例里的 NS、POD、PVC 都要替换。先别删 Pod,事件和调度信息通常比重建更有用。
kubectl version
kubectl -n NS get pod POD -o wide
kubectl -n NS get pod POD -o jsonpath='{range .status.conditions[?(@.type=="PodScheduled")]}{.status}{"\t"}{.reason}{"\t"}{.message}{"\n"}{end}'
kubectl -n NS describe pod POD
kubectl -n NS get events \
--field-selector involvedObject.kind=Pod,involvedObject.name=POD \
--sort-by=.metadata.creationTimestamp
PodScheduled=False 且原因是 Unschedulable,重点看 message 里到底是 CPU/内存 request、taint、亲和性、拓扑约束,还是卷的节点亲和性不满足。不要看到 Insufficient cpu 就只看实时 CPU;调度器比较的是 request 和可分配量。可继续核对 kubectl -n NS get pod POD -o yaml、kubectl describe node NODE,共享输出前先清掉环境变量等敏感字段。
如果消息指向未绑定卷,再查:
kubectl -n NS get pvc
kubectl -n NS describe pvc PVC
kubectl get storageclass
如果 PodScheduled=True 但 Pod 仍是 Pending,说明已经放到节点上了,转看 init container 和普通容器的 waiting reason;常见会落到 ContainerCreating、ErrImagePull 或 ImagePullBackOff,这时继续改调度约束通常没用。
修改配置后用 kubectl -n NS get pod POD -w 观察状态变化,再复查 PodScheduled 条件和同一 Pod 的事件;最终至少确认目标容器进入 Ready,而不是只看到 phase 从 Pending 变成 Running。