使用 kubectl 插件 (Beta)#

从 KubeRay v1.3.0 开始,您可以使用 kubectl ray 插件来简化在 Kubernetes 上部署 Ray 时的常见工作流程。如果您不熟悉 Kubernetes,此插件可以简化在 Kubernetes 上运行 Ray 的过程。

安装#

请参阅 KubeRay kubectl 插件 以安装此插件。

使用以下方法之一安装 KubeRay kubectl 插件

  • 使用 Krew kubectl 插件管理器安装(推荐)

  • 从 GitHub releases 下载

从 GitHub releases 下载#

前往 releases 页面并下载适用于您平台的二进制文件。

例如,要在 Linux amd64 上安装 kubectl 插件版本 1.3.0

curl -LO https://github.com/ray-project/kuberay/releases/download/v1.3.0/kubectl-ray_v1.3.0_linux_amd64.tar.gz
tar -xvf kubectl-ray_v1.3.0_linux_amd64.tar.gz
cp kubectl-ray ~/.local/bin

~/.local/bin 替换为您 PATH 中的目录。

Shell 补全#

遵循安装和启用 kubectl plugin-completion 的说明

用法#

安装插件后,您可以使用 kubectl ray --help 查看可用的命令和选项。

示例#

假设您已经安装了 KubeRay Operator。如果尚未安装,请按照 RayCluster 快速入门,通过 Helm 仓库安装最新的稳定版 KubeRay Operator。

示例 1: RayCluster 管理#

kubectl ray create cluster 命令允许您在没有现有 YAML 文件的情况下创建有效的 RayCluster。默认值如下:

参数

默认值

Ray 版本

2.41.0

Ray 镜像

rayproject/ray:<Ray 版本>

head CPU

2

head 内存

4Gi

worker 副本数

1

worker CPU

2

worker 内存

4Gi

worker GPU

0

$ kubectl ray create cluster raycluster-sample
Created Ray Cluster: raycluster-sample

您可以通过指定标志来覆盖默认值。例如,创建具有 2 个 worker 的 RayCluster:

$ kubectl ray create cluster raycluster-sample-2 --worker-replicas 2
Created Ray Cluster: raycluster-sample-2

默认情况下,它只创建一个 worker group。您可以使用 kubectl ray create workergroup 为现有的 RayCluster 添加额外的 worker group。

$ kubectl ray create workergroup example-group --ray-cluster raycluster-sample --worker-memory 5Gi

您可以使用 kubectl ray get clusterkubectl ray get workergroupkubectl ray get node 分别获取 RayCluster、worker group 和 Ray node 的状态。

$ kubectl ray get cluster
NAME                  NAMESPACE   DESIRED WORKERS   AVAILABLE WORKERS   CPUS   GPUS   TPUS   MEMORY   AGE
raycluster-sample     default     2                 2                   6      0      0      13Gi     3m56s
raycluster-sample-2   default     2                 2                   6      0      0      12Gi     3m51s

$ kubectl ray get workergroup
NAME            REPLICAS   CPUS   GPUS   TPUS   MEMORY   CLUSTER
default-group   1/1        2      0      0      4Gi      raycluster-sample
example-group   1/1        2      0      0      5Gi      raycluster-sample
default-group   2/2        4      0      0      8Gi      raycluster-sample-2

$ kubectl ray get nodes
NAME                                        CPUS   GPUS   TPUS   MEMORY   CLUSTER               TYPE     WORKER GROUP    AGE
raycluster-sample-default-group-4lb5w       2      0      0      4Gi      raycluster-sample     worker   default-group   3m56s
raycluster-sample-example-group-vnkkc       2      0      0      5Gi      raycluster-sample     worker   example-group   3m56s
raycluster-sample-head-vplcq                2      0      0      4Gi      raycluster-sample     head     headgroup       3m56s
raycluster-sample-2-default-group-74nd4     2      0      0      4Gi      raycluster-sample-2   worker   default-group   3m51s
raycluster-sample-2-default-group-vnkkc     2      0      0      4Gi      raycluster-sample-2   worker   default-group   3m51s
raycluster-sample-2-head-pwsrm              2      0      0      4Gi      raycluster-sample-2   head     headgroup       3m51s

您可以像这样扩缩集群的 worker group。

$ kubectl ray scale cluster raycluster-sample \
  --worker-group default-group \
  --replicas 2
Scaled worker group default-group in Ray cluster raycluster-sample in namespace default from 1 to 2 replicas

