项目空间(项目组)
项目组(数据库表 project,type 为 org)是平台划分权限与资源的核心单位。项目组既可用来控制成员能接触的资源和任务流,也可用来把任务调度到指定的集群、资源组、挂载、命名空间,并施加资源额度限制。
平台中“项目空间 / 项目分组 / 项目组”指的是同一概念。
加入项目组
路径:项目空间 -> 项目分组 -> 更多 -> 组成员。如果自己不在需要加入的项目组成员列表中,可以联系项目组的 creator 将自己加入到项目组中。

备注:
- 每个人自动都在
public项目组中。 - 管理员可自行创建项目组。
creator 添加用户
路径:项目空间 -> 项目分组 -> 更多 -> 组成员 -> 添加组成员,则 creator 角色的组成员可以添加其他用户进组。

添加组成员时,可以选择该组成员的角色,控制组成员能接触的资源和 pipeline 等。

成员角色
平台支持以下成员角色(见 myapp/views/view_team.py 中 role 字段的可选值 ['dev', 'ops', 'creator', 'auditor']):
creator:项目组创建者/管理者,可以添加、修改、删除其他组成员(可以有多个 creator)。ops、dev:普通成员角色。auditor:审计角色。
权限校验逻辑:非管理员只有在自己是该项目组 creator 时,才能新增/编辑/删除组成员(view_team.py 的 check_edit_permission)。
项目组控制调度集群 cluster(管理员)
平台支持多 k8s 集群调度。需要管理员先创建集群并配置到系统配置(CLUSTERS)后,可通过项目组扩展参数中的 cluster 字段控制项目组的调度集群。项目组若未配置 cluster,则使用配置项 ENVIRONMENT 对应的默认集群。

集群准备、GPU/网络等基础设施配置参见 02-部署安装 段。
项目组控制调度机器资源组(管理员)
平台支持在单集群中划分资源组。需要管理员先配置不同机器所属的资源组(机器 label org=xxx,见 机器资源配置)后,可通过项目组扩展参数中的 org 字段控制项目组的调度机器。

项目组可以用来划分权限,同时也可以用来划分资源。一台调度机器只能划入一个资源组。
- 如果单纯通过项目组划分权限、不划分资源,那么一个资源组可以划入多个项目组,调度机器可以是不同项目组、不同机型、不同区域等划分方式,这种方式能提高机器利用率,避免一个项目组不使用时机器空闲。
- 如果在划分权限的同时划分资源,那么调度机器就只会属于一个项目组。
资源组在底层是通过机器节点的
orglabel 实现的,调度时项目组会把org=xxx加入 node_selector(见myapp/models/model_team.py的node_selector属性)。
项目组控制挂载(管理员)
平台支持在单集群中划分挂载。可以配置项目组下成员将自有分布式存储挂载到平台,以及项目组内共享目录等功能,可通过项目组扩展参数中的 volume_mount 字段控制项目组的挂载。
挂载格式为 $名称(类型):$容器内路径,多个挂载用 , 或 ; 分隔。支持的挂载类型有 (pvc)、(pvc-share)、(hostpath)、(storage)、(configmap)、(memory)(见 myapp/views/view_team.py 的 pre_add_req 校验):
(pvc):会自动挂载该 pvc 下对应的个人用户子目录(以用户名为子目录)。默认挂载kubeflow-user-workspace的 pvc 到/mnt。管理员可自行创建 pvc 进行挂载。(pvc-share):挂载 pvc,但不自动加用户名子目录,用于多人共享。(hostpath):挂载宿主机目录,不会自动挂载个人子目录,可用来控制多人共享同一个公共目录。(storage):挂载存储资源中已 mount 的分布式存储(按存储名引用)。(configmap)、(memory):分别挂载 configmap、内存盘。
pvc 与 hostpath 可以同时存在,实现既有个人子目录又有公共目录。

示例:
kubeflow-user-workspace(pvc):/mnt/;/data/aidata(hostpath):/aidata
行为细节:即使没有显式配置
/mnt挂载,平台也会自动补上kubeflow-user-workspace(pvc):/mnt(见model_team.py的volume_mount属性)。引用(pvc)/(storage)时平台会校验对应 pvc / 存储是否存在,不存在会报错。
项目组控制服务 service 代理 IP(管理员)
平台支持在单集群中划分服务的代理 IP,多用于边缘集群,或多网关情况下。可通过项目组扩展参数中的 SERVICE_EXTERNAL_IP 字段控制项目组下服务的代理 IP。
格式为 内网ip 或 内网ip|公网ip(例如 xx.内网.xx.xx|xx.公网.xx.xx),见 view_team.py 的 SERVICE_EXTERNAL_IP 字段说明;对应全局默认配置项为 SERVICE_EXTERNAL_IP(myapp/config.py)。

项目组控制资源额度
平台有三个层面的额度控制:
- 个人额度:在“用户列表”中可以设定某个人的额度限制,只要是这个用户启动的任务都会被纳入统计。
- 项目组额度:在项目组的扩展参数
quota中配置,对项目组下所有用户启动的任务总和进行统计。 - 项目组下个人额度:在项目组成员(组成员)配置中设置,用于某个人在某个项目组下拥有的可用资源量。
额度填写格式
⚠️ 注意:三个层面的额度填写格式不同。原文档只给出了 4 字段格式,实际上“个人额度(用户列表)”用的是 6 字段格式。依据
myapp/security.py:321、myapp/views/view_team.py:116,402的表单说明,以及myapp/utils/core.py:2085,2147,2205的解析逻辑。
个人额度(用户列表,6 字段):
$集群名,$资源组名,$命名空间,$资源类型,$限制类型,$限制值$集群名:可为all或具体集群名(如dev)。$资源组名:可为all或具体资源组名(如public)。$命名空间:all,jupyter,pipeline,service,automl,aihub(notebook会被等价处理为jupyter)。$资源类型:cpu,memory,gpu。$限制类型:single,concurrent。
项目组额度 / 项目组下个人额度(4 字段):
$命名空间,$资源类型,$限制类型,$限制值$命名空间:all,jupyter,pipeline,service,automl,aihub。$资源类型:cpu,memory,gpu。$限制类型:single,concurrent。
公共说明:
$限制类型中,single表示单个 pod 占用的资源最大值;concurrent表示可同时处于运行中的资源最大值。- 多个限额配置之间使用分号
;分隔(也支持换行分隔)。 - 管理员不受额度限制(
core.py的meet_quota对 admin 直接放行)。