Skip to content
容器与编排异常排查 · 第 1 篇 / 共 2 篇
领域生产问题
专题数据与基础设施排障专题
当前序列容器与编排异常排查
阅读位置第 1 篇 / 共 2 篇当前专题第 3 个序列 / 共 5 个序列

Kubernetes Pod Pending 时怎么排查 ​

Pod Pending 的特点是看起来“什么都没报错,但它就是起不来”。

业务侧通常只会看到:

  • 副本数一直补不上
  • 发布卡住
  • HPA 扩容了但没有新实例真正接流量
  • Pod 状态一直停在 Pending

它和 CrashLoopBackOff 不一样,Pending 说明容器通常还没真正运行起来。大多数根因集中在:

  • 调度不到节点
  • 资源申请过大
  • 亲和性/污点限制太严
  • PVC 绑定或挂载卡住
  • 镜像拉取前置条件没准备好

先说结论 ​

  • Pod Pending 第一件事是看事件,先分清是调度问题还是存储问题
  • 如果是批量 Pending,要先判断是集群容量不足,还是某个调度约束把可用节点都排除了
  • 如果是有状态服务 Pending,要特别警惕 PVC、StorageClass、Zone 和节点约束组合出来的问题
  • 很多 Pending 不是“集群不够大”,而是 requests、亲和性、污点、卷绑定条件叠加后没有可落点了

一个典型故障现场 ​

一个典型场景是业务高峰期触发 HPA 扩容,结果:

  • 目标副本数上去了
  • 新 Pod 一直 Pending
  • 老 Pod 负载继续升高
  • 应用方以为“扩容失效”

另一种典型场景是 StatefulSet 发布或节点漂移后:

  • 某个 Pod 删除后一直起不来
  • PVC 一直卡在绑定或挂载阶段
  • 同机房有节点,但就是调度不上去

这类问题如果只看 Pod 状态本身,很容易看不出真正卡点。

第一阶段:先止血,别让发布和扩容继续加剧问题 ​

1. 如果是发版引发的 Pending,先暂停滚动 ​

因为继续滚动通常只会让更多旧副本被替换掉,而新副本又起不来。

2. 如果是高峰期扩容失败,先评估是否需要临时人工扩容节点或降级业务 ​

Pending 本身不会耗 CPU,但它意味着你指望的新容量根本没有真正落地。

3. 对有状态服务先保护现有健康实例 ​

如果 Pending 的是 StatefulSet,不要急着反复删 Pod 重建,更要先确认卷和调度约束是否匹配。

第二阶段:先判断卡在调度,还是卡在存储 ​

1. 调度型 Pending ​

典型信号是:

  • 没有合适节点
  • request 太大
  • 亲和性要求太严
  • 污点没容忍
  • topology spread、zone 限制把节点都排除了

2. 存储型 Pending ​

典型信号是:

  • PVC 一直没绑定
  • volume attach/mount 失败
  • StorageClass 配置不匹配
  • Zone 和卷位置不一致

先分清这两类,很多时候就已经接近根因了。

第三阶段:现场最该看的几类信息 ​

1. Pod 事件 ​

Pending 最有价值的信息通常就在事件里,比如:

  • Insufficient cpu
  • Insufficient memory
  • node(s) had taint
  • node(s) didn't match Pod affinity
  • pod has unbound immediate PersistentVolumeClaims

2. requests/limits 和节点可用资源 ​

很多团队看到节点整体资源还有余量,就以为不该 Pending。但调度看的是:

  • 单节点是否能满足这一个 Pod 的 request
  • 节点碎片化是否严重
  • 亲和性和污点过滤后还剩多少可选节点

3. 亲和性、反亲和性、污点容忍 ​

这类约束很容易在平时没问题,但扩容、节点维护、某个可用区资源吃紧时突然暴露出来。

4. PVC、StorageClass、Zone ​

尤其是 StatefulSet、数据库、中间件类服务,很多 Pending 的根因并不在 CPU/内存,而在:

  • 卷没绑定
  • 卷和节点不在同一区域
  • StorageClass 不支持当前模式
  • 原卷还挂在别的节点或状态异常

常见根因画像 ​

1. request 配太大,集群资源被碎片化 ​

节点总资源够,但没有任何一个单节点能完整放下这个 Pod。

2. 亲和性太强,把候选节点几乎筛没了 ​

