KubeSphere 多租户架构解析:三级 RBAC、资源隔离与跨集群工作空间实战
【免费下载链接】kubesphereThe container platform tailored for Kubernetes multi-cloud, datacenter, and edge management ⎈ 🖥 ☁️项目地址: https://gitcode.com/GitHub_Trending/ku/kubesphere
KubeSphere 在原生 Kubernetes 之上构建了一套完整的多租户管理体系,以「工作空间(Workspace)」为最小租户单元,通过平台 / 工作空间 / 项目三级 RBAC 与网络隔离策略,解决企业级资源共享场景下的权限边界、审计与公平调度问题。本文以 multi-tenancy-in-kubesphere.md 为主体,结合仓库内 CRD 定义、控制器源码与 API 封装脚本,深入讲解 KubeSphere 多租户的架构原理,并给出可落地的用户、工作空间、项目创建与授权实操命令。
Kubernetes 多租户面临的挑战
Kubernetes 帮助用户编排应用、调度容器,显著提升了资源利用率。但相比传统集群运维方式,企业和个人在使用 Kubernetes 时会在资源共享与安全方面遇到诸多挑战。
多租户(Multi-tenancy)是一种常见的软件架构:多租户环境中的资源由多个用户(即「租户」)共享,同时各租户的数据相互隔离。多租户 Kubernetes 集群的管理员必须做到两件事:
- 最小化受损或恶意租户对其他租户造成的破坏;
- 确保资源被公平分配。
关于多租户应该如何结构化,Kubernetes 社区从未停止过讨论,也没有统一的标准答案。但无论企业多租户系统如何构建,都离不开两个基本组成部分:逻辑资源隔离与物理资源隔离。
逻辑隔离:API 访问控制与租户级权限
从逻辑层面看,资源隔离主要指API 访问控制和基于租户的权限控制。Kubernetes 的 RBAC(Role-Based Access Control)与命名空间(Namespace)提供了逻辑隔离能力,然而它们在大多数企业环境中并不直接适用——企业中的租户往往需要跨多个命名空间甚至跨多个集群管理资源。此外,多租户体系还必须能够基于租户的行为提供审计日志与事件查询能力。
物理隔离:节点、网络与容器运行时安全
物理资源的隔离包括节点(Node)和网络(Network),同时也涉及容器运行时安全。例如:
- 创建
NetworkPolicy资源控制流量走向; - 使用
PodSecurityPolicy对象约束容器行为; - 通过 Kata Containers 等更安全的容器运行时提供额外的隔离边界。
KubeSphere 中的多租户:以工作空间为最小租户单元
为解决上述问题,KubeSphere 提供了一套基于 Kubernetes 的多租户管理解决方案。其核心架构如下图所示:
在 KubeSphere 中,工作空间(Workspace)是最小的租户单元。工作空间允许用户在多个集群与项目之间共享资源:工作空间成员可以在被授权的集群中创建项目,并邀请其他成员在同一个项目中协作。
- 用户(User):KubeSphere 账户的实例。用户可以被任命为平台管理员来管理集群,也可以被添加到工作空间中参与项目协作。
- 多级访问控制与资源配额限制:它们是 KubeSphere 资源隔离的基石,决定了多租户架构如何构建与管理。
从仓库中的 CRD 定义可以印证这一模型:workspacetemplates.tenant.kubesphere.io 是集群级(scope: Cluster)自定义资源,其spec.template.spec.manager指定工作空间管理员,spec.placement.clusters声明该工作空间将被放置到哪些集群——这正是「工作空间可跨集群共享资源」的底层实现载体;而 workspaces.tenant.kubesphere.io 则代表被同步到各个成员集群中的工作空间实例。
WorkspaceTemplate 控制器:跨集群同步的引擎
工作空间「一个模板、多处落地」的能力由 workspacetemplate_controller.go 实现。从源码结构看,该控制器承担了四项核心职责:
- 初始化内置工作空间角色:
initWorkspaceRoles会读取带scope.iam.kubesphere.io/workspace标签的BuiltinRole模板,在工作空间中创建对应的内置WorkspaceRole(源码见 workspacetemplate_controller.go)。角色名称采用<workspace>-<role>格式,超长时用 FNV 哈希截断(ensureWorkspaceRoleName)。 - 为管理员创建角色绑定:
initManagerRoleBinding将spec.template.spec.manager指定的用户绑定到该工作空间的admin角色(workspacetemplate_controller.go)。 - 跨集群同步:
multiClusterSync遍历所有就绪集群,将 WorkspaceTemplate 渲染出的 Workspace 同步到匹配的目标集群,未匹配则删除(workspacetemplate_controller.go)。 - 级联删除:删除 WorkspaceTemplate 时通过 finalizer 级联清理各成员集群中的 Workspace(
workspaceTemplateCascadingDeletion)。
控制器还监听Cluster资源的状态变化(ClusterStatusChangedPredicate),一旦集群就绪即触发对应工作空间模板的重新同步,保证跨集群一致性。
三级访问控制:平台 / 工作空间 / 项目
与 Kubernetes 类似,KubeSphere 使用RBAC管理授予用户的权限,从而在逻辑上实现资源隔离。KubeSphere 的访问控制分为平台、工作空间、项目三个层级,通过「角色(Role)」控制用户在不同层级对不同资源拥有什么权限。
- 平台角色(Platform Roles):控制平台用户对平台资源(如集群、工作空间、平台成员)的权限;
- 工作空间角色(Workspace Roles):控制工作空间成员对工作空间资源(如项目,即命名空间,以及 DevOps 项目)的权限;
- 项目角色(Project Roles):控制项目成员对项目资源(如工作负载、流水线)的权限。
仓库中以iam.kubesphere.ioAPI 组下的 CRD 完整承载了这套模型,可在 config/ks-core/charts/ks-crds/crds 中查看:
| 层级 | CRD | 角色示例(内置) |
|---|---|---|
| 平台 | globalroles.iam.kubesphere.io、globalrolebindings.iam.kubesphere.io | platform-admin(全部权限)、platform-regular(受限访问)、platform-self-provisioner(可创建工作空间) |
| 工作空间 | workspaceroles.iam.kubesphere.io、workspacerolebindings.iam.kubesphere.io | <workspace>-admin、<workspace>-regular、<workspace>-self-provisioner、<workspace>-viewer |
| 项目 | roles.iam.kubesphere.io、rolebindings.iam.kubesphere.io | admin(全量管理)、operator(增删改,不可管理角色)、viewer(只读) |
内置角色的实际定义存放在 config/ks-core/charts/ks-core/templates/builtinroles.yaml 与 config/ks-core/charts/ks-core/templates/globalroles.yaml 中;而 iam.kubesphere.io_users.yaml 定义的User是集群级资源,其spec含email、password(由 mutating admission webhook 加密)、displayName、lang、groups等字段,status记录state与lastLoginTime——平台级角色正是通过metadata.annotations["iam.kubesphere.io/globalrole"]注解绑定到用户上的。
用户密码策略(来自 CRD 校验)
iam.kubesphere.io_users.yaml 中对password字段的校验规则非常值得关注:
- 长度:8 ~ 64 位(
minLength: 8, maxLength: 64); - 组成:必须同时包含小写字母、大写字母与数字;
- 实现细节:Go 正则不支持 JavaScript 的
(?=)零宽断言,因此 CRD 用 6 个正则枚举「小写字母、大写字母、数字」首次出现的 6 种排列组合来等价实现同一校验效果; - 同时兼容已加密的 bcrypt 字符串(
^(\$2[ayb]\$.{56})$)。
这意味着创建用户时,密码必须同时满足大小写字母与数字混合、长度 8~64 的要求,否则 API 会返回 400。
网络隔离:工作空间与项目级策略
除了逻辑上的资源隔离,KubeSphere 还允许为工作空间和项目设置网络隔离策略。
这一能力沉淀在 tenant.kubesphere.io_workspaces.yaml 中:Workspace的spec早期版本(v1alpha1)明确包含networkIsolation(布尔类型)字段,用于声明是否对该工作空间启用网络隔离。在实际集群中,工作空间/项目粒度的网络隔离最终通过生成对应的NetworkPolicy资源来管控命名空间间的流量,从而在多租户环境中隔离租户网络边界。
多租户管理实战:用户、工作空间与项目
仓库中的多租户管理 Skill 提供了一整套基于 KubeSphere IAM API 的实操流程,配套脚本为 ks_api.py,它封装了 OAuth 登录、token 缓存与 API 调用(支持 GET / POST / PUT 等方法)。以下命令默认连接到http://ks-apiserver.kubesphere-system,可通过环境变量KUBESPHERE_HOST覆盖。
前置准备:登录获取 Token
# 安装依赖 pip install requests # 设置端点(可选,默认 http://ks-apiserver.kubesphere-system) export KUBESPHERE_HOST="http://<kubesphere-host>" # 登录获取 token(会自动缓存到 ~/.kubesphere_token 并自动刷新) python ks_api.py --login --username admin --password <your-password> # 可选:清除缓存的 token python ks_api.py --clear-cache创建用户
python ks_api.py POST /kapis/iam.kubesphere.io/v1beta1/users '{ "apiVersion": "iam.kubesphere.io/v1beta1", "kind": "User", "metadata": { "annotations": { "iam.kubesphere.io/uninitialized": "true", "iam.kubesphere.io/globalrole": "platform-regular", "kubesphere.io/creator": "admin" }, "name": "<username>" }, "spec": { "email": "<email>", "password": "<password>" } }'要点:
- 平台角色通过
iam.kubesphere.io/globalrole注解指定,默认platform-regular(最小权限原则,不要默认给platform-admin); iam.kubesphere.io/uninitialized: "true"标记用户尚未完成初始化,控制器会随后处理;- 密码需满足上文 CRD 中描述的强度策略。
创建工作空间
python ks_api.py POST /kapis/tenant.kubesphere.io/v1beta1/workspacetemplates '{ "apiVersion": "iam.kubesphere.io/v1beta1", "kind": "WorkspaceTemplate", "metadata": { "name": "<workspace-name>", "annotations": { "kubesphere.io/creator": "<creator>" } }, "spec": { "template": { "spec": { "manager": "<manager>" }, "metadata": { "annotations": { "kubesphere.io/creator": "<creator>" } } }, "placement": { "clusters": [ {"name": "<cluster-name>"} ] } } }'要点:
metadata.name→ 工作空间名称;spec.template.spec.manager→ 工作空间管理员(默认取当前登录用户);spec.placement.clusters→ 承载该工作空间的集群列表;- 该对象与 CRD workspacetemplates.tenant.kubesphere.io 完全对应,控制器会将工作空间同步到每个目标集群并自动初始化内置角色、绑定管理员;
- 如需指定「跨集群」,只需在
placement.clusters中列出多个集群,即可实现同一工作空间在不同集群共享资源。
在工作空间内创建项目
项目本质上是带 KubeSphere 标签的 Kubernetes 命名空间:
python ks_api.py POST /clusters/<cluster-name>/kapis/tenant.kubesphere.io/v1beta1/workspaces/<workspace-name>/namespaces '{ "apiVersion": "v1", "kind": "Namespace", "metadata": { "labels": { "kubesphere.io/workspace": "<workspace-name>", "kubesphere.io/managed": "true" }, "name": "<project-name>", "annotations": { "kubesphere.io/creator": "<creator>" } }, "cluster": "<cluster-name>" }'要点:
kubesphere.io/workspace标签将命名空间归属到指定工作空间,这是「项目」与「工作空间」关联的实现机制;kubesphere.io/managed: "true"标记该项目由 KubeSphere 管理。
邀请用户加入工作空间 / 项目
工作空间级邀请(默认角色<workspace-name>-regular):
python ks_api.py POST /kapis/iam.kubesphere.io/v1beta1/workspaces/<workspace-name>/workspacemembers '[{"username":"<username>","roleRef":"<workspace-name>-regular"}]'项目级邀请(默认角色viewer):
python ks_api.py POST /clusters/<cluster-name>/kapis/iam.kubesphere.io/v1beta1/namespaces/<project-name>/namespacemembers '[{"username":"<username>","roleRef":"viewer"}]'修改用户权限
修改平台角色时,需要先 GET 用户拿到完整 metadata,再 PUT 更新iam.kubesphere.io/globalrole注解:
# 步骤 1:获取当前用户信息 python ks_api.py GET /kapis/iam.kubesphere.io/v1beta1/users/<username> # 步骤 2:更新平台角色注解 python ks_api.py PUT /kapis/iam.kubesphere.io/v1beta1/users/<username> '{ "apiVersion": "iam.kubesphere.io/v1beta1", "kind": "User", "metadata": { "name": "<username>", "annotations": { "iam.kubesphere.io/globalrole": "<new-global-role>" } } }'修改工作空间角色与项目角色:
# 工作空间角色 python ks_api.py PUT /kapis/iam.kubesphere.io/v1beta1/workspaces/<workspace-name>/workspacemembers/<username> '{"username":"<username>","roleRef":"<workspace-name>-<role>"}' # 项目角色 python ks_api.py PUT /clusters/<cluster-name>/kapis/iam.kubesphere.io/v1beta1/namespaces/<project-name>/namespacemembers/<username> '{"username":"<username>","roleRef":"<role>"}'查询多租户资源
# 列出工作空间 python ks_api.py GET /kapis/tenant.kubesphere.io/v1beta1/workspacetemplates # 列出用户 python ks_api.py GET /kapis/iam.kubesphere.io/v1beta1/users # 列出工作空间成员 python ks_api.py GET /kapis/iam.kubesphere.io/v1beta1/workspaces/<workspace-name>/workspacemembers # 列出项目成员 python ks_api.py GET /clusters/<cluster-name>/kapis/iam.kubesphere.io/v1beta1/namespaces/<project-name>/namespacemembers # 列出工作空间内的项目 python ks_api.py GET /clusters/<cluster-name>/kapis/tenant.kubesphere.io/v1beta1/workspaces/<workspace-name>/namespaces # 获取用户详情 python ks_api.py GET /kapis/iam.kubesphere.io/v1beta1/users/<username>常见错误排查
| 错误码 | 原因 | 解决办法 |
|---|---|---|
401 Unauthorized | Token 过期 | 清除缓存后重新登录:python ks_api.py --clear-cache && python ks_api.py --login --username admin --password <password> |
403 Forbidden | 无权限 | 使用 admin 账号操作 |
409 Conflict | 资源已存在 | 更换名称 |
404 Not Found | 资源不存在 | 核对名称 / 工作空间 / 集群是否正确 |
400 Bad Request | 参数不合法 | 检查错误信息(邮箱格式、密码策略、命名规则) |
| 连接拒绝 / 超时 | API 不可达 | 核对KUBESPHERE_HOST是否正确 |
调试小技巧:--quiet参数可以输出更简洁的结果,如python ks_api.py GET /users --quiet;直接运行python ks_api.py可查看当前缓存的 token 状态。
最佳实践与安全边界
基于 Skill 的约束与仓库实现,多租户管理应遵循以下原则:
- 最小权限原则:新建用户默认
platform-regular,邀请到工作空间默认<workspace-name>-regular,邀请到项目默认viewer,仅在明确要求时才提升权限; - 优先使用内置角色:不要自行创建自定义 Role / WorkspaceRole / GlobalRole,自定义权限请通过 KubeSphere 控制台审批流程配置;
- 敏感操作走控制台:删除用户、工作空间、项目、角色或角色绑定等敏感操作不应通过 API 直接执行,而应经 KubeSphere 控制台配合审批流程完成;
- 审计与事件:多租户体系必须具备面向隔离租户的审计日志与事件查询能力,三级角色绑定关系(
globalrolebindings、workspacerolebindings、rolebindings)会随用户与角色的变更被控制器持续调和。
小结
KubeSphere 的多租户方案以工作空间为最小租户单元,向上对接平台级的集群与全局资源管理,向下承接跨集群、跨命名空间的项目协作;通过平台 / 工作空间 / 项目三级 RBAC实现逻辑隔离,通过NetworkPolicy 与网络隔离策略实现网络层隔离,并通过 workspacetemplate 控制器 将工作空间模板自动同步到多个成员集群。结合本文给出的 CRD 字段说明与 API 实操命令,你可以快速在企业集群中落地「用户 → 工作空间 → 项目」的完整租户管理体系。
【免费下载链接】kubesphereThe container platform tailored for Kubernetes multi-cloud, datacenter, and edge management ⎈ 🖥 ☁️项目地址: https://gitcode.com/GitHub_Trending/ku/kubesphere
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考