本文介绍如何使用云容器引擎的Gang scheduling能力,解决原生调度器无法支持All-or-Nothing作业调度的问题。
前提条件
已安装cube-coordinator插件,安装插件步骤请参考安装插件。
背景信息
Gang scheduling,是一种保证一组相关任务同步执行的调度策略,多个任务的作业调度时,要么全部成功,要么全部失败,这种调度场景,称作为Gang scheduling。其中一个经典使用场景是分布式机器学习训练:在大规模机器学习模型的训练中,数据可能被分布到多个节点上,每个节点都需要运行一个模型的副本。这些模型副本需要同时开始训练,以保证参数更新的同步。随着大规模和复杂的工作负载在Kubernetes上的普及,需要对应的调度策略适配这种场景,避免资源浪费和延迟。由于Kubernetes的核心调度器默认不支持Gang scheduling,使得一些工作负载无法很好地迁移至Kubernetes。为了适配这种场景,目前的CCSE基于调度器框架实现Gang scheduling功能,可以在CCSE中非常方便使用该能力。
功能介绍
为了实现All-or-Nothing的特性,首先需要将一组同时调度的Pod通过annotations标识出来,这个标识可称为PodGroup。提交作业的时候调度器可根据工作负载的相关annotations,获取调度的配置并进行调度。只有当集群资源满足该任务最少运行个数时,才会统一调度,否则作业将一直处于Pending状态。
使用方式
方式一:创建工作负载时可以在Pod 注解中增加Gang scheduling参数。
annotations:
gang.scheduling.kubernetes.io/name: "name"
gang.scheduling.kubernetes.io/min-available: "5"
各参数含义如下,您也可以根据实际使用情况修改自定义参数:
- gang.scheduling.kubernetes.io/name:PodGroup的名称
- gang.scheduling.kubernetes.io/min-available:满足该数量才能被统一创建和调度
方式二:您还可以通过控制台页面,在新建工作负载页面指定Gang scheduling参数使用Gang scheduling能力。
1、选择指定容器集群,在菜单栏【工作负载】中按需选择指定K8S资源,点击【新建】。
2、在新建页面点击【高级配置】,在【Pod注解】>【批调度】选项中按需配置即可。