Volcano v1.10.0 版本正式发布!10 大功能全面提升统一调度和细粒度资源管理能力
北京时间 2024 年 9 月 19 日,Volcano 社区 v1.10.0 版本[1]正式发布(Branch:release-1.10[2]),此次版本增加了以下新特性:
新增队列优先级设置策略
支持细粒度的 GPU 资源共享与回收
支持 Pod Scheduling Readiness 调度
支持 Sidecar container 调度
增强 vcctl 命令行工具功能
Volcano 支持 Kubernetes v1.30
增强 Volcano 安全性
优化 Volcano 性能
提升 GPU 监控功能
优化 helm chart 包安装升级流程
新增队列优先级设置策略
在传统的大数据处理场景下,用户可以直接设置队列优先级来控制作业的调度顺序,为了更好的帮助用户从 Hadoop/Yarn 迁移到云原生平台,Volcano 也支持了在队列层面直接设置优先级,降低大数据用户的迁移成本,提升用户体验和资源利用效率。
队列是 Volcano 中的一种基本资源,不同队列有着优先级区分,在默认情况下,队列的优先级是由队列的share
值决定的,share 值是由队列中已分配的资源量除以队列的总容量计算得到的,不需要用户手动配置,share
值越小,则代表队列中已分配的资源比例越小,即队列越不饱和,需要优先分配资源,因此队列的share
越小,队列的优先级越高,在分配资源时会优先分配给share
较小的队列,以保证资源分配的公平性。
但是在生产环境尤其是大数据处理场景下,用户更希望可以直接设置队列的优先级,从而能更直观的知道不同队列的优先级顺序,由于share
值是实时计算得到的,因此会根据队列分配资源的饱和程度而实时变化,为了更加直观的表示队列优先级同时支持用户自行配置,Volcano 在share
值的基础上为队列新增了priority
字段,支持用户配置队列优先级,priority
越高则表示队列优先级越高,会优先分配资源给高优先级的队列,并且在回收队列资源时会优先回收低优先级队列内的作业。
队列优先级定义:
同时为了兼容 share 值的使用方式,Volcano 在计算队列优先级时也会考虑 share 值,默认情况下用户不设置队列优先级或者队列的优先级相等时,Volcano 会再比较队列的 share 值,此时 share 越小队列优先级越高。用户可以根据实际场景选择设置不同的优先级策略,即 priority 和 share 两种方式。
关于队列优先级设计文档,请参考:Queue Priority[3].
支持细粒度的 GPU 资源共享与回收
Volcano 在 v1.9 版本发布了弹性队列容量 capacity 调度功能,用户可以直接为队列设置每一维度资源的容量,同时支持基于deserved
的队列弹性容量调度,实现了更加细粒度的队列资源共享和回收机制。
弹性队列容量capacity
调度的设计文档请参考:Capacity scheduling Design[4]
使用指导请参考:Capacity Plugin User Guide[5].
为队列配置每一维度 deserved 使用样例:
在 v1.10 版本中,Volcano 在弹性队列容量capacity
的基础上,支持了上报不同型号的 GPU 资源,NVIDIA 默认的Device Plugin
在上报 GPU 资源时无法区分 GPU 型号,统一上报为nvidia.com/gpu
,AI 训推任务无法根据业务特点选择不同型号的 GPU,比如 A100、T4 等型号的 GPU,为了解决这一问题,以满足不同类型的 AI 任务需求,Volcano 在Device Plugin
层面支持上报不同型号的 GPU 资源到节点,配合capacity
插件实现更加细粒度的 GPU 资源共享和回收。
关于Device Plugin
上报不同型号 GPU 的实现和使用指导,请参考:GPU Resource Naming[6].
注意:
capacity
在 v1.10.0 版本中作为了默认的队列管理插件,capacity
与proportion
插件互相冲突,当升级到 v1.10.0 后,你需要再设置队列的deserved
字段,以保证队列功能正常工作,具体的使用说明请参考:Capacity Plugin User Guide[7].
capacity
插件根据用户指定的队列deserved
值来划分集群资源,而proportion
插件则根据队列权重动态划分集群资源,用户可以根据实际场景选择使用capacity
或者proportion
插件进行队列管理。proportion 插件的介绍请参考:proportion plugin[8].
支持 Pod Scheduling Readiness 调度
Pod 一旦创建就被认为已准备好进行调度,在 Kube-scheduler 中,它会尽力寻找合适的节点来放置所有 Pending 的 Pod。然而,在现实情况下,某些 Pod 可能会长时间处于“缺少必要资源”状态,这些 Pod 实际上以不必要的方式干扰调度程序(以及 Cluster AutoScaler 等下游组件)的决策和运行,造成资源浪费等问题。Pod Scheduling Readiness 是 Kube-sheduler 的一项新增功能,在 Kubernetes v.1.30 版本 GA,成为了一个稳定特性,它通过设置 Pod 的 schedulingGates 字段来控制 Pod 的调度时机。
pod-scheduling-gates-diagram
在前面的版本中,Volcano 已集成了 K8s 默认调度器的所有算法,全面涵盖了 Kube-scheduler 的原生调度功能。因此,Volcano 能够无缝替代 Kube-scheduler,作为云原生平台下的统一调度器,支持微服务和 AI/大数据工作负载的统一调度。在最新发布的 v1.10 版本中,Volcano 更是引入了 Pod Scheduling Readiness 调度能力,进一步满足了用户在多样化场景下的调度需求。
关于 Pod Scheduling Readiness 特性的文档,请参考:Pod Scheduling Readiness | Kubernetes[9]
Volcano 支持 Pod Scheduling Readiness 调度的设计文档,请参考:Proposal for Support of Pod
Scheduling Readiness by ykcai-daniel · Pull Request #3581 · volcano-sh/volcano (github.com)[10]
支持 Sidecar container 调度
Sidecar container 是一种相对于业务容器而言的辅助容器,通常用来辅助业务容器的运行,比如收集业务容器日志、监控、初始化网络等。
在 Kubernetes v1.28 之前,Sidecar container 只是一种概念,并没有单独的 API 来标识一个容器是否是 Sidecar container,Sidecar 容器和业务容器处于同等地位,有着相同的生命周期,Kubelet 会并发启动所有 Sidecar 容器和业务容器,这样带来的问题是 Sidecar 容器可能会在业务容器启动之后才启动,并且在业务容器结束之前先结束,而我们期望的是 Sidecar 容器先于业务容器启动,并在业务容器结束之后再结束,这样就能保证 Sidecar 容器收集的日志,监控等信息是完整的。
Kubernetes v1.28 在 API 层面支持了 Sidecar container,并对 init container、Sidecar container、业务 container 做了统一的生命周期管理,同时调整了 Pod 的 request/limit 资源计算方式,该特性在 v1.29 成为 Beta 特性。
该特性在设计阶段经历了漫长的讨论时间,特性本身并不复杂,主要的考虑点在于兼容旧的使用方式,如果定义一个除了 init container、业务容器之外的新的容器类型,会对 API 有较大的破坏性,同时周边组件适配该特性的话会有较多的侵入式修改,带来很多额外开销,因此 Kubernetes 社区并没有引入新的容器类型来支持 Sidecar container,而是直接复用了 init container,通过设置 init container 的 restartPolicy 为 Always 来标识 Sidecar container,完美的解决了 API 兼容性问题和 Sidecar 容器的生命周期问题。
在调度层面,该特性的影响在于 Pod 申请的 request 资源计算方式有所变化,因为 Sidecar container 作为一种特殊的 init container 是持久运行的,需要将 Sidecar container 的 request 值累加到业务容器的 request 值上,因此需要重新计算 init container、Sidecar container 和业务容器的资源 request 值。
Volcano 调度器在新版本更改了 Sidecar container 的资源计算方式,支持了 Sidecar container 的调度,用户可以使用 Volcano 调度 Sidecar container。
关于 Sidecar container 的详细信息,请参考:Sidecar Containers | Kubernetes[11]
增强 vcctl 命令行工具功能
vcctl 是操作 Volcano 内置 CRD 资源的一个命令行工具,可以方便的用来查看/删除/暂停/恢复 vcjob 资源,并支持查看/删除/开启/关闭/更新 queue 资源。Volcano 在新版本对 vcctl 做了功能增强,新增以下功能:
支持创建/删除/查看/描述
jobflow
和jobtemplate
资源支持查询指定队列里的 vcjob
支持通过 queue 和 vcjob 过滤查询 Pod
vcctl 的详细指导文档,请参考:vcctl
Command Line Enhancement[12].
Volcano 支持 Kubernetes v1.30
Volcano 版本紧跟 Kubernetes 社区版本节奏,对 Kubernetes 的每个大版本都进行支持,目前最新支持的版本为 v1.30,并运行了完整的 UT、E2E 用例,保证功能和可靠性。
如果您想参与 Volcano 适配 Kubernetes 新版本的开发工作,请参考:adapt-k8s-todo[13] 进行社区贡献。
增强 Volcano 安全性
Volcano 一直都很重视开源软件供应链的安全,在 license 合规、安全漏洞披露和修复、仓库分支保护、CI 检查等方面遵循 OpenSSF 定义的规范,Volcano 近期在 Github Action 加入了新的 workflow,它会在代码合入时运行 OpenSSF 安全性检查,并实时更新软件安全评分,持续提升软件安全性。
同时 Volcano 对各个组件的 RBAC 权限进行了收缩,只保留必要的权限,避免了潜在的越权风险,提升了系统的安全性。
相关 PR 参见:
Added the scorecard github action and its badge by harshitasao · Pull Request #3655 · volcano-sh/volcano[14]
Shrink permissions of vc scheduler & controller by Monokaix · Pull Request #3545 · volcano-sh/volcano (github.com)[15]
Add pre-install&pre-upgrade hook for admission-init job by Monokaix · Pull Request #3504 · volcano-sh/volcano (github.com)[16]
优化 Volcano 性能
在大规模场景下,Volcano 做了很多性能优化的工作,主要包括:
优化 vcjob 更新策略,降低 vcjob 的更新和同步频次,降低 API Server 压力,提升提交任务的 QPS
vc controller 新增 controller gate 开关,用户可以选择关闭不需要的 controller,减低内存占用和 CPU 负载
所有的 controller 使用共享的 informer,减少内存占用
提升 GPU 监控功能
新版本的 Volcano 针对 GPU 监控指标做了优化和增强,修复了 GPU 监控不精确的问题,并在 GPU 的算力和显存监控指标上新增了节点信息,方便用户更加直观的查看每个节点上每一张 GPU 的算力、显存的总量和已分配量。
详细 PR 参见:Update volcano-vgpu monitoring system by archlitchi · Pull Request #3620 · volcano-sh/volcano (github.com)[17]
优化 helm chart 包安装升级流程
Volcano 针对 helm chart 的安装、升级流程进行了优化,并支持安装 helm chart 包设置更多自定义参数,主要包括:
利用 helm 的 hook 机制,在安装成功 Volcano 之后,自动删除 volcano-admission-init 这一 job,避免后续使用 helm upgrade 升级失败的问题,相关 PR 参见:Add pre-install&pre-upgrade hook for admission-init job by Monokaix · Pull Request #3504 · volcano-sh/volcano (github.com)[18]
每次安装成功后更新 Volcano admission 需要的 secret 文件,避免在不指定 helm 包名情况下,重复安装卸载 volcano 导致 volcano admission 处理失败的问题,详细 PR 参见:Update volcano-admission secret when it already exists by Monokaix · Pull Request #3653 · volcano-sh/volcano (github.com)[19]
支持为 helm 包中的资源对象设置通用 label,相关 PR 参见:Add common labels for chart objects by Aakcht · Pull Request #3511 · volcano-sh/volcano (github.com)[20]
支持通过 helm 为 Volcano 组件设置日志等级,相关 PR 参见:Expose volcano components (controller, scheduler, etc.) log level control to the helm chat values by chenshiwei-io · Pull Request #3656 · volcano-sh/volcano (github.com)[21]
支持通过 helm 设置 Volcano 组件的镜像代理仓库,相关 PR 参见:add image registry for helm by calvin0327 · Pull Request #3436 · volcano-sh/volcano (github.com)[22]
支持通过 helm 设置容器级别的 securityContext,相关 PR 参加:feat: Add securityContext support at container level in helm chart templates by lekaf974 · Pull Request #3704 · volcano-sh/volcano (github.com)[23]
致谢贡献者
Volcano 1.10.0 版本包含了来自 36 位社区贡献者的上百次代码提交,在此对各位贡献者表示由衷的感谢:
贡献者 GitHub ID
参考资料
[1]v1.10.0 版本: https://github.com/volcano-sh/volcano/releases/tag/v1.10.0
[2]Branch:release-1.10: https://github.com/volcano-sh/volcano/tree/release-1.10
[3]Queue Priority: https://github.com/volcano-sh/volcano/blob/master/docs/design/queue-priority.md
[4]Capacity scheduling Design: https://github.com/volcano-sh/volcano/blob/master/docs/design/capacity-scheduling.md
[5]Capacity Plugin User Guide: https://github.com/volcano-sh/volcano/blob/master/docs/user-guide/how_to_use_capacity_plugin.md
[6]GPU Resource Naming: https://github.com/volcano-sh/devices/tree/release-1.1/docs/resource-naming
[7]Capacity Plugin User Guide: https://github.com/volcano-sh/volcano/blob/master/docs/user-guide/how_to_use_capacity_plugin.md
[8]proportion plugin: https://volcano.sh/en/docs/plugins/#proportion
[9]Pod Scheduling Readiness | Kubernetes: https://kubernetes.io/docs/concepts/scheduling-eviction/pod-scheduling-readiness/
[10]Proposal for Support of Pod Scheduling Readiness by ykcai-daniel · Pull Request #3581 · volcano-sh/volcano (github.com): https://github.com/volcano-sh/volcano/pull/3581
[11]Sidecar Containers |Kubernetes: https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/
[12]vcctl
Command Line Enhancement: https://github.com/volcano-sh/volcano/blob/master/docs/design/command-line-enhancement.md#new-format-of-volcano-command-line
[13]adapt-k8s-todo: https://github.com/volcano-sh/volcano/blob/master/docs/design/adapt-k8s-todo.md
[14]Added the scorecard github action and its badge by harshitasao · Pull Request #3655 · volcano-sh/volcano: https://github.com/volcano-sh/volcano/pull/3655
[15]Shrink permissions of vc scheduler & controller by Monokaix · Pull Request #3545 · volcano-sh/volcano (github.com): https://github.com/volcano-sh/volcano/pull/3545
[16]Add pre-install&pre-upgrade hook for admission-init job by Monokaix · Pull Request #3504 · volcano-sh/volcano (github.com): https://github.com/volcano-sh/volcano/pull/3504
[17]Update volcano-vgpu monitoring system by archlitchi · Pull Request #3620 · volcano-sh/volcano (github.com): https://github.com/volcano-sh/volcano/pull/3620/
[18]Add pre-install&pre-upgrade hook for admission-init job by Monokaix · Pull Request #3504 · volcano-sh/volcano (github.com): https://github.com/volcano-sh/volcano/pull/3504
[19]Update volcano-admission secret when it already exists by Monokaix · Pull Request #3653 · volcano-sh/volcano (github.com): https://github.com/volcano-sh/volcano/pull/3653
[20]Add common labels for chart objects by Aakcht · Pull Request #3511 · volcano-sh/volcano (github.com): https://github.com/volcano-sh/volcano/pull/3511
[21]Expose volcano components (controller, scheduler, etc.) log level control to the helm chat values by chenshiwei-io · Pull Request #3656 · volcano-sh/volcano (github.com): https://github.com/volcano-sh/volcano/pull/3656
[22]add image registry for helm by calvin0327 · Pull Request #3436 · volcano-sh/volcano (github.com): https://github.com/volcano-sh/volcano/pull/3436
[23]feat: Add securityContext support at container level in helm chart templates by lekaf974 · Pull Request #3704 · volcano-sh/volcano (github.com): https://github.com/volcano-sh/volcano/pull/3704
评论