前言
Kubernetes(简称 K8s)已经成为了现代容器化世界的事实标准,是一个开放源代码的自动化容器操作系统,最初由 Google 设计。作为一名前端开发者,我们也可能接触到 K8s 的相关知识,比如使用 K8s 进行部署等。在 K8s 里面最核心的部分就是调度器,而在使用 K8s 的过程中,有时我们发现 Pod 会出现 Pending 状态,甚至长时间 Pending 超时,接下来本文将对此进行深入分析。
调度器流程
在深入分析 Pod Pending 为什么会超时之前,我们先简单了解一下调度器的流程。当一个 Pod 被创建时,它默认是未分配到 Kubernetes 集群中任何的 Node 上的,这时候调度器就会将其调度到某个可用的 Node 上。调度器会首先根据 Pod 的资源要求(CPU、内存等)进行筛选,接着会考虑节点污点和它所带的标签等信息,最后会选择一个可以满足 Pod 要求的 optimal node 进行调度。
调度器的大致流程如下图所示:
Pod Pending 解析
在上面的流程中,如果调度器无法将 Pod 调度到可以满足它的节点上,这时候我们就会看到 Pod 处于 Pending 状态。通常情况下,Pod Pending 会很快过去,但有时并不是那么顺利,Pod 就会一直处于 Pending 状态,等待着直到超时。在这种情况下,我们可以通过kubectl describe pod
或 kubectl get events
命令来查看问题所在,通常会出现 Pod 无法调度到 Node 或者调度器没有合适的 Node 等错误信息。
在一个 K8s 集群中,Pod Pending 超时时间默认为 5 分钟,如果在这个时间范围内没有找到一个合适的 Node 对 Pod 进行调度,那么这个 Pod 就会因为超时而被回收。这时候我们可以在 K8s 的控制台中查看相关的事件,以便进一步进行排错。
那么为什么会出现 Pod Pending 超时的问题呢?通常情况下,这个问题出现的比较多的原因有以下几种:
1. 节点资源不足
当一个 Node 上已经有了大量的 Pod 或者该 Node 的 CPU、内存等资源已经被其他 Pod 占用殆尽时,就可能出现无法为此次创建的 Pod 分配到足够的资源而导致 Pending 问题。我们可以通过在节点上查看 Node 状态信息,以及在 Pod 创建时为其指定 NodeSelector 或者 Affinity 来解决此类问题。
2. 节点不符合 Pod 的要求
如果一个 Node 的污点与 Pod 的容忍度不兼容,或者该 Node 上不包含 Pod 中定义的 Label,那么这个 Pod 就无法分配到该 Node 上,出现 Pending 状态。我们可以通过设置 Pod 的 Affinity 或者 NodeSelector 来解决该问题。
3. Pod 本身的问题
如果一个 Pod 容器的 image 镜像推送失败,或者容器配置文件错误等问题,K8s 就会认为这个 Pod 无法运行在任何一个节点上,从而将其放入 Pending 状态。
4. 调度器自身问题
K8s 的调度器本身也可能出现问题,导致 Pod 无法调度到正确的 Node 上去。这种情况比较少见,但如果在其他的排除方式都没有起作用的情况下,我们也需要对 K8s 的调度器进行排错调试。
解决方案
出现 Pod Pending 的问题时,我们可以通过以下的方式来进行解决:
1. 检查调度器的状态
K8s 的调度器本身也可能出现问题,无法从可用的节点中选择出合适的节点进行分配。我们可以通过检查调度器的运行状态来解决该问题,检查方法如下:
kubectl get componentstatuses
2. 检查节点的资源使用情况
我们可以通过 kubectl top 命令或其他的系统性能工具来监控节点的资源使用情况,以便排查节点资源不足的问题。
kubectl top nodes
3. 检查 Pod 的 Affinity 和 NodeSelector
我们可以通过为 Pod 设置 Affinity 和 NodeSelector 来保证 Pod 被分配到正确的 Node 上。
4. 检查 Pod 本身
我们可以通过查看 Pod 的事件和日志,来确定 Pod 自身的问题。如果是 Pod 的镜像推送失败导致的问题,我们可以尝试重新构建镜像。若是配置文件的问题,则需要修改配置文件并重新部署。
总结
本文通过对 K8s 调度器的流程进行了介绍,进而讨论了 Pod Pending 超时的问题。并以此为引入,详细讲解了 Pod Pending 超时的四个常见原因,以及针对问题相关的解决措施。希望读者能够通过本文的介绍,更加深入地了解 K8s 调度器的实现细节,从而能够更好地定位和解决相关问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6454c194968c7c53b0887aea