暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Kubernetes集群中出现 Pod 总是调度到同一节点的现象

运维笔谈 2025-03-09
46

有人在群里问,他那边的k8s 1.18.1经常遇到pod总是往一台节点上调度,想我们帮他出点主意。Kubernetes集群中出现 Pod 总是调度到同一节点的现象,猜测可能是有如下几个情况,抛砖引玉。

一、几个可能的原因

1. 节点资源分配不均或调度策略偏差

Kubernetes 调度器有基于 Pod 的 `requests` 值计算节点的可用资源。如果某个节点的 `requests` 资源剩余量较高(例如其他 Pod 的 `requests` 设置较小),调度器会优先选择该节点。

执行 `kubectl describe node <目标节点>`,查看 `Allocatable` 和 `Allocated` 字段,对比其他节点的资源分配情况。若目标节点的剩余资源量显著高于其他节点,可能是调度器认为其更适合调度。

解决方案 :调整 Pod 的 `requests` 配置,避免因某些节点requests预留过高导致调度集中。例如,降低高负载节点的 Pod 的requests值。

2. 节点污点(Taints)或 Pod 容忍(Tolerations)配置

其他节点可能被设置了污点(如 `NoSchedule`),而目标节点未设置污点,或只有目标节点具备 Pod 所需的容忍。

运行 `kubectl describe node <其他节点>`,查看Taints字段。若其他节点存在污点(如 `node.kubernetes.io/not-ready`),而目标节点无污点,调度器会排除其他节点。

解决方案:

  • 若需调度到其他节点,为 Pod 添加对应容忍(`tolerations`)或移除其他节点的污点(`kubectl taint nodes <节点名> <污点键>--`)。

  • 若目标节点被误标记为不可调度(`SchedulingDisabled`),使用 `kubectl uncordon <节点名>` 恢复调度。


3. 节点标签(Labels)与 Pod 选择器(NodeSelector/Affinity)

Pod 可能通过 `nodeSelector` 或 `nodeAffinity` 指定了仅目标节点满足的标签(如 `disktype: ssd`)。

执行 `kubectl get pod <Pod名称> -o yaml `,查看是否定义了 `nodeSelector` 或 `affinity` 规则。同时检查其他节点的标签(`kubectl get nodes --show-labels`)。

解决方案:删除或调整 Pod 的节点选择规则,或为其他节点添加匹配的标签(如 `kubectl label nodes <节点名> disktype=ssd`)。

4. 调度器插件或自定义策略干扰

Kubernetes 支持自定义调度插件,若集群中部署了调度插件(如基于节点负载的调度策略),可能因权重计算导致偏好特定节点。

查看调度器配置(通常为 `/etc/kubernetes/manifests/kube-scheduler.yaml`),确认是否存在自定义的 `policy` 或插件配置。

解决方案:调整调度策略的权重参数,或暂时禁用插件观察是否问题复现。

5. 节点健康状态异常

其他节点可能处于 `NotReady` 或 `Unreachable` 状态,导致调度器仅能选择健康节点。

运行 `kubectl get nodes`,确认所有节点状态均为 `Ready`。若其他节点异常,需进一步排查 Kubelet 日志(`journalctl -u kubelet`)。

解决方案:修复异常节点(如重启 Kubelet、清理磁盘空间),或临时驱逐故障节点(`kubectl drain --ignore-daemonsets <节点名>`)。

二、快速排查步骤

1. 查看调度事件  

执行 `kubectl describe pod <Pod名称>`,查看 `Events` 字段中的调度失败原因(如资源不足、节点选择冲突等)。

2. 检查节点资源与标签  

对比各节点的资源分配和标签,确认是否存在明显差异。

3. 验证调度器行为  

手动模拟调度:`kubectl create -f <Pod配置文件> --dry-run=server`,观察调度结果是否符合预期。

若上述排查未解决问题,可进一步提供以下信息:  

• 目标节点与其他节点的 `kubectl describe node` 输出  

• 异常 Pod 的 YAML 定义(需脱敏)  

• 调度器日志(`kubectl logs -n kube-system <kube-scheduler-pod>`)  

运维笔谈已经开通AI智能对话功能,解答有关运维日常工作中遇到的问题以及经验分享,感兴趣的大佬来和我聊聊吧!对话 “阿里云k8s” 可以获取《阿里云Kubernetes项目实战手册》pdf。

文章转载自运维笔谈,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论