(高级) 在 Kubernetes 环境下理解 Ray Autoscaler#

我们描述了 Ray 自动缩放器与 Kubernetes 生态系统中其他自动缩放器之间的关系。

Ray Autoscaler 对比 Horizontal Pod Autoscaler#

Ray 自动缩放器调整 Ray 集群中的 Ray 节点数量。在 Kubernetes 上,每个 Ray 节点作为 Kubernetes Pod 运行。因此,在 Kubernetes 的上下文中,Ray 自动缩放器缩放 Ray Pod 数量。从这个意义上说,Ray 自动缩放器的作用类似于 Kubernetes Horizontal Pod Autoscaler (HPA)。然而,以下特性将 Ray 自动缩放器与 HPA 区分开来。

负载指标基于应用程序语义#

水平Pod自动伸缩器根据CPU和内存等物理使用指标来决定伸缩。相比之下,Ray自动伸缩器使用任务和角色注释中表达的逻辑资源。例如,如果RayCluster CR中的每个Ray容器规范指示10个CPU的限制,并且你提交了二十个带有@ray.remote(num_cpus=5)注释的任务,则会创建10个Ray Pod以满足100个CPU的资源需求。在这方面,Ray自动伸缩器类似于Kubernetes集群自动伸缩器,它根据容器资源请求中表达的逻辑资源做出伸缩决策。

细粒度的缩减控制#

为了适应 Ray 应用程序的有状态性,Ray 自动缩放器在缩减规模方面比 Horizontal Pod Autoscaler 有更精细的控制。除了确定所需的规模外,Ray 自动缩放器还能够精确选择要缩减的 Pod。然后,KubeRay 操作员删除该 Pod。相比之下,Horizontal Pod Autoscaler 只能减少副本数量,对删除哪些 Pod 的控制有限。对于 Ray 应用程序来说,随机缩减 Pod 可能是危险的。

架构:每个 Ray 集群一个 Ray Autoscaler#

水平Pod自动伸缩由Kubernetes控制平面中的一个管理器集中控制;该管理器控制多个Kubernetes对象的规模。相比之下,每个Ray集群由其自己的Ray自动伸缩器进程管理,该进程作为Ray头Pod中的边车容器运行。这一设计选择是基于以下考虑:

  • 可扩展性。 自动扩展每个 Ray 集群需要处理该 Ray 集群的大量资源数据。

  • 简化的版本控制和兼容性。 自动缩放器和 Ray 都是作为 Ray 仓库的一部分开发的。自动缩放器与 Ray 核心之间的接口很复杂。为了支持运行在不同 Ray 版本上的多个 Ray 集群,最好匹配 Ray 和自动缩放器的代码版本。为每个 Ray 集群运行一个自动缩放器并匹配代码版本可以确保兼容性。

使用 Kubernetes 集群自动扩展器的 Ray 自动扩展器#

Ray Autoscaler 和 Kubernetes Cluster Autoscaler 相辅相成。在 Ray Autoscaler 决定创建一个 Ray Pod 后,Kubernetes Cluster Autoscaler 可以提供一个 Kubernetes 节点,以便该 Pod 可以被放置。同样地,在 Ray Autoscaler 决定删除一个空闲的 Pod 后,Kubernetes Cluster Autoscaler 可以清理剩余的空闲 Kubernetes 节点。建议配置您的 RayCluster,使得每个 Kubernetes 节点只适合一个 Ray Pod。如果您遵循这种模式,Ray Autoscaler Pod 的缩放事件大致与集群 Autoscaler 节点的缩放事件一一对应。(我们说“大致”是因为在底层 Kubernetes 节点缩减之前,一个 Ray Pod 有可能被删除并替换为新的 Ray Pod。)

垂直 Pod 自动伸缩器#

Ray Autoscaler 与 Kubernetes Vertical Pod Autoscaler (VPA) 之间没有关系,VPA 旨在根据当前和过去的使用情况调整单个 Pod 的大小。如果你发现单个 Ray Pod 的负载过高,有多种手动技术可以降低负载。一种方法是减少每个节点上安排的任务/角色的数量,通过增加 ray.remote 注释中指定的资源需求。例如,将 @ray.remote(num_cpus=2) 更改为 @ray.remote(num_cpus=4) 将使给定 Ray Pod 中可以容纳的该任务或角色的数量减半。