写点什么

Volcano v1.10.0 版本正式发布!10 大功能全面提升统一调度和细粒度资源管理能力

  • 2024-09-27
    中国香港
  • 本文字数:6553 字

    阅读完需:约 21 分钟

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越高则表示队列优先级越高,会优先分配资源给高优先级的队列,并且在回收队列资源时会优先回收低优先级队列内的作业。


队列优先级定义:

type QueueSpec struct {...  // Priority define the priority of queue. Higher values are prioritized for scheduling and considered     later during reclamation.  // +optional  Priority int32 `json:"priority,omitempty" protobuf:"bytes,10,opt,name=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 使用样例:

apiVersion: scheduling.volcano.sh/v1beta1kind: Queuemetadata:  name: demo-queuespec:  reclaimable: true  deserved: # set the deserved field.    cpu: 64    memeory: 128Gi    nvidia.com/a100: 40    nvidia.com/v100: 80
复制代码

在 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 版本中作为了默认的队列管理插件,capacityproportion插件互相冲突,当升级到 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 做了功能增强,新增以下功能:


  • 支持创建/删除/查看/描述jobflowjobtemplate资源

  • 支持查询指定队列里的 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

用户头像

还未添加个人签名 2020-02-11 加入

还未添加个人简介

评论

发布
暂无评论
Volcano v1.10.0 版本正式发布!10大功能全面提升统一调度和细粒度资源管理能力_云计算_华为云原生团队_InfoQ写作社区