Volcano 社区新版本发布!7 大功能全面增强队列能力与调度稳定性
本文分享自华为云社区《Volcano 社区 v1.9.0 版本正式发布!全面增强队列能力与调度稳定性》,作者:云容器大未来。
北京时间 2024 年 5 月 21 日,Volcano 社区v1.9.0版本正式发布,此次版本增加了以下新特性:
支持弹性队列容量 capacity 调度
支持队列与节点间的亲和调度
Volcano 支持 Kubernetes v1.29
GPU 共享支持节点打分调度
增强 scheduler metrics 指标
新增 License 合规性检查
提升调度稳定性
Volcano 是业界首个云原生批量计算项目,于 2019 年 6 月在上海 KubeCon 正式开源,并在 2020 年 4 月成为 CNCF 官方项目。2022 年 4 月,Volcano 正式晋级为 CNCF 孵化项目。Volcano 社区开源以来,受到众多开发者、合作伙伴和用户的认可和支持。截至目前,累计有 600+全球开发者参与社区贡献。
支持弹性队列容量 capacity 调度
Volcano 现在使用 proportion 插件来进行队列管理,用户可以设置队列的 guarantee、capability 等字段来设置队列的预留资源和容量上限。并通过设置队列的 weight 值来实现集群内的资源共享,队列按照 weight 值按比例划分集群资源,但这种队列管理方式存在以下问题:
队列划分的资源容量通过权重体现,不够直观。
队列内的所有资源使用相同的比例进行划分,不能为队列的每一维资源单独设置容量。
基于以上考虑,Volcano 实现了新的队列弹性容量管理能力,它支持:
用户可以直接为队列设置每一维度资源的容量,而不是设置 weigh 值来实现。
基于 deserved 的队列弹性容量调度,支持队列的资源共享和回收。
比如在 AI 大模型训练中分别为队列中不同的 GPU 型号如 A100 和 V100,设置不同的资源容量。同时在集群资源空闲时,队列可以复用其他空闲队列的资源,并在需要时进行资源回收,直到回收到用户为队列设置的资源容量为止,即应得资源量 deserved,从而实现弹性容量能力。
使用改功能时需要设置队列的 deserved 字段,为每一维资源设置应得资源量。同时需要在调度配置中打开 capacity 插件,并关闭 proportion 插件。
队列弹性容量调度的完整使用例子,请参考:How to use capacity plugin[1]
关于弹性队列容量设计文档,请参考Capacity scheduling Design[2]
支持队列与节点间的亲和调度
队列通常关联着公司内的部门,而不同部门通常需要使用不同的异构资源类型,比如大模型训练团队需要使用 NIVDIA 的 Tesla GPU,而推荐团队需要使用 AMD 的 GPU,当用户提交作业到队列时,需要根据队列的属性将作业自动调度到对应资源类型的节点上。
为此 Volcano 实现了队列和节点的亲和调度能力,用户只需在队列的 affinity 字段设置需要亲和的节点标签,Volcano 会自动将提交到当前队列的作业调度到队列关联的节点上,用户无需单独设置作业的亲和性,而只需统一设置队列的亲和性,提交到队列的作业都会根据队列与节点的亲和性将作业调度到对应的节点。
该特性同时支持硬亲和、软亲和、反亲和调度,使用时需要为节点设置 key 为volcano.sh/nodegroup-name
的标签,然后设置队列的 affinity 字段,指定硬亲和、软亲和和反亲和的标签值。例如如下的队列设置,表示提交到该队列的作业需要调度到标签值为 groupname1 和 groupname2 的节点,并优先调度到标签值为 groupname2 的节点,同时,作业不能调到到标签值为 groupname3 和 groupname4 的节点,当资源不足时则也可以调度到标签值为 groupname3 的节点上。
该功能对应的调度插件名为 nodegroup,完整使用例子请参考:How to use nodegroup plugin[3]
详细设计文档请参考:The nodegroup design[4]
GPU 共享功能支持节点打分调度
GPU 共享是 Volcano v1.8 版本推出的 GPU 共享与隔离方案,提供 GPU 共享、设备显存控制能力,以提升 AI 训练推理场景下 GPU 资源利用率低的问题。v1.9 在该功能基础上新增了对 GPU 节点打分的策略,从而可以在作业分配时选择最优的节点,进一步提升资源利用率,用户可以设置不同的打分策略。目前支持以下两种策略:
Binpack:提供 GPU 卡粒度的 binpack 算法,优先把一个节点上的已经分配了资源的 GPU 卡占满,避免资源碎片和浪费。
Spread:优先使用空闲的 GPU 卡而不是已经分配了资源的共享卡。
详细使用文档请参考:How to use gpu sharing[5]
Volcano 支持 Kubernetes v1.29
Volcano 版本紧跟 Kubernetes 社区版本节奏,对 Kubernetes 的每个大的基数版本都进行支持,目前最新支持的版本为 v1.29,并运行了完整的 UT、E2E 用例,保证功能和可靠性。如果您想参与 Volcano 适配 Kubernetes 新版本的开发工作,请参考:https://github.com/volcano-sh/volcano/pull/3459 进行社区贡献。
增强 scheduler metrics 指标
Volcano 使用了 client-go 客户端和 Kubernetes 交互,尽管客户端可以设置 QPS 来避免请求被限流,但是客户端实际使用的 QPS 到底达到了多少却很难观察到,为了实时观测到客户端请求的频率,Volcano 新增了 client-go 客户端的 metrics 指标,用户可以通过访问 metrics 接口,查看 GET、POST 等请求在每秒钟的请求数量,从而确定每秒钟实际使用的 QPS,以此决定是否需要调整客户端设置的 QPS。同时 client-go 的相关指标还包括客户端证书轮转周期统计、每个请求的 response size 统计等。
用户可以使用 curl http://$volcano_scheduler_pod_ip:8080/metrics 来获取 volcano scheduler 的所有详细指标。
详细 PR 见:[feat] Add rest client metrics by Monokaix · Pull Request #3274 · volcano-sh/volcano (github.com)[6]
新增 License 合规性检查
为了增强 Volcano 社区开源 license 合规治理规范,避免引入传染性开源协议,规避潜在风险,Volcano 社区引入了开源 license 合规检查工具,所谓传染性协议指的是使用了该协议作为开源许可的软件在修改、使用、复制之后生成的衍生作品,也必须以该协议进行开源。开发者提交的 PR 会引入的三库如果包含了传染性开源协议比如 GPL,LGPL 等,CI 门禁会进行拦截,开发者需要将三方库替换为松自由软件许可协议比如 MIT、Apache 2.0,BSD 等,以通过开源 license 合规检查。
提升调度稳定性
Volcano v1.9.0 版本在抢占、调度失败重试、避免内存泄露、安全性增强等方面做了较多优化,具体内容包括:
修复极端情况下 deployment 频繁扩缩容导致的 pod 无法调度的问题,详见 PR:[cherry-pick for release-1.9]fix PodGroup being incorrectly deleted due to frequent creation and deletion of pods by guoqinwill · Pull Request #3376 · volcano-sh/volcano (github.com)[7]
修复 Pod 抢占问题:详见 PR:ignore PredicateFn err info for preempt & reclaim scheduler plugin by LivingCcj · Pull Request #3458 · volcano-sh/volcano (github.com)[8]
优化 Pod 调度失败重试机制:详见 PR:fix errTask channel memory leak by bibibox · Pull Request #3435 · volcano-sh/volcano (github.com)[9]
metrics 指标优化:详见 PR:Fix queue metrics when there are no jobs in it by Monokaix · Pull Request #3463 · volcano-sh/volcano (github.com)[10]
安全性增强:详见 PR:Remove list secret in controller ClusterRole by lekaf974 · Pull Request #3449 · volcano-sh/volcano (github.com)[11]
致谢贡献者
Volcano 1.9.0 版本包含了来自多位社区贡献者的代码提交,在此对各位贡献者表示由衷的感谢:
贡献者 GitHub ID
参考资料:
[1] How to use capacity plugin:https://github.com/volcano-sh/volcano/blob/master/docs/user-guide/how_to_use_capacity_plugin.md
[2] Capacity scheduling Design:https://github.com/volcano-sh/volcano/blob/master/docs/design/capacity-scheduling.md
[3] How to use nodegroup plugin:https://github.com/volcano-sh/volcano/blob/master/docs/user-guide/how_to_use_nodegroup_plugin.md
[4] The nodegroup design:https://github.com/volcano-sh/volcano/blob/master/docs/design/node-group.md
[5] How to use gpu sharing:https://github.com/volcano-sh/volcano/blob/master/docs/user-guide/how_to_use_gpu_sharing.md
[6] [feat] Add rest client metrics by Monokaix · Pull Request #3274 · volcano-sh/volcano (github.com):https://github.com/volcano-sh/volcano/pull/3274
[7] [cherry-pick for release-1.9]fix PodGroup being incorrectly deleted due to frequent creation and deletion of pods by guoqinwill · Pull Request #3376 · volcano-sh/volcano (github.com):https://github.com/volcano-sh/volcano/pull/3376
[8] ignore PredicateFn err info for preempt & reclaim scheduler plugin by LivingCcj · Pull Request #3458 · volcano-sh/volcano (github.com):https://github.com/volcano-sh/volcano/pull/3458
[9] fix errTask channel memory leak by bibibox · Pull Request #3435 · volcano-sh/volcano (github.com):https://github.com/volcano-sh/volcano/pull/3435
[10] Fix queue metrics when there are no jobs in it by Monokaix · Pull Request #3463 · volcano-sh/volcano (github.com):https://github.com/volcano-sh/volcano/pull/3463
[11] Remove list secret in controller ClusterRole by lekaf974 · Pull Request #3449 · volcano-sh/volcano (github.com):https://github.com/volcano-sh/volcano/pull/3449
版权声明: 本文为 InfoQ 作者【华为云开发者联盟】的原创文章。
原文链接:【http://xie.infoq.cn/article/c29c386c27f3e3d78eceae193】。文章转载请联系作者。
评论