在 Azure AKS 上创建带 GPU 节点池的 Kubernetes 集群并部署 KubeRay
【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址: https://gitcode.com/gh_mirrors/ra/ray
导读
本文基于 Azure AKS GPU 集群指南,完整讲解如何在微软 Azure 上使用azCLI 从零创建一个带 GPU 节点池的 AKS 集群,用于运行 KubeRay 驱动的 Ray 分布式训练与推理工作负载。读完本文,你将掌握资源组创建、系统节点池初始化、GPU 节点池(含节点污点与集群自动扩缩容)的配置,以及 kubeconfig 获取这一整套可复现的命令流程,并能将集群接入 Ray on Kubernetes 的部署链路。
为什么需要为 KubeRay 准备 GPU 集群
KubeRay 是运行在 Kubernetes 之上的 Ray 编排层,负责将 Ray 的 head/worker Pod 调度到集群节点上。Ray 文档中的大量 KubeRay 示例(如 StableDiffusion 推理、DeepSeek 服务、MNIST 分布式训练)都依赖 GPU 硬件,而大多数本地 Kubernetes 环境(如 Kind)并不提供 GPU 节点。因此,KubeRay 官方文档专门为各主流云厂商准备了"GPU 集群搭建指南"系列,AKS 指南 就是其中面向 Azure 的一份,与其并列的还有 AWS EKS、GCP GKE 和 阿里云 ACK 版本,统称为 托管 Kubernetes 服务。
本指南采用的配置方案可以复用到文档中的绝大多数 KubeRay 示例:CPU 节点池承载 KubeRay operator、Ray head 等非 GPU 组件,GPU 节点池专门承载带 GPU 的 Ray worker,并通过节点污点(taint)保证两类工作负载互不干扰。
前置条件
动手前请确认以下环境就绪:
- 已注册 Azure 账号并登录,可直接在 Azure 门户 中操作,也可以全程使用命令行;
- 本机已安装 Azure CLI(
az),并执行过az login完成认证; - 若从零开始使用 AKS,建议先阅读 Azure 官方的 AKS 文档 与 快速上手;
- 理解 AKS 的 多节点池(multiple node pools) 概念,这是成功部署 Ray on Kubernetes 的基础。
Step 1:创建资源组(Resource Group)
所有 Azure 资源(集群、节点池、负载均衡器等)都归属在同一个资源组中,便于统一管理、权限控制和成本核算。在指定区域创建资源组的命令如下:
az group create -l eastus -n kuberay-rg参数说明:
| 参数 | 含义 | 说明 |
|---|---|---|
-l eastus | 资源组所在地域 | 建议选择离你最近的 Azure 区域;后续集群与节点池默认继承该地域 |
-n kuberay-rg | 资源组名称 | 命名可自定义,本文与后续命令保持一致 |
Step 2:创建 AKS 集群与系统节点池
创建 AKS 集群时必须同时指定至少一个系统节点池(system nodepool),它承载 CoreDNS、metrics-server等系统组件。这里创建一个 3 节点的系统池,规格为Standard_D8s_v3(8 vCPU、32 GB 内存的通用型实例):
az aks create \ -g kuberay-rg \ -n kuberay-gpu-cluster \ --nodepool-name system \ --node-vm-size Standard_D8s_v3 \ --node-count 3参数说明:
| 参数 | 含义 | 说明 |
|---|---|---|
-g kuberay-rg | 资源组 | 对应 Step 1 创建的资源组 |
-n kuberay-gpu-cluster | AKS 集群名称 | 后续所有命令都要引用它 |
--nodepool-name system | 节点池名称 | 命名为system以明确其用途 |
--node-vm-size Standard_D8s_v3 | 节点虚拟机规格 | D 系列为通用型,适合 CPU 工作负载 |
--node-count 3 | 初始节点数量 | 3 个节点为 KubeRay operator、Ray head 与系统组件提供充足资源 |
为什么用系统池而不是 GPU 池承载一切?参考 Ray 在 EKS 上的实践(见 AWS EKS GPU 集群指南),通常应避免把 GPU 工作负载放在 Ray head 所在的节点上,让非 GPU 的 Pod(KubeRay operator、Ray head、CoreDNS)跑在廉价的 CPU 节点,GPU 只留给 Ray worker。
Step 3:添加 GPU 节点池
GPU 节点池是整篇指南的核心。下面的命令为集群新增一个名为gpupool的 GPU 节点池,规格为Standard_NC6s_v3(NVIDIA Tesla V100,单卡 16 GB 显存),并开启集群自动扩缩容:
az aks nodepool add \ -g kuberay-rg \ --cluster-name kuberay-gpu-cluster \ --nodepool-name gpupool \ --node-vm-size Standard_NC6s_v3 \ --node-taints nvidia.com/gpu=present:NoSchedule \ --min-count 0 \ --max-count 3 \ --enable-cluster-autoscaler参数说明:
| 参数 | 含义 | 说明 |
|---|---|---|
--cluster-name kuberay-gpu-cluster | 目标 AKS 集群 | 注意与az aks create的-n区分,这里是--cluster-name |
--nodepool-name gpupool | GPU 节点池名称 | 通常用gpupool、gpu等直观命名 |
--node-vm-size Standard_NC6s_v3 | GPU 虚拟机规格 | NC 系列为 GPU 计算实例;可根据显存/算力需求换成Standard_NC12s_v3、Standard_NC24s_v3等 |
--node-taints nvidia.com/gpu=present:NoSchedule | 节点污点 | 防止普通 CPU Pod 被调度到 GPU 节点,见下文"污点与容忍"小节 |
--min-count 0/--max-count 3 | 节点池扩缩容边界 | 最小为 0 意味着空闲时可缩到没有 GPU 节点,从而节省成本 |
--enable-cluster-autoscaler | 开启集群自动扩缩容 | 与 KubeRay / Ray 的自动扩缩配合,按需伸缩节点数量 |
污点nvidia.com/gpu=present:NoSchedule的作用
NoSchedule污点会阻止没有对应容忍(toleration)的 Pod 调度到 GPU 节点上,这正是隔离 GPU 资源的关键手段:
- 无 GPU 需求的 Pod(KubeRay operator、Ray head、系统组件)没有 GPU 容忍,只会落在 CPU 系统池;
- 声明了
nvidia.com/gpu资源请求的 Ray worker Pod会被 Kubernetes 的ExtendedResourceToleration准入控制器自动加上匹配的容忍,从而允许调度到 GPU 节点。这也是托管服务(GKE/EKS/AKS)自动完成的典型行为,详见 GPU 使用指南。
驱动安装的两种方式
AKS 在 GPU 节点上默认预装 NVIDIA 驱动,无需额外操作。如果你希望使用 NVIDIA GPU Operator 来统一管理驱动、设备插件与监控组件,也可以参考 Azure 官方文档的 Skip GPU driver installation (Preview) 章节,改用 GPU Operator 方案。
Step 4:获取 kubeconfig 并验证集群
集群创建完成后,需要将凭据下载到本地,kubectl才能访问集群:
az aks get-credentials --resource-group kuberay-rg \ --name kuberay-gpu-cluster \ --overwrite-existing参数说明:
| 参数 | 含义 | 说明 |
|---|---|---|
--resource-group kuberay-rg | 资源组 | 与集群创建时一致 |
--name kuberay-gpu-cluster | 集群名称 | 与集群创建时一致 |
--overwrite-existing | 覆盖本地已有 kubeconfig 条目 | 避免因同名条目冲突导致连接失败 |
验证 GPU 节点是否就绪
获取凭据后,建议立即验证 GPU 资源是否已暴露给 Kubernetes(参考 EKS 指南 中的同类验证命令):
# 查看节点状态 kubectl get nodes # 检查 GPU 节点是否报告了可分配的 nvidia.com/gpu 资源 kubectl get nodes "-o=custom-columns=NAME:.metadata.name,GPU:.status.allocatable.nvidia\.com/gpu"如果 GPU 列显示<none>,说明设备插件或驱动未就绪,需要回到 Step 3 检查驱动安装方案。
部署 KubeRay 并运行 GPU 工作负载
集群就绪后,就进入标准的 Ray on Kubernetes 部署流程:
安装 KubeRay operator:参考 KubeRay Operator 安装指南,推荐用 Helm 安装到独立的
ray-system命名空间:helm repo add kuberay https://ray-project.github.io/kuberay-helm/ helm repo update kubectl create namespace ray-system helm install kuberay-operator kuberay/kuberay-operator --version 1.7.0 -n ray-system部署 RayCluster 自定义资源:参考 RayCluster 快速入门,创建 RayCluster CR 后,KubeRay operator 会自动创建 head 与 worker Pod。
为 GPU worker 配置资源请求:要让 Ray worker 真正使用 GPU,必须在
workerGroupSpecs的 Pod 模板中声明nvidia.com/gpu资源。下面是 GPU 使用指南 中的配置片段(最大 5 个 GPU worker):groupName: gpu-group replicas: 0 minReplicas: 0 maxReplicas: 5 template: spec: containers: - name: ray-node image: rayproject/ray:2.57.0-gpu resources: nvidia.com/gpu: 1 # 可选,仅作文档说明 cpu: 3 memory: 50Gi limits: nvidia.com/gpu: 1 # 必填,使用 GPU 的前提 cpu: 3 memory: 50Gi要点:
nvidia.com/gpu必须出现在limits中,否则 Pod 无法获得 GPU;- 镜像应使用 Ray 官方 CUDA 版镜像(如
rayproject/ray:2.57.0-gpu);该镜像不含 TensorFlow/PyTorch 等 ML 库,需通过自定义镜像或 Ray Runtime 环境 补充; - KubeRay operator 会把容器声明的 GPU 资源上限同步给 Ray 调度器与 Ray 自动扩缩器,自动为
ray start注入--num-gpus参数。
触发 GPU worker 扩容:部署完成后,Ray 程序中声明 GPU 需求的 Task/Actor 会触发 worker 扩容。例如创建 2 个各需 1 块 GPU 的 Actor:
import ray ray.init() @ray.remote(num_gpus=1) class GPUActor: def say_hello(self): print("I live in a pod with GPU access.") # 请求放置 2 个 GPU Actor,会触发 GPU worker Pod 与底层节点扩缩容 gpu_actors = [GPUActor.remote() for _ in range(2)] ray.get([actor.say_hello.remote() for actor in gpu_actors])程序退出后 Actor 被回收,GPU worker Pod 会在空闲超时(默认 60 秒)后被 Ray 自动缩容;由于本指南在 Step 3 开启了
--enable-cluster-autoscaler,底层 GPU 节点也会随 Pod 减少而一并缩容,实现"用多少、花多少"。
成本提示与清理
GPU 实例(如Standard_NC6s_v3)价格昂贵,且 GPU 节点池的最小容量被设置为 0,就是为了在无任务时缩到零节点。若不再使用集群,务必删除资源以免持续计费:
az group delete --name kuberay-rg --yes --no-wait删除资源组会级联清理其下全部资源(集群、节点池、网络资源等),是清理 AKS 环境最彻底的方式。
总结
本文完整复现了 Azure AKS GPU 集群指南 的四步流程:创建资源组 → 创建带系统节点池的 AKS 集群 → 添加带污点与自动扩缩容的 GPU 节点池 → 获取 kubeconfig。结合 KubeRay Operator 安装、RayCluster 快速入门 与 GPU 使用指南,即可让文档中绝大多数 GPU 类 KubeRay 示例(如 StableDiffusion 推理、MNIST 训练)在 Azure 上直接运行。该配置方案同样适用于其他云厂商,区别仅在于 EKS、GKE 与 ACK 各自的集群创建命令。
【免费下载链接】rayRay is an AI compute engine. Ray consists of a core distributed runtime and a set of AI Libraries for accelerating ML workloads.项目地址: https://gitcode.com/gh_mirrors/ra/ray
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考