问题描述
多节点集群环境,下发分布式训练任务,若此时资源刚好满足,并且开启任务重调度且重调度参数“fault-scheduling”设置为“grace”。此时,如果出现故障,触发重调度,则任务重调度后概率性出现一个Pod状态为Running和一个Pod状态为Pending的情况,即使后续故障恢复,状态为Pending的Pod依然Pending。
原因
- 该问题是开源代码中对任务数量的判断存在问题。
当Pod被终止时,若容器中的脚本没有返回非0的值时(即返回0值时),则Pod的状态会显示为Success(K8s机制)。此时该Pod正在释放资源,Volcano调度器则会将该Pod(未重启)算作是已经重启且状态为Success。这种情况下,刚好满足Volcano的gang调度插件的机制,先重启的Pod会进入创建阶段。后面,当正在终止的Pod结束并重新拉起时,则会由于资源不足进入Pending状态。
- 未使用断点续训的脚本。
- 集群资源不够。
解决方法
- 手动删除已运行的Pod(命令:kubectl delete pod -n pod所在的namespace pod名称)
- 删除该任务重新下发