在 GKE 中配置 KubeRay 使用 Google Cloud Storage 存储桶#

如果你已经熟悉GKE中的工作负载身份,可以跳过本文档。简而言之,你需要在每个Ray pod中指定一个服务账户,前提是你的Kubernetes服务账户已经与你的Google Cloud服务账户关联。否则,请继续阅读。

这个示例是 https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identity 文档的简略版本。如果你对细节感兴趣,完整的文档值得一读。

在 GKE 上创建一个 Kubernetes 集群#

此示例使用 GKE 创建一个最小的 KubeRay 集群。

在您的本地机器或 Google Cloud Shell 上运行此命令及所有后续命令。如果在本地机器上运行,请安装 Google Cloud SDK

gcloud container clusters create cloud-bucket-cluster \
    --num-nodes=1 --min-nodes 0 --max-nodes 1 --enable-autoscaling \
    --zone=us-west1-b --machine-type e2-standard-8 \
    --workload-pool=my-project-id.svc.id.goog # Replace my-project-id with your GCP project ID

此命令在 us-west1-b 区域创建一个名为 cloud-bucket-cluster 的 Kubernetes 集群,并包含一个节点。此示例使用 e2-standard-8 机器类型,该类型具有 8 个 vCPU 和 32 GB 内存。

有关如何查找您的项目ID的更多信息,请参阅 https://support.google.com/googleapi/answer/7014113?hl=enhttps://cloud.google.com/resource-manager/docs/creating-managing-projects

现在获取用于 kubectl 的集群凭证:

gcloud container clusters get-credentials cloud-bucket-cluster --zone us-west1-b --project my-project-id

创建一个 IAM 服务账户#

gcloud iam service-accounts create my-iam-sa

创建一个 Kubernetes 服务账户#

kubectl create serviceaccount my-ksa

创建一个Google Cloud Storage存储桶,并允许Google Cloud服务帐户访问它#

请按照 https://cloud.google.com/storage/docs/creating-buckets 的文档,使用 Google Cloud Console 或 gsutil 命令行工具创建一个存储桶。

此示例为 my-iam-sa@my-project-id.iam.gserviceaccount.com 授予存储桶上的“存储管理员”权限。可以在 Google Cloud 控制台中启用这些权限(在“存储桶”>“存储桶详情”下的“权限”选项卡中),或使用以下命令:

gsutil iam ch serviceAccount:my-iam-sa@my-project-id.iam.gserviceaccount.com:roles/storage.admin gs://my-bucket

创建一个最小的 RayCluster YAML 清单#

您可以使用 curl 下载本教程的 RayCluster YAML 清单,如下所示:

curl -LO https://raw.githubusercontent.com/ray-project/kuberay/v1.0.0/ray-operator/config/samples/ray-cluster.gke-bucket.yaml

关键部分是以下几行:

      spec:
        serviceAccountName: my-ksa
        nodeSelector:
          iam.gke.io/gke-metadata-server-enabled: "true"

在Ray集群的每个pod规范中包含这些行。为了简单起见,这个示例使用了一个单节点集群(1个头节点和0个工作节点)。

创建 RayCluster#

kubectl apply -f ray-cluster.gke-bucket.yaml

从 RayCluster 测试 GCS 存储桶访问#

使用 kubectl get pod 获取 Ray head pod 的名称。然后运行以下命令以在 Ray head pod 中获取一个 shell:

kubectl exec -it raycluster-mini-head-xxxx -- /bin/bash

在shell中,运行 pip install google-cloud-storage 以安装Google Cloud Storage Python客户端库。

(对于生产用例,您需要确保 google-cloud-storage 安装在集群的每个节点上,或者使用 ray.init(runtime_env={"pip": ["google-cloud-storage"]}) 在需要时安装该包——更多详情请参见 https://docs.ray.io/en/latest/ray-core/handling-dependencies.html#runtime-environments。)

然后运行以下 Python 代码来测试对存储桶的访问:

import ray
import os
from google.cloud import storage

GCP_GCS_BUCKET = "my-bucket"
GCP_GCS_FILE = "test_file.txt"

ray.init(address="auto")

@ray.remote
def check_gcs_read_write():
    client = storage.Client()
    bucket = client.get_bucket(GCP_GCS_BUCKET)
    blob = bucket.blob(GCP_GCS_FILE)

    # Write to the bucket
    blob.upload_from_string("Hello, Ray on GKE!")

    # Read from the bucket
    content = blob.download_as_text()

    return content

result = ray.get(check_gcs_read_write.remote())
print(result)

你应该看到以下输出:

Hello, Ray on GKE!