3、多租户隔离模型概述:Cluster-scoped vs Namespace-scoped、RBAC、Projects 概念
在 Kubernetes 多租户环境中,Argo CD 的隔离模型决定了租户之间的资源边界与安全风险。本章从三个核心维度展开:资源作用域(Cluster-scoped vs Namespace-scoped)、访问控制(RBAC)以及逻辑分组(Projects)。理解这三者的关系,是设计安全多租户 Argo CD 架构的基础。
3.1 资源作用域:Cluster-scoped vs Namespace-scoped
Argo CD 管理的资源分为两类:集群作用域(Cluster-scoped)和命名空间作用域(Namespace-scoped)。两者的隔离能力与安全风险截然不同。
| 维度 | Cluster-scoped | Namespace-scoped |
|---|---|---|
| 资源类型 | ClusterRole、ClusterRoleBinding、CustomResourceDefinition(CRD)、Namespace、Node、PersistentVolume 等 | Pod、Service、ConfigMap、Secret、Deployment、Role、RoleBinding 等 |
| 隔离粒度 | 粗粒度,跨命名空间甚至跨集群 | 细粒度,限定在单个命名空间内 |
| 安全风险 | 高:一个租户的误操作可能影响整个集群 | 低:影响范围被限制在命名空间内 |
| Argo CD 管理方式 | 需要 cluster-admin 或特定 ClusterRole 权限 | 通过 namespace-scoped 的 Argo CD 实例或 RBAC 限制 |
| 典型场景 | 平台团队部署 CRD、集群级别的监控、日志采集 | 业务团队部署微服务、应用配置 |
最佳实践:在多租户架构中,应优先使用 Namespace-scoped 资源。仅当确实需要集群级能力(如安装 CRD)时,才由平台团队通过独立的 Cluster-scoped Argo CD 实例管理,并严格审计操作日志。
3.2 RBAC:基于角色的访问控制
Argo CD 的 RBAC 模型与 Kubernetes RBAC 紧密集成,但增加了 Argo CD 特有的角色概念。RBAC 决定了“谁”可以对“哪些资源”执行“什么操作”。
3.2.1 Argo CD RBAC 层级
- Kubernetes RBAC(底层):控制对 Argo CD 命名空间、ConfigMap、Secret 等资源的访问。例如,只有特定 ServiceAccount 可以读取 argocd-cm。
- Argo CD RBAC(应用层):通过
argocd-rbac-cmConfigMap 定义,控制对 Application、Project、Cluster 等 Argo CD 资源的操作权限。 - Projects RBAC(逻辑层):在 Project 级别进一步细化,控制哪些用户/组可以操作该 Project 下的 Application。
3.2.2 内置角色与自定义策略
| 角色 | 权限范围 | 典型用途 |
|---|---|---|
| role:admin | 完全管理权限,包括集群管理、Project 管理、用户管理 | 平台管理员 |
| role:readonly | 只读权限,可查看 Application、Project 状态 | 审计人员、只读用户 |
| 自定义角色 | 通过 policy.csv 定义细粒度权限,如 p, role:dev, applications, sync, */*, allow |
开发人员仅能同步特定 Project 的 Application |
RBAC 策略示例(argocd-rbac-cm):
data:
policy.csv: |
p, role:dev, applications, get, */*, allow
p, role:dev, applications, sync, project-a/*, allow
p, role:dev, applications, delete, *, deny
g, team-alpha, role:dev
上述策略允许 team-alpha 组的成员查看所有 Application,仅能同步 project-a 下的 Application,禁止删除任何 Application。
3.3 Projects:逻辑隔离单元
Argo CD Project 是核心的逻辑隔离边界。一个 Project 可以包含多个 Application,并定义这些 Application 可以部署到哪些目标集群和命名空间,以及允许使用哪些来源仓库。
3.3.1 Project 的核心约束
- 源仓库约束(sourceRepos):限制 Application 只能从指定的 Git 仓库拉取清单。
- 目标集群约束(destinations):限制 Application 只能部署到指定的集群和命名空间。
- 集群资源约束(clusterResourceWhitelist/Blacklist):控制是否允许创建集群作用域资源。
- 命名空间资源约束(namespaceResourceWhitelist/Blacklist):控制允许创建的命名空间资源类型。
3.3.2 多租户 Project 设计模式
| 模式 | 描述 | 适用场景 |
|---|---|---|
| 1 Project : 1 租户 | 每个租户拥有独立的 Project,完全隔离 | 强隔离需求,如金融、医疗 |
| 1 Project : N 租户 | 多个租户共享一个 Project,通过命名空间和 RBAC 区分 | 开发/测试环境,信任度较高的团队 |
| 分层 Project | 平台级 Project + 租户级 Project,平台 Project 管理共享基础设施 | 大型企业,需要平台团队统一管控 |
3.4 三种隔离维度的协同关系
Cluster-scoped vs Namespace-scoped 定义了资源边界,RBAC 定义了用户权限,Projects 定义了逻辑分组。三者协同工作,形成完整的隔离模型:
- 资源边界(Scope):决定隔离的物理范围——是整个集群还是单个命名空间。
- 访问控制(RBAC):决定谁可以操作这些资源——用户、组、角色。
- 逻辑分组(Projects):决定资源如何被组织和管理——源仓库、目标集群、资源类型约束。
常见误区:仅依赖 Projects 隔离是不够的。如果 RBAC 配置不当(例如将 admin 角色授予所有用户),或者允许创建 Cluster-scoped 资源,租户仍可能越权访问其他租户的数据。必须三层同时加固。
3.5 多租户隔离模型决策矩阵
| 场景 | 资源作用域 | RBAC 策略 | Project 设计 |
|---|---|---|---|
| 开发环境(低信任) | Namespace-scoped 为主 | 严格:每个租户仅能操作自己的命名空间 | 1 Project : 1 租户 |
| 测试环境(中信任) | Namespace-scoped | 中等:允许查看其他命名空间,但禁止修改 | 1 Project : N 租户 |
| 生产环境(高信任/平台管控) | Namespace-scoped + 受限 Cluster-scoped | 严格:仅平台团队有 Cluster-scoped 权限 | 分层 Project |
| 混合环境(多集群) | Namespace-scoped + 集群级 Project 约束 | 严格:每个集群独立 RBAC | 每个集群独立 Project 或跨集群 Project |
设计建议:从“最小权限”原则出发,先默认使用 Namespace-scoped + 1 Project : 1 租户模式,后续根据信任度和运维复杂度逐步放宽。始终在 argocd-rbac-cm 中记录所有自定义策略,并定期审计。