
最近遇到一次两个相同应用的pod压在一台服务器上,导致了业务高峰期服务器过载,所以添加了pod反亲和,但是在部署的时候出现了异常,对应的 Pod 出现 Pending 状态且无法调度到节点上。出现无法调度的情况,我们可以从以下几个方面来分析。
一、可能的原因分析
1、节点资源不足
计算资源不足 :集群中的节点可能没有足够的 CPU、内存等计算资源来满足待调度 Pod 的需求。即使节点上没有与该 Pod 反亲和的 Pod,但由于资源不足,也无法将 Pod 调度到该节点上。
存储资源不足 :如果 Pod 需要使用 PersistentVolumeClaim(PVC)来存储数据,但集群中没有足够的存储资源满足 PVC 的需求,也会导致 Pod 无法调度。
2、节点相关问题
节点不可调度:某些节点可能被标记为不可调度状态,如节点的健康检查失败、节点进入了维护模式或者被管理员手动执行了 `kubectl cordon` 命令 。此时,即使节点上没有与待调度 Pod 反亲和的 Pod,也无法将 Pod 调度到该节点上。
污点与容忍不匹配 :如果节点上有污点(Taints),而待调度的 Pod 没有相应的容忍(Tolerations),那么 Pod 也无法被调度到该节点上。
3、其他问题
Pod 安全策略限制:如果集群启用了 Pod 安全策略(Pod Security Policies),而待调度的 Pod 不符合这些策略的要求,那么即使满足反亲和规则和其他调度条件,Pod 也可能无法被调度。
调度器异常:Kubernetes 的调度器(Scheduler)可能存在异常或故障,导致无法正常进行调度工作。这种情况下,不仅会影响设置了反亲和规则的 Pod,还可能影响其他 Pod 的调度。
4、反亲和规则过于严格
规则限制导致无合适节点 :如果使用的是 `requiredDuringSchedulingIgnoredDuringExecution` 类型的反亲和规则,且集群中所有节点都因该规则而无法满足调度条件,那么 Pod 就会一直处于 Pending 状态。例如,当设置 Pod 反亲和规则要求每个节点上只能有一个特定标签的 Pod 运行时,当副本数量等于集群节点数量时,再次创建该标签的 Pod 就无法被调度。
拓扑键选择不当 :如果 `topologyKey` 选择不当,可能会导致反亲和规则无法正确匹配节点。比如将 `topologyKey` 设置为一个不合适的标签,使得 Kubernetes 无法根据该标签正确地划分节点拓扑结构,从而无法找到合适的节点来调度 Pod。

二、具体排查步骤
1、检查调度事件
kubectl describe pod <pod-name>
查看 Pod 的详细信息,包括调度事件和错误信息。在 `Events` 部分可以找到调度失败的具体原因,如资源不足、节点选择器不匹配等。
2、检查节点状态和资源
查看节点的状态和资源使用情况可使用 `kubectl get nodes` 查看节点的总体状态,使用 `kubectl describe node <node-name>` 了解节点的资源使用情况,包括 CPU、内存等计算资源,以及存储资源的使用情况。
3、检查反亲和规则配置
仔细检查 Pod 的反亲和规则配置,确保规则的正确性和合理性。检查 `labelSelector` 是否正确匹配目标 Pod 的标签,确保 `topologyKey` 选择合适。
4、检查节点污点与容忍
使用 `kubectl get nodes -o custom-columns=NAME:.metadata.name,TAINTS:.spec.taints --no-headers` 命令查看节点上的污点,检查待调度 Pod 的容忍配置是否与之匹配。
5、检查 Pod 安全策略
如果集群启用了 Pod 安全策略,查看相关 Pod 安全策略规则,确保待调度的 Pod 满足这些策略的要求。
6、查看调度器日志
我们还可以查看调度器日志来获取更详细的调度信息和错误提示。到master上检查kube-scheduler的日志。
经过一步步的检查,我们出现的问题是有两个节点的label参数kubernetes.io/hostname重复了。。。,修改其中一台之后,调度恢复正常。
运维笔谈已经开通AI智能对话功能,解答有关运维日常工作中遇到的问题以及经验分享,感兴趣的大佬来和我聊聊吧!对话 “阿里云k8s” 可以获取《阿里云Kubernetes项目实战手册》pdf。




