源码阅读导引:Ray、Kubernetes、KubeRay 与 Volcano

源码阅读导引:Ray、Kubernetes、KubeRay 与 Volcano

💡 原文中文,约12000字,阅读约需29分钟。
📝

内容提要

本系列文章阅读KubeRay与Volcano源码。Ray以task和actor表达分布式计算,Kubernetes以Pod管理容器部署;KubeRay通过CRD和Operator管理RayCluster、RayJob等资源,Volcano提供Gang成组调度与队列资源共享。系列共十篇:前五篇追踪RayJob从提交到Pod运行的协调与恢复,后四篇引入Volcano分析批调度。

🔎

延伸解读

阅读顺序与部署顺序是两回事

文章明确区分了源码阅读顺序与实际部署顺序。系列先读 KubeRay 再引入 Volcano,但部署时并非必须安装全部组件:Ray 可以单机运行,Kubernetes 上也可以先用默认调度器,只有存在最低成员要求或队列共享等调度需求时才考虑接入 Volcano。读者不必因为阅读顺序而误以为部署时必须按同样步骤堆叠组件。

两层调度各管各的对象

Kubernetes 为 Pod 选择节点并管理容器运行,Ray 则在已运行的环境中安排 task 和 actor。文章强调,Kubernetes 不会因为 Python 调用了一次远程函数就创建 Pod,Ray 节点与 Kubernetes Node 也不要求一一对应。理解这一分工,是后续追踪 RayJob 从提交到 Pod 运行、以及判断资源竞争为何引出批调度的前提。

声明式管理不等于计算状态可恢复

文章以 Deployment 为例说明控制器通过协调让实际状态接近期望,Pod 被删除后可能被补建。但它同时提醒,即使替代 Pod 已启动,也不能推断原程序的内存和计算进度已经恢复。这一限制对理解 KubeRay 的故障恢复很关键:资源层面的重建与计算层面的恢复是两件事,后续源码分析会分别考察。

接入 Volcano 有明确前提

文章指出,默认调度路径不会自动从业务代码推导出组内依赖,需要另外表达一组至少满足什么条件启动才有意义。Volcano 提供 Gang 成组调度、队列和资源共享策略,但接入与否要看业务是否有最低成员要求、队列间共享或优先级等需求。安装 Volcano 不会让计算结果自动持久化,也不代替 KubeRay 管理作业提交和收尾。

Q&A

Ray 中的 task 和 actor 分别是什么?

task 表示一次可以在其他执行进程中异步运行的函数调用,例如把“处理一个文件”写成 Ray 远程函数,就可以发起多个 task 并收集结果。actor 则把一个带状态的对象放到执行进程中,通过方法调用使用它,例如某个对象先加载一份模型,后续多次调用可以继续使用这份已加载的模型。

Kubernetes 中的 Pod 是什么?它和容器有什么关系?

Pod 是 Kubernetes 中安排到 Node 上的基本运行单位,包含一个或多个容器。这些容器一起部署到同一个 Node,并共享网络等资源。最简单的情况就是一个 Pod 里运行一个应用容器。

KubeRay 提供了哪些资源类型来管理 Ray 集群和作业?

KubeRay 提供三种主要资源类型:RayCluster 用于准备一套 Ray 运行环境,描述 head 和 worker 配置;RayJob 用于执行一次作业,准备或选择集群,提交入口程序并处理收尾;RayService 用于持续运行 Ray Serve 应用,管理集群、应用健康和访问入口。

Kubernetes 如何将一份 Deployment 声明变成运行中的容器?

使用者通过 kubectl 提交 Deployment 声明,请求先到 API Server,资源数据由 etcd 保存。Deployment Controller 读取副本和模板要求,管理 ReplicaSet,ReplicaSet 根据缺口创建 Pod 对象。Scheduler 为尚未分配节点的 Pod 选择 Node 并绑定。节点上的 kubelet 观察分配给本机的 Pod,调用容器运行时启动容器,并向 API Server 回报状态。

为什么多个作业争用资源时需要考虑 Volcano?

当同时提交几套作业而机器资源只能满足一部分时,需要决定谁先运行以及怎样在作业之间分配资源。例如,两个作业都至少需要三个成员才能有效计算,但机器只能容纳四个等大的成员,如果各自启动两个,双方都可能占着资源等剩下的成员。默认的 Pod 调度路径不会自动从业务代码推导出这种组内依赖,需要另外表达“这一组至少满足什么条件,启动才有意义”。Volcano 提供成组调度(Gang)、队列和资源共享策略来解决这类问题。

KubeRay 和 Volcano 在职责上有什么区别?

KubeRay 根据 RayCluster、RayJob 等声明维护 Ray 资源和生命周期,负责 Ray 集群和作业生命周期。Volcano 根据组需求和队列策略,为相应 Pod 分配资源与选择节点,提供成组调度、队列和资源共享策略。接入时,KubeRay 继续负责 Ray 集群和作业生命周期,把组的调度要求交给 Volcano;Volcano 为相关 Pod 选择节点,kubelet 仍在节点上启动容器,Ray 继续在运行环境中安排 task 和 actor。

🏷️

标签

➡️

继续阅读