即使在高成熟度级别 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