
有人在群里问,他那边的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>`)





