RayCluster 快速开始
Contents
RayCluster 快速开始#
本指南向您展示如何管理 Kubernetes 上的 Ray 集群并与之交互。
准备#
Step 1: 创建Kubernetes集群#
此步骤使用 Kind 创建一个本地 kubernetes 集群。如果您已经有 Kubernetes 集群,可以跳过此步骤。
kind create cluster --image=kindest/node:v1.23.0
Step 2: 部署 KubeRay Operator#
通过 Helm chart 仓库 部署 KubeRay Operator 。
helm repo add kuberay https://ray-project.github.io/kuberay-helm/
helm repo update
# Install both CRDs and KubeRay operator v1.0.0-rc.0.
helm install kuberay-operator kuberay/kuberay-operator --version 1.0.0-rc.0
# Confirm that the operator is running in the namespace `default`.
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# kuberay-operator-7fbdbf8c89-pt8bk 1/1 Running 0 27s
KubeRay 为 Operator 安装提供了多种选项, 例如 Helm、Kustomize、以及一个独立命名空间的控制器。 如需了解更多信息,请参阅 KubeRay 文档中的安装说明。
Step 3: 部署 RayCluster 自定义资源#
一旦 KubeRay 操作器运行,我们就准备部署 RayCluster。为此,我们在 default 命名空间中创建 RayCluster 自定义资源 (CR)。
# Deploy a sample RayCluster CR from the KubeRay Helm chart repo:
helm install raycluster kuberay/ray-cluster --version 1.0.0-rc.0
# Once the RayCluster CR has been created, you can view it by running:
kubectl get rayclusters
# NAME DESIRED WORKERS AVAILABLE WORKERS STATUS AGE
# raycluster-kuberay 1 1 ready 72s
KubeRay operator 将检测 RayCluster 对象。然后,Operator 将通过创建 Head Pod 和 worker Pod 来启动 Ray 集群。要查看 Ray 集群的 pod,请运行以下命令:
# View the pods in the RayCluster named "raycluster-kuberay"
kubectl get pods --selector=ray.io/cluster=raycluster-kuberay
# NAME READY STATUS RESTARTS AGE
# raycluster-kuberay-head-vkj4n 1/1 Running 0 XXs
# raycluster-kuberay-worker-workergroup-xvfkr 1/1 Running 0 XXs
等待 Pod 达到“运行”状态。这可能需要几分钟 - 大部分时间都花在下载 Ray 镜像上。
如果您的 Pod 陷入 Pending 状态,您可以通过 kubectl describe pod raycluster-kuberay-xxxx-xxxxx 检查错误并确保您的 Docker 资源限制设置得足够高。
请注意,在生产场景中,您将需要使用更大的 Ray pod。 事实上,将每个 Ray pod 的大小调整为占用整个 Kubernetes 节点是有利的。 参阅 配置指南 了解更多详细信息。
Step 4: 在 RayCluster 上运行应用程序#
现在,让我们与我们部署的 RayCluster 进行交互。
方法1:在 head Pod 中执行 Ray 作业#
试验 RayCluster 最直接的方法是直接在 head pod 中执行。 首先,识别 RayCluster 的 Head Pod:
export HEAD_POD=$(kubectl get pods --selector=ray.io/node-type=head -o custom-columns=POD:metadata.name --no-headers)
echo $HEAD_POD
# raycluster-kuberay-head-vkj4n
# Print the cluster resources.
kubectl exec -it $HEAD_POD -- python -c "import ray; ray.init(); print(ray.cluster_resources())"
# 2023-04-07 10:57:46,472 INFO worker.py:1243 -- Using address 127.0.0.1:6379 set in the environment variable RAY_ADDRESS
# 2023-04-07 10:57:46,472 INFO worker.py:1364 -- Connecting to existing Ray cluster at address: 10.244.0.6:6379...
# 2023-04-07 10:57:46,482 INFO worker.py:1550 -- Connected to Ray cluster. View the dashboard at http://10.244.0.6:8265
# {'object_store_memory': 802572287.0, 'memory': 3000000000.0, 'node:10.244.0.6': 1.0, 'CPU': 2.0, 'node:10.244.0.7': 1.0}
Method 2: 通过 ray job 提交 SDK 提交 Ray job 到 RayCluster#
与方法 1 不同,此方法不需要您在 Ray head pod 中执行命令。 相反,您可以使用 Ray 作业提交 SDK 通过 Ray 监听作业请求的 Ray Dashboard 端口(默认为 8265)将 Ray 作业提交到 RayCluster。 KubeRay operator 针对 Ray head Pod 配置了 Kubernetes service 。
kubectl get service raycluster-kuberay-head-svc
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# raycluster-kuberay-head-svc ClusterIP 10.96.93.74 <none> 8265/TCP,8080/TCP,8000/TCP,10001/TCP,6379/TCP 15m
现在我们有了服务的名称,我们可以使用端口转发来访问 Ray Dashboard 端口(默认为 8265)。
# Execute this in a separate shell.
kubectl port-forward --address 0.0.0.0 service/raycluster-kuberay-head-svc 8265:8265
# Visit ${YOUR_IP}:8265 in your browser for the Dashboard (e.g. 127.0.0.1:8265)
注意:我们在本指南中使用端口转发作为试验 RayCluster 服务的简单方法。对于生产用例,您通常会
从 Kubernetes 集群内访问服务或
使用入口控制器将服务公开到集群外部。
有关详细信息,请参阅 networking notes 。
现在我们可以访问 Dashboard 端口,我们可以将作业提交到 RayCluster:
# The following job's logs will show the Ray cluster's total resource capacity, including 2 CPUs.
ray job submit --address http://localhost:8265 -- python -c "import ray; ray.init(); print(ray.cluster_resources())"
Step 5: 清理#
# [Step 5.1]: Delete the RayCluster CR
# Uninstall the RayCluster Helm chart
helm uninstall raycluster
# release "raycluster" uninstalled
# Note that it may take several seconds for the Ray pods to be fully terminated.
# Confirm that the RayCluster's pods are gone by running
kubectl get pods
# NAME READY STATUS RESTARTS AGE
# kuberay-operator-7fbdbf8c89-pt8bk 1/1 Running 0 XXm
# [Step 5.2]: Delete the KubeRay operator
# Uninstall the KubeRay operator Helm chart
helm uninstall kuberay-operator
# release "kuberay-operator" uninstalled
# Confirm that the KubeRay operator pod is gone by running
kubectl get pods
# No resources found in default namespace.
# [Step 5.3]: Delete the Kubernetes cluster
kind delete cluster