Kubernetes+Longhorn问题:新增Worker节点就绪但业务Pod无法调度
Kubernetes业务Pod无法调度至新增Longhorn Worker节点的排查方案
核心排查方向(按优先级排序)
检查业务Deployment的调度约束配置
系统Pod无自定义调度限制,但业务Deployment可能存在nodeSelector、nodeAffinity或topologySpreadConstraints,绑定了旧节点的专属标签(如自定义硬件标识、可用区标签)。- 执行命令查看调度相关配置:
kubectl get deployment <业务Deployment名称> -n <命名空间> -o yaml | grep -A 20 -B 5 "nodeSelector\|affinity\|topologySpreadConstraints" - 若发现
requiredDuringSchedulingIgnoredDuringExecution类型的硬亲和规则,或nodeSelector指定了新节点缺失的标签,需更新Deployment配置移除不必要约束,或给新节点补充对应标签。
- 执行命令查看调度相关配置:
验证Longhorn存储绑定限制
若业务Pod使用已创建的PVC,对应的PV可能通过Longhorn绑定到了旧节点的存储卷,导致Pod只能调度到该节点:- 查看PVC关联的PV节点亲和性:
kubectl get pv $(kubectl get pvc <业务PVC名称> -n <命名空间> -o jsonpath='{.spec.volumeName}') -o yaml | grep -A 10 "nodeAffinity" - 若PV绑定了旧节点标签,可尝试:
- 创建新PVC并更新Deployment使用新PVC,Longhorn会根据调度规则绑定到新节点;
- 若需复用现有数据,通过Longhorn卷克隆功能生成新卷后绑定到新PVC。
- 查看PVC关联的PV节点亲和性:
检查节点标签匹配
确认新节点是否具备业务Pod要求的所有标签:- 对比新旧节点标签:
kubectl get nodes --show-labels | grep -E "<旧节点名称>|<新节点名称>" - 若新节点缺失业务Pod依赖的标签,执行命令补充:
kubectl label nodes <新节点名称> <标签键>=<标签值>
- 对比新旧节点标签:
验证调度器配置
确认默认调度器未被修改,或业务Pod未指定自定义调度器:- 检查Deployment的调度器指定:
kubectl get deployment <业务Deployment名称> -n <命名空间> -o yaml | grep "schedulerName" - 若使用自定义调度器,需确认其规则未排除新节点;若使用默认调度器,检查调度器配置是否存在节点优先级过滤:
kubectl get configmap kube-scheduler -n kube-system -o yaml
- 检查Deployment的调度器指定:
快速验证方法
创建无任何约束的测试Pod,验证新节点是否可正常接收业务负载:
kubectl run test-business-pod --image=nginx --restart=Never -n <业务命名空间>
若测试Pod成功调度至新节点,说明问题出在现有业务Deployment的配置或存储绑定;若仍无法调度,需检查集群全局调度策略(如调度器插件、准入控制器)。
内容的提问来源于stack exchange,提问作者tryzrxcatch
相关产品推荐
相关产品推荐