例如既要求某个 zone,又要求和另一组服务同节点,同时还要求避开某类节点,最后没有可调度目标。

3. 污点和容忍没对上 ​

节点明明有资源,但工作负载没有对应的 toleration。

4. PVC 绑定失败或卷挂载卡住 ​

有状态服务里这是非常高频的一类 Pending 根因。

5. 集群扩容速度跟不上业务扩容速度 ​

HPA 已经开始扩 Pod,但底层节点池没有及时补上,结果大量副本 Pending。

一个更实用的排查顺序 ​

现场我通常按这个顺序看:

  1. 先看 Pod 事件,判断是调度型还是存储型 Pending。
  2. 如果是调度型,再看 request、节点资源、污点、亲和性。
  3. 如果是存储型,再看 PVC、PV、StorageClass、Zone 和挂载事件。
  4. 看这是单个工作负载问题,还是同一批 workload 都在 Pending。
  5. 最后再判断是暂时扩容节点、调整调度约束,还是回滚变更。

这个顺序能避免把本来很明确的 Pending 事件,排查成一场漫无目的的集群巡检。

止血后的治理方向 ​

1. 给工作负载做更真实的 requests 评估 ​

不要为了“看起来保险”就把 request 拉得过高。

2. 亲和性和污点规则要定期审查 ​

很多规则在最初设计时合理,但随着节点池、机房和服务规模变化,会越来越容易卡调度。

3. 有状态服务要提前演练卷漂移和节点故障恢复 ​

不要等 Pod Pending 了才第一次去理解 PVC、StorageClass 和 Zone 的绑定关系。

4. 扩容链路要看完整 ​

HPA、节点池扩容、存储供应速度,这几层缺一层,最终都会表现成 Pod Pending。

总结 ​

Pod Pending 真正要解决的,不是“它为什么还没起来”这个表象,而是先分清:

  • 是没地方调度
  • 还是卷没准备好
  • 是资源不够
  • 还是规则太严

把“事件、资源、调度约束、存储绑定”这四条线先看清,绝大多数 Pending 故障都能很快缩到真正根因上。

延伸阅读相关文章优先当前专题,再补跨专题关联。
同一序列 · 顺着当前主线继续读Kubernetes CrashLoopBackOff 时怎么排查适合把 K8s、RabbitMQ 和数据库锁等待问题放在一条故障治理主线上看。数据与基础设施排障专题 · 基础设施与中间件故障案例同一序列 · 顺着当前主线继续读RabbitMQ 队列积压时怎么排查适合把 K8s、RabbitMQ 和数据库锁等待问题放在一条故障治理主线上看。数据与基础设施排障专题 · 基础设施与中间件故障案例同专题其他序列 · 共享标签:线上排障、案例排障磁盘打满后为什么删除文件不一定立刻生效适合把 Redis 抖动、MySQL 连接打满、MQ 积压、ES 发黄、ClickHouse 合并堆积和磁盘打满放在同一条基础设施排障主线上看。数据与基础设施排障专题 · 数据与基础设施故障的分层排查同专题其他序列 · 共享标签:线上排障、案例排障磁盘打满时怎么排查适合把数据库连接、死锁、网关异常和磁盘空间问题放在一条排障线上看。数据与基础设施排障专题 · 数据库与网关故障排查跨专题关联 · 共享标签:线上排障、案例排障大 Header、buffer、timeout 问题怎么排查适合把 location 匹配、缓冲区和负载均衡放在一起看。容器与站点部署专题 · Nginx 进阶路由与代理治理跨专题关联 · 共享标签:线上排障、案例排障缓存穿透、击穿、雪崩与缓存一致性适合把缓存更新、击穿雪崩、回源策略和事务边界放到同一条缓存治理主线上看。Redis 专题 · Redis 缓存一致性与更新策略
继续阅读容器与编排异常排查当前序列第 1 篇 / 共 2 篇当前专题第 3 个序列 / 共 5 个序列
往前看
上一序列缓存、消息与检索故障排查从第 1 篇开始:Redis 热 Key 突增时怎么止血和回查
往后看
下一篇Kubernetes CrashLoopBackOff 时怎么排查继续当前序列下一章下一序列基础设施与中间件故障案例从第 1 篇开始:Kubernetes Pod Pending 时怎么排查

把零散经验整理成可查、可复用、可持续更新的企业级知识门户