即使在高成熟度级别 Kubernetes 集群中 pod pending 也是无处不在。

如果您随机询问任何使用 Kubernetes DevOps 工程师来确定折磨他们噩梦的最常见错误,pod pending 可能是非常常见的问题(可能仅次于 CrashLoopBackOff)。

尝试推送更新并看到它卡住会使 DevOps 紧张。即使解决方案相当简单,找到 pod 挂起的原因并了解您需要应用的更改也很重要(Kubernetes 故障排除很少是微不足道的)。

在本文中,我们将阐明导致此问题的不同情况,让 DevOps 团队能够快速找到解决方案,最重要的是,尽可能避免它。

Kubernetes Pod pending 是什么意思?

Kubernetes 中的 Pod 的生命周期由几个不同的阶段组成:

  • 创建 pod 时,它从Pending阶段开始。
  • 一旦 pod 被调度并且容器已经启动,pod 就会进入Running阶段。

大多数 pod 只需要几秒钟就可以从 Pending 到 Running 并在该状态下度过大部分时间。

至此,Pod 已被 Kubernetes 集群接受。但是一个或多个容器尚未准备好对外提供服务。这包括 Pod 等待调度所花费的时间以及通过网络下载容器镜像所花费的时间。

当 pod 无法从 PendingtoRunning 阶段前进时,生命周期将停止并保留 pod,直到阻止它前进的问题得到修复。

如果我们使用 kubectl 列出 pod,我们将看到显示 Kubernetes pod 挂起情况的输出:

$ kubectl -n troubleshooting get pods
NAME                                           READY   STATUS    RESTARTS   AGE
stress-6d6cbc8b9d-s4sbh                        0/1     Pending   0          17s