
KubeSphere 多租户管理实战指南基于 ks_api.py 的用户、工作空间与项目全生命周期操作【免费下载链接】kubesphereThe container platform tailored for Kubernetes multi-cloud, datacenter, and edge management ⎈ ☁️项目地址: https://gitcode.com/GitHub_Trending/ku/kubesphere导读本指南以 KubeSphere 仓库中skills/kubesphere-multi-tenant-management的 Skill 定义为核心系统讲解 KubeSphere 三层租户模型平台 / 工作空间 / 项目与内置 RBAC 角色体系并基于仓库自带的 ks_api.py 命令行工具给出从创建工作空间、创建项目、创建用户、邀请成员到修改权限与查询资源的完整可执行操作序列。读完本文你将能够直接通过 REST API 完成 KubeSphere 多租户资源的日常管理与权限分配并理解这些 API 调用在后端源码中的真实落点。一、KubeSphere 多租户模型与设计背景Kubernetes 通过命名空间与 RBAC 提供了基础的逻辑隔离能力但在真实的企业环境中租户往往需要跨多个命名空间、甚至跨多个集群管理资源同时还需要基于租户维度的审计日志与事件查询能力物理资源层面的隔离则涉及节点、网络与容器运行时安全。KubeSphere 在 Kubernetes 之上提供了一套完整的多租户管理方案并以工作空间Workspace作为最小的租户单元使用户可以在多个集群与项目之间共享资源。工作空间成员可以在被授权的集群中创建项目并邀请其他成员在同一项目内协作。KubeSphere 的多租户资源隔离由多级访问控制与资源配额限制共同支撑其访问控制分为平台、工作空间、项目三个层级分别通过不同层级的角色控制用户对对应资源的权限平台角色Platform Roles控制平台用户对集群、工作空间、平台成员等平台级资源的权限工作空间角色Workspace Roles控制工作空间成员对项目即命名空间、DevOps 项目等工作空间级资源的权限项目角色Project Roles控制项目成员对工作负载、流水线等项目级资源的权限。除逻辑隔离外KubeSphere 还允许为工作空间和项目设置网络隔离策略从而在逻辑隔离之外提供网络层隔离能力。更完整的架构说明可参阅 multi-tenancy-in-kubesphere.md。二、安全准则本技能允许做什么、禁止做什么多租户管理涉及敏感的账号与权限数据该 Skill 内置了四条必须遵守的安全边界禁止使用kubectl edit/kubectl delete不得通过kubectl edit、kubectl delete或类似命令修改/删除工作空间、项目、用户、角色或角色绑定。此类敏感操作应通过 KubeSphere 控制台配合审批流程执行。禁止通过 API 执行删除操作不得通过 API 删除用户、工作空间、项目、角色或角色绑定本技能仅用于创建与查询资源。禁止创建自定义角色不得创建自定义的Role、WorkspaceRole、GlobalRole只能使用 KubeSphere 提供的内置角色如需自定义权限应引导用户在 KubeSphere 控制台配置。默认遵循最小权限原则新建用户默认使用platform-regular而非platform-admin邀请用户进入工作空间默认使用workspace-name-regular而非 admin邀请用户进入项目默认使用viewer而非 admin。仅在用户明确要求时才升级权限。这四条准则与后端源码的安全设计是一致的例如在 handler.go 中CreateUser仅允许预注册用户携带身份提供方附加信息且所有变更操作均会通过authorizer.Authorize做二次鉴权校验。三、核心概念三层租户与内置角色体系3.1 工作空间Workspace工作空间是 KubeSphere 中的顶层组织单元代表一个团队、部门或业务单元可包含多个项目是资源分组与访问控制的基本边界。工作空间可以横跨多个集群实现对分散在不同集群中资源的集中管理。其背后的核心资源类型是WorkspaceTemplate其类型定义位于 types.gotype WorkspaceTemplateSpec struct { Template Template json:template // 内含 metadata 与 spec.manager Placement GenericPlacement json:placement // 指定 clusters 列表或 clusterSelector } type Template struct { ObjectMeta json:metadata,omitempty // labels / annotations Spec WorkspaceSpec json:spec,omitempty // 含 Manager 字段 } type GenericPlacement struct { Clusters []GenericClusterReference json:clusters,omitempty ClusterSelector *metav1.LabelSelector json:clusterSelector,omitempty }其中spec.placement.clusters数组决定了该工作空间部署在哪些集群上——这正是工作空间可跨集群的底层实现。3.2 项目Project项目是 KubeSphere 对 Kubernetes 命名空间的增强封装代表工作空间内的某个具体应用、环境或工作负载。每个项目都会映射到一个独立的命名空间Namespace并通过kubesphere.io/workspace标签与所属工作空间建立关联。在 types.go 中定义了常量WorkspaceLabel kubesphere.io/workspace这正是项目创建时写入命名空间标签的依据。3.3 用户与角色User Role用户是 KubeSphere 的账号实体可以担任平台管理员也可以是工作空间成员或项目成员。角色则是一组权限的集合在 KubeSphere 的三层 RBAC 中分别定义项目角色roles.iam.kubesphere.io角色权限admin全部资源完全访问operator可创建/更新/删除资源但不可管理角色viewer只读访问工作空间角色workspaceroles.iam.kubesphere.io角色权限workspace-name-admin工作空间及全部项目的完全访问workspace-name-regular受限的工作空间访问workspace-name-self-provisioner可在工作空间内创建项目workspace-name-viewer工作空间只读访问平台角色globalroles.iam.kubesphere.io角色权限platform-admin全部资源完全访问platform-regular受限的平台访问platform-self-provisioner可创建工作空间角色绑定Role Binding通过 KubeSphere API 将角色绑定到用户项目级/namespacemembersAPI绑定roles.iam.kubesphere.io到用户工作空间级/workspacemembersAPI绑定workspaceroles.iam.kubesphere.io到用户平台级/users/usernameAPI通过 annotationiam.kubesphere.io/globalrole绑定globalroles.iam.kubesphere.io到用户。从后端实现看这些绑定分别由am.CreateOrUpdateNamespaceRoleBinding、am.CreateOrUpdateUserWorkspaceRoleBinding与am.CreateOrUpdateGlobalRoleBinding完成对应代码见 handler.go。四、环境准备配置认证并登录使用本技能需要先配置认证。仓库提供的 ks_api.py 是一个轻量级 KubeSphere API 封装工具支持GET/POST/PUT/PATCH/DELETE方法并内置令牌缓存与自动刷新机制。# 进入技能脚本目录将路径替换为你实际的 kubesphere-skills 位置 cd ~/kubesphere-skills/core/kubesphere-core/scripts # 安装依赖 pip install requests # 设置 API 端点可选默认 http://ks-apiserver.kubesphere-system export KUBESPHERE_HOSThttp://kubesphere-host # 登录获取 tokentoken 会被缓存 python ks_api.py --login --username admin --password your-password # token 缓存于 ~/.kubesphere_token 并自动刷新 # 可选清除缓存 token python ks_api.py --clear-cache从 ks_api.py 源码可以看到登录实际是向${KUBESPHERE_HOST}/oauth/token发送 OAuth2 密码模式请求grant_typepasswordclient_idkubesphere成功后从响应中提取access_token按expires_in默认 5 小时计算过期时间并写入~/.kubesphere_token。执行python ks_api.py不带参数可查看当前缓存的 token 摘要--token参数可显式指定 token 并优先于缓存。五、操作实战创建与查询资源5.1 创建工作空间必填参数workspace-name工作空间名称映射到metadata.namemanager工作空间管理员映射到spec.template.spec.manager默认取当前登录用户creator创建者名称映射到metadata.annotations[kubesphere.io/creator]clusters承载该工作空间的集群名列表映射到spec.placement.clusters。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} ] } } }执行前必须向用户确认工作空间名称必填、manager必填默认当前登录用户、clusters必填指定工作空间分配到哪些集群。该 API 由 tenant/v1beta1/register.go 中的POST /workspacetemplates路由承载实际处理函数为CreateWorkspaceTemplate读取的请求体类型正是tenantv1beta1.WorkspaceTemplate与上文类型定义完全对应。5.2 在工作空间内创建项目必填参数project-name项目名称映射到metadata.nameworkspace-name目标工作空间名称映射到metadata.labels[kubesphere.io/workspace]cluster-name目标集群名称映射到 URI 路径与cluster字段creator创建者名称映射到metadata.annotations[kubesphere.io/creator]。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 }执行前必须向用户确认项目名称必填、工作空间名称必填、集群名称必填。该请求对应 tenant/v1beta1/register.go 中的POST /workspaces/{workspace}/namespaces路由处理函数为CreateNamespace接收标准的corev1.Namespace对象——这也印证了项目即增强命名空间的设计。5.3 创建用户必填参数username新用户用户名email用户邮箱password用户密码必须符合 KubeSphere 密码策略。可选参数globalrole平台角色默认platform-regular。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 } }执行前必须向用户确认用户名必填、邮箱必填、平台角色未指定时默认platform-regular。从 handler.go 的CreateUser实现可以看到后端会读取请求体中的iam.kubesphere.io/globalroleannotation 校验该全局角色是否存在创建用户后调用CreateOrUpdateGlobalRoleBinding建立角色绑定并在响应前将spec.encryptedPassword清空确保加密密码不会回显到输出中。5.4 邀请用户进入工作空间 / 项目工作空间邀请参数username被邀请用户必填workspace-name目标工作空间必填role工作空间角色默认workspace-name-regular。项目邀请参数username被邀请用户必填project-name目标项目必填cluster-name集群名必填role项目角色默认viewer。# 邀请用户进入工作空间默认角色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}]执行前必须向用户确认被邀请用户名必填、目标工作空间或项目必填、角色未指定时工作空间默认workspace-name-regular项目默认viewer。注意这两类接口的请求体是成员数组支持批量邀请。后端对应实现为 handler.go 的CreateWorkspaceMembers与CreateNamespaceMembers它们遍历成员列表逐一调用绑定创建方法实际路由分别注册在 register.go 与 register.go。5.5 修改用户权限修改用户权限覆盖平台、工作空间、项目三个层级。平台角色全局角色username待修改用户必填globalrole新的平台角色必填注意必须先GET获取当前用户元数据再以更新后的 annotation 执行PUT。# 第 1 步获取当前用户信息修改前必做 python ks_api.py GET /kapis/iam.kubesphere.io/v1beta1/users/username # 第 2 步更新全局角色 annotation 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 } } }工作空间角色username待修改用户必填workspace-name目标工作空间必填roleRef新的工作空间角色必填。python ks_api.py PUT /kapis/iam.kubesphere.io/v1beta1/workspaces/workspace-name/workspacemembers/username {username:username,roleRef:workspace-name-role}项目角色username待修改用户必填project-name目标项目必填cluster-name集群名必填roleRef新的项目角色必填。python ks_api.py PUT /clusters/cluster-name/kapis/iam.kubesphere.io/v1beta1/namespaces/project-name/namespacemembers/username {username:username,roleRef:role}执行前必须向用户确认待修改用户名必填、作用域平台 / 工作空间 / 项目必填、新角色仅限 KubeSphere 内置角色。后端在处理这类更新时会做一致性校验例如UpdateWorkspaceMember会先校验路径中的用户名与请求体中的username一致再检查该成员确实存在于目标工作空间否则返回member not exist最后才调用CreateOrUpdateUserWorkspaceRoleBinding完成角色替换详见 handler.go。5.6 查询资源# 列出所有工作空间 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这些查询接口同样可以在源码中找到对应路由工作空间列表对应 tenant/v1beta1/register.go 的GET /workspacetemplates成员查询对应 iam/v1beta1/register.go 与 register.go。其中成员列表接口支持workspacerole、role查询参数按角色过滤实现上通过am.ListWorkspaceRoleBindings/am.ListRoleBindings检索角色绑定并把绑定角色写入用户对象的对应 annotation 后返回见 handler.go。六、错误处理与调试错误码原因解决方案401 Unauthorizedtoken 过期python ks_api.py --clear-cache python ks_api.py --login --username admin --password password403 Forbidden无权限使用 admin 账号409 Conflict资源已存在更换名称404 Not Found资源不存在核对名称 / 工作空间 / 集群是否正确400 Bad Request参数无效查看错误信息邮箱格式、密码策略、命名规则Connection refused / timeoutAPI 不可达检查KUBESPHERE_HOST是否正确调试技巧--quiet参数可输出更干净的结果python ks_api.py GET /users --quiet不带任何参数执行python ks_api.py可检查当前 token 状态。从 ks_api.py 的源码实现看工具会先将响应按 JSON 解析状态码大于等于 400 时把错误输出到 stderr 并退出--quiet模式则始终只输出格式化的 JSON 结果。七、验证与评估用例仓库为该技能提供了端到端评估用例evals.json覆盖了本文所述的全部操作路径可作为实操后的自检清单用例预期结果创建demo-workspace并分配到host集群manager 为 admin返回 201/200workspace 包含 namedemo-workspace、clusterhost在demo-workspace中创建demo-projecthost 集群返回 201/200namespace 包含 namedemo-project、labelkubesphere.io/workspacedemo-workspace创建用户developer01邮箱developer01example.com密码Demo123456返回 201/200用户包含 globalroleplatform-regular邀请developer01进入demo-workspace默认角色返回 201/200member 包含 roleRefdemo-workspace-regular邀请developer01进入demo-projectviewer 角色返回 201/200member 包含 roleRefviewer列出所有工作空间 / 所有用户 / 工作空间成员 / 项目成员 / 用户详情返回包含items数组的列表字段与创建时的参数一致八、相关技能与延伸阅读kubesphere-coreKubeSphere 核心平台架构kubesphere-cluster-management集群运维操作。如需深入了解多租户设计原理可继续阅读仓库内的 multi-tenancy-in-kubesphere.md其中详细阐述了 Kubernetes 多租户面临的逻辑/物理隔离挑战以及 KubeSphere 的分级隔离实现。【免费下载链接】kubesphereThe container platform tailored for Kubernetes multi-cloud, datacenter, and edge management ⎈ ☁️项目地址: https://gitcode.com/GitHub_Trending/ku/kubesphere创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考