记一次Pod处于Pending问题

前言

最近在服务部署k8s节点,部署完成之后,服务器上的pod节点一直处于Pending状态。在Kubernetes中,当一个Pod处于Pending状态时,意味着该Pod无法调度到一个节点上运行。有几个原因可能导致Pod处于Pending状态:

  • 没有足够的资源:当集群中的节点资源(例如CPU和内存)不足以满足Pod的要求时,Pod会处于Pending状态。你可以检查集群的资源使用情况,尝试增加节点或调整资源请求和限制来解决问题。
  • 网络问题:Pod可能需要与其他服务进行通信,但网络配置不正确或网络连接不稳定。你可以检查Pod的网络配置,并确保网络连接正常。
  • 调度约束:Pod可能有标签约束或亲和性/反亲和性设置,导致无法找到合适的节点进行调度。你可以检查Pod的标签和调度约束,并根据需要适当调整它们。
  • 持久卷问题:如果Pod有持久卷声明(PersistentVolumeClaim),那么可能没有可用的持久卷(PersistentVolume)来满足要求。你可以检查持久卷的状态,并确保有足够的可用持久卷。
  • 镜像拉取问题:如果Pod使用的镜像无法从容器镜像仓库中拉取,那么Pod将一直处于Pending状态。你可以检查镜像名称和可用性,并确保镜像仓库的访问权限正确。

你可以使用以下命令来获取有关Pending状态Pod的更多信息:

kubectl describe pods <pod-name>

这将显示有关Pod的详细信息,包括任何可能导致Pending状态的错误消息。

问题展示

根据上面的描述,我们来定位下

kubectl describe pods tjpt-hj-service-6f8999cc9-bx8hp

执行上述命令之后,可以看到当前pod的一些详细信息,忽略上面的pod的一些配置元信息,看到一个关键信息,信息如下

Warning  FailedScheduling  64m   default-scheduler  0/4 nodes are available: 1 Too many pods, 
1 node(s) had taint {node_type: gpu}, that the pod didn't tolerate, 3 Insufficient memory

上面信息,可以做一下分析排查

  • "Too many pods":这意味着某些节点上运行的Pod数量已达到或超过其容量限制。在这种情况下,你需要考虑增加节点数量或调整Pod的分布,将负载更均匀地分配到不同的节点上。
  • "node(s) had taint {node_type: gpu}":这表示某些节点上设置了名为 "node_type" 的taint(污点),并且Pod没有在调度时设置相应的容忍度(toleration)。这可能是由于Pod定义中没有相应的toleration或toleration设置不正确。你可以通过在Pod的spec中添加toleration来解决此问题,以允许Pod调度到具有该taint的节点上。
  • "Insufficient":这表示剩余节点上的资源不足以满足Pod的资源需求。这可能是由于Pod的资源请求(requests)超过了节点可用资源的限制。你可以检查Pod的资源请求和限制,并根据需要调整它们,以确保它们能够在节点上调度。

针对以上问题,你可以采取以下措施进行排查和解决:

  • 使用以下命令检查节点的容量以及Pod和资源的使用情况:
  kubectl get nodes
  kubectl get pods --all-namespaces -o wide
  kubectl describe node <node-name>
  • 了解Pod的资源需求和限制,并根据需要调整它们。可以通过编辑Pod的定义文件或使用kubectl edit命令来完成。
  • 如果你确定Pod定义中的toleration设置是正确的,但Pod仍然无法调度到具有taint的节点上,请确保Pod的tolerations字段中的键值对与节点上设置的taint完全匹配。
  • 如果节点数量不足且Pod数量超过节点容量限制,则需要考虑增加节点数量。这可以通过在集群中添加新节点或进行自动扩展操作来实现。

看到关键字"Insufficient memory",显然是内存不足了。由于公司的开发环境,开发联调,以及测试环境是共享一个k8s集群,开发环境k8s不咋用,暂时先把开发环境的pod先停掉。执行下述命令即可,注意下面命令会把所有deployment都删掉,请谨慎操作哈。如果觉得风险较大,可以选择那些暂时用不上的deployment删除。

kubectl delete deployment --all

删除完成之后,再去开发联调环境重新部署就ok了。

猜你喜欢

转载自blog.csdn.net/qq_28165595/article/details/131868553
今日推荐