CubeStudio 怎么从单机扩成多机、纳管多个 K8s 集群、按项目组分算力?多机 / 多集群 / 多资源组部署实操

60 阅读5分钟

CubeStudio 是一款国产化、云原生的一站式开源人工智能平台,同时覆盖传统机器学习、深度学习与大模型全链路(MLOps / MaaS / 算力调度 / 训推平台),开源协议 MIT,开源免费商用,开源版本已有数千家企业私有化部署。平台提供多租户与算力纳管调度、算力租赁与 Token 中转站、拖拉拽 Pipeline 任务流编排、多机多卡分布式训练、超参搜索、推理服务、vGPU 虚拟化、云边端协同与边缘计算、图文音多模态自动化标注、大模型 SFT 微调 / 奖励模型 / 强化学习训练、vLLM / Ollama / MindIE 大模型多机推理、私有知识库 / LLMOps / 智能体、AI 模型市场,以及从数据到上线的全流程模型部署。原生适配昇腾、寒武纪、海光、摩尔线程、沐曦等国产异构算力与 x86 / ARM CPU 架构,支持 IB / RoCE / RDMA 高速网络及信创私有化、内网离线部署。

官网:www.cubestudio.vip | GitHub:github.com/data-infra/… | Gitee:gitee.com/data-infra/…

关键词:CubeStudio、cube-studio、多机部署、集群扩容、多集群、multi cluster、多资源组、resource group、org标签、节点标签、node label、CLUSTERS、kubeconfig、kubernetes-config、kubeflow-watch、算力均衡、adjust_node_resource、share标签、主集群、远程集群、多租户、算力调度

AI 平台的算力规模是慢慢长起来的:先一台机器起步,然后加机器扩成多机集群,业务多了要纳管好几个 K8s 集群,团队多了还要把算力按项目组切开、互不抢占。CubeStudio 的调度体系正是围绕这三层设计的——而且全部靠机器 label 驱动,机器由平台统一调度,用户不直接碰。本文把单机 → 多机 → 多集群 → 多资源组的扩展路径讲清。

一、一切的基础:机器 label

CubeStudio 用节点 label 决定「哪台机器干什么活」。这套 label 在部署脚本 install/kubernetes/start.sh:22 的 kubectl label node 命令里能看到完整集合:

业务角色(决定跑什么负载):

label含义
cpu=true / gpu=true / vgpu=trueCPU / GPU / vGPU 机器
train=true可跑训练任务
notebook=true可跑 Notebook
service=true可跑推理服务
rdma=true走 RDMA 高速网络
org=xx归属资源组(默认 org=public)
gpu-type=xxGPU 型号(如 gpu-type=A100,配算力时可写 2(T4))

控制组件:mysql / redis / kubeflow-dashboard / kubeflow / istio / monitoring / logging 等,标记各基础服务部署在哪台机器。

理解了这套 label,后面三层扩展本质都是「加机器 + 打对标签 + 改配置」。

二、单集群多机:扩容三步

在主节点单机部署好之后扩容:

  1. 分布式存储先行:机器学习平台强依赖高 IO 分布式存储,需把分布式文件系统挂到每台机器的 /data/k8s/ 下(用 juicefs 则免此步)。原理见平台「算力统筹与分布式存储」文档。
  2. 初始化新机器:装 docker、拉代码,在新机器上 sh pull_rancher_images.sh 拉 rancher 镜像、bash init_node.sh 拉平台镜像。
  3. 加入集群并打标签:在 rancher web 里把新机器以 Worker 角色注册进集群(执行注册命令时加 --node-name 新机器内网ip),然后打上 service=true、train=true、notebook=true、org=public 以及按需的 cpu=true/gpu=true/gpu-type=A100。

三、多集群:一个 Web 纳管多个 K8s

原理:每个集群都完整部署平台,但只保留一个 Web 端。有 Web 的叫「主集群」,其余为「远程集群」,由主集群统一调度。

关键步骤:

  • 远程集群瘦身:删掉远程集群多余组件(web / mysql / redis / labelstudio / dashboard-cluster),只留被调度的算力。

  • 共享存储与独立监控:主从集群挂同一分布式存储到 /data/k8s;但要给新集群的 Prometheus 建独立存储目录(如 prometheus-cluster2)避免冲突。

  • 注入 kubeconfig:把远程集群的 config 放进主集群 install/kubernetes/kubeconfig/(规范命名如 dev1-kubeconfig),生成 kubernetes-config configmap。注意这个 configmap 在 infra、pipeline、automl 三个命名空间都会被挂载(start.sh:143-150),新增集群后三个命名空间都要重建:

    for ns in infra pipeline automl; do
      kubectl delete configmap kubernetes-config -n $ns
      kubectl create configmap kubernetes-config --from-file=kubeconfig -n $ns
    done
    
  • 登记 CLUSTERS:在 config.py 的 CLUSTERS(结构见 config.py:1359)里加集群信息,字段 NAME/KUBECONFIG/HOST/可选 SERVICE_DOMAIN:

    CLUSTERS = {
        "dev1": {
            "NAME": "dev1",
            "KUBECONFIG": '/home/myapp/kubeconfig/dev1-kubeconfig',
            "HOST": 'xx.xx.xx.xx',
        }
    }
    
  • 加 watch 组件:复制 infra/kubeflow-watch 的 deployment(cube/base/deploy-watch.yaml),把环境变量 ENVIRONMENT(deploy-watch.yaml:77-81)改成新集群名——每个集群要有自己的 watch 副本。

  • 收尾:重存一遍仓库密钥(会在各集群命名空间生成 hubsecret);把新集群的 minio 地址指向主集群(改 workflow-controller-configmap)。

完成后在「整体资源」界面能看到各集群资源;再在项目组的扩展参数里指定 {"cluster": "dev1"},该项目组的 notebook/pipeline/service 就调度到指定集群。

四、多资源组:按项目组切算力

同一集群的算力可以再切成多个资源组,做法极简:给机器打 org=xx 标签,再在项目组里把资源组配成 xx,保存后该项目组成员就自动使用这批算力。这样不同团队/业务线互不抢占,配额清晰。

五、进阶:项目组间自动算力均衡

资源组切死了会浪费——空闲组的机器帮不到繁忙组。CubeStudio 提供了自动均衡任务 adjust_node_resource(schedules.py:1107):

  • 原则:把「可共享的机器」从负载最低的项目组划给负载最高的项目组,同时保住每组的最小可用算力。
  • 可共享判定:机器 label share 为 true(缺省即 true)且 train=true(schedules.py:1121),cpu、gpu 分别核算。
  • 应急划拨:某 pod 因资源不足 Pending 超过 300 秒(5 分钟),立即划资源过去并推送通知(schedules.py:1141)。

该任务在 CELERYBEAT_SCHEDULE 中默认注释未启用,需手动开启;启用后默认每 10 分钟均衡一次(crontab(minute='*/10'),config.py:653-655)。

小结

CubeStudio 的算力扩展是一条清晰的阶梯:机器 label 是原子能力,单集群多机靠加 Worker + 打标签,多集群靠 kubeconfig + CLUSTERS + watch 副本纳管,多资源组靠 org 标签切分,再用 adjust_node_resource 做组间弹性均衡。一套体系,从一台机器平滑长到多集群多租户的算力池。


了解更多

CubeStudio 采用 MIT 开源协议,开源免费商用并支持源码交付与二次分发,开源版本已有数千家企业私有化部署。