Pending 是什么
Pending 表示对象已经被集群接受,但还没有真正跑起来。它有两个含义要分开看:一种是没有节点愿意接收,属于调度问题;另一种是节点已经确定但准备工作没完成,比如卷没挂上、镜像在下载、网络还没配好。状态本身不给原因,事件里才有。
为什么先看事件
描述信息末尾的事件列表会写明具体约束:资源不足、标签不匹配、污点不容忍、卷不可用、亲和规则冲突。调度类问题几乎都能在这里一眼看出,比反复推测快得多。需要注意事件有保留时间,卡了一段时间的对象要尽快取现场。
基本信息
| 适用环境 | 任何 Kubernetes 发行版,属于对象生命周期的一个阶段 |
|---|---|
| 两类成因 | 调度未完成,或已调度但准备未完成 |
| 关键证据 | 描述信息中的条件与事件列表 |
| 常见事件 | 调度失败、卷附加失败、挂载失败、镜像拉取中 |
| 资源依据 | 节点可分配量小于容器请求值之和 |
| 保留限制 | 事件有过期时间,需要及时查看 |
典型使用场景
- 扩容后新副本起不来:集群资源不够,请求值之和超出剩余可分配量
- 约束冲突:亲和规则、节点选择器与污点组合导致无节点满足
- 卷未就绪:云盘正在附加或跨节点冲突,等待时间较长
- 配置缺失:引用的配置对象或密钥不存在,卡在挂载阶段
- 调度器异常:调度组件未运行或不可用,所有新对象都停在未调度状态
- 验证约束调整:修改亲和或资源请求后确认新副本能被正常调度
定位步骤
定位步骤
kubectl describe pod pending-x | sed -n '/Events:/,$p' # 先看事件原因
kubectl get events --field-selector involvedObject.name=pending-x --sort-by=.lastTimestamp
kubectl describe node node-1 | grep -A8 'Allocated resources' # 节点剩余可分配量
kubectl get nodes --show-labels # 核对标签与污点
kubectl describe node node-1 | grep -i taints常见事件指向
| 事件原因 | 指向的问题 | 处理方向 |
|---|---|---|
| 调度失败 | 无节点满足资源、标签、亲和或污点约束 | 放宽约束或增加节点容量 |
| 卷附加失败 | 云盘附加未完成或跨节点冲突 | 等待或确认卷的拓扑限制 |
| 挂载失败 | 引用的配置对象或存储卷不可用 | 核对对象是否存在与命名空间 |
| 镜像拉取中 | 镜像较大或仓库较慢 | 观察等待,必要时预热镜像 |
资源视角的核对顺序
- 先确认节点可分配量还剩多少,注意系统组件预留会明显降低可用量
- 再核对容器的请求之和是否超过单个节点的可分配量,这种配置永远无法调度
- 最后检查是否有亲和、污点与拓扑约束把可选范围缩小到零
节点的可分配量小于机器总内存与总核数,系统与运行时预留的部分对业务不可用,容量评估必须按可分配量来算。
卷为单节点读写类型时会把对象限制在已附加该卷的节点上,容量看起来够却调度不上去,往往就是这个原因。