# verify the worker group scaled up
$ kubectl ray get workergroup default-group --ray-cluster raycluster-sample
NAME            REPLICAS   CPUS   GPUS   TPUS   MEMORY   CLUSTER
default-group   2/2        4      0      0      8Gi      raycluster-sample

kubectl ray session 命令可以将本地端口转发到 Ray 资源,使用户无需记住 Ray 资源暴露了哪些端口。

$ kubectl ray session raycluster-sample
Forwarding ports to service raycluster-sample-head-svc
Ray Dashboard: http://localhost:8265
Ray Interactive Client: http://localhost:10001

然后您可以在浏览器中打开 http://localhost:8265 访问 dashboard。

kubectl ray log 命令可以将 RayCluster 的日志下载到本地目录。

$ kubectl ray log raycluster-sample
No output directory specified, creating dir under current directory using resource name.
Command set to retrieve both head and worker node logs.
Downloading log for Ray Node raycluster-sample-default-group-worker-b2k7h
Downloading log for Ray Node raycluster-sample-example-group-worker-sfdp7
Downloading log for Ray Node raycluster-sample-head-k5pj8

它在当前目录中创建一个名为 raycluster-sample 的文件夹,其中包含 RayCluster 的日志。

使用 kubectl ray delete 命令清理资源。

$ kubectl ray delete raycluster-sample
$ kubectl ray delete raycluster-sample-2

示例 2: RayJob 提交#

kubectl ray job submitray job submit 命令的包装器。它可以自动将端口转发到 Ray 集群并提交作业。如果用户未提供 RayJob,此命令还可以临时配置一个集群。

假设在当前目录中,您有一个名为 sample_code.py 的文件。

import ray
ray.init(address="auto")

@ray.remote
def f(x):
    return x * x

futures = [f.remote(i) for i in range(4)]
print(ray.get(futures)) # [0, 1, 4, 9]

在没有 YAML 文件的情况下提交 Ray 作业#

您可以在不指定 YAML 文件的情况下提交 RayJob。此命令会根据以下内容生成一个 RayJob:

参数

默认值

Ray 版本

2.41.0

Ray 镜像

rayproject/ray:<Ray 版本>

head CPU

2

head 内存

4Gi

worker 副本数

1

worker CPU

2

worker 内存

4Gi

worker GPU

0

$ kubectl ray job submit --name rayjob-sample --working-dir . -- python sample_code.py
Submitted RayJob rayjob-sample.
Waiting for RayCluster
...
2025-01-06 11:53:34,806	INFO worker.py:1634 -- Connecting to existing Ray cluster at address: 10.12.0.9:6379...
2025-01-06 11:53:34,814	INFO worker.py:1810 -- Connected to Ray cluster. View the dashboard at 10.12.0.9:8265
[0, 1, 4, 9]
2025-01-06 11:53:38,368	SUCC cli.py:63 -- ------------------------------------------
2025-01-06 11:53:38,368	SUCC cli.py:64 -- Job 'raysubmit_9NfCvwcmcyMNFCvX' succeeded
2025-01-06 11:53:38,368	SUCC cli.py:65 -- ------------------------------------------

您也可以指定一个特定的 RayJob YAML 来提交 Ray 作业。

$ wget https://raw.githubusercontent.com/ray-project/kuberay/refs/heads/master/ray-operator/config/samples/ray-job.interactive-mode.yaml

请注意,在 RayJob spec 中,submissionModeInteractiveMode

$ kubectl ray job submit -f ray-job.interactive-mode.yaml --working-dir . -- python sample_code.py
Submitted RayJob rayjob-interactive-mode.
Waiting for RayCluster
...
2025-01-06 12:44:43,542	INFO worker.py:1634 -- Connecting to existing Ray cluster at address: 10.12.0.10:6379...
2025-01-06 12:44:43,551	INFO worker.py:1810 -- Connected to Ray cluster. View the dashboard at 10.12.0.10:8265
[0, 1, 4, 9]
2025-01-06 12:44:47,830	SUCC cli.py:63 -- ------------------------------------------
2025-01-06 12:44:47,830	SUCC cli.py:64 -- Job 'raysubmit_fuBdjGnecFggejhR' succeeded
2025-01-06 12:44:47,830	SUCC cli.py:65 -- ------------------------------------------

使用 kubectl ray delete 命令清理资源。

$ kubectl ray delete rayjob/rayjob-sample
$ kubectl ray delete rayjob/rayjob-interactive-mode