昇腾社区首页
中文
注册
开发者
下载

同一个任务的不同Pod配置不同的nodeSelector导致重调度失败

问题现象描述

同一个任务的不同Pod配置不同的nodeSelector,例如,Master Pod配置如下nodeSelector:

Worker Pod配置如下nodeSelector:

同时集群中节点的labels如下,第一次调度时,Master Pod调度到node-69-77节点;Worker Pod调度到worker-69-87节点。

此时worker-69-87节点发生故障,进行Pod级别重调度:

但由于资源不足,无法完成调度,升级为Job级别重调度,再将故障恢复,此时资源已充足,但任务Pod仍然无法调度:

原因分析

重调度时,基于Volcano的调度逻辑,先创建的Pod会优先调度。当前场景下Worker Pod先删除先创建,其被优先调度,此时两个节点均满足条件。同时在重调度逻辑中,节点优选时,发生过故障的节点分数会被降低,所以Worker Pod选择了原Master Pod运行的节点worker-69-87。由于Master Pod包含nodeSelector "masterselector: dls-master-node",因此无法选择worker-69-87节点。基于Volcano的一致性调度原则,导致整个任务均无法调度。

解决措施

  1. 在逻辑超节点亲和性调度场景下,要求同一任务下所有Pod的调度参数,主要是nodeSelector,需要保持一致。
  2. 在非逻辑超节点亲和性调度场景下,建议调度参数保持一致。若实际场景中确实需要Pod有不同的nodeSelector,需达到互斥效果,即不同的Pod只能调度到对应的节点资源池中。例如,在上述问题中,可以在Worker Pod中增加一个nodeSelector,使其不能调度到Master Pod所需要的节点上。