4、多租户基础:Kubernetes多租户模型(Namespace、RBAC、NetworkPolicy)与Cluster API的映射关系
在构建多租户控制面架构时,Kubernetes 原生的多租户模型是隔离的基石。本章将深入剖析 Namespace、RBAC、NetworkPolicy 三大核心组件,并建立它们与 Cluster API 资源(Cluster、ClusterResourceSet、MachineDeployment)之间的精确映射关系。
4.1 Kubernetes 多租户三大支柱
Kubernetes 本身并未提供“租户”这一原生 API 对象,而是通过以下三种机制的组合来实现多租户隔离:
| 机制 | 作用域 | 核心功能 | 隔离层级 |
|---|---|---|---|
| Namespace | 集群内 | 资源命名空间隔离、资源配额(ResourceQuota)、对象分组 | 逻辑边界 |
| RBAC | 集群/命名空间 | 基于角色的访问控制(User/Group/ServiceAccount → Role → 权限) | 身份与权限 |
| NetworkPolicy | 命名空间/Pod | Pod 间网络流量控制(入站/出站规则、标签选择器、IP 段) | 网络边界 |
关键认知: 这三种机制是叠加而非互斥的。一个完整的租户隔离方案必须同时配置 Namespace 边界、RBAC 权限门禁和 NetworkPolicy 网络围栏,缺少任意一环都会导致隔离漏洞。
4.2 Namespace:租户的逻辑边界
在 Cluster API 驱动的控制面架构中,Namespace 的映射关系分为两个层面:
- 管理集群(Management Cluster)层面: 每个租户的工作负载集群(Workload Cluster)对应一个独立的 Namespace。该 Namespace 内包含该集群的所有 Cluster API 资源对象(Cluster、Machine、KubeadmControlPlane 等)。
- 工作负载集群(Workload Cluster)层面: 每个工作负载集群内部,租户的应用部署在各自的 Namespace 中,通过 ResourceQuota 和 LimitRange 进行资源限制。
映射关系示例: 租户 "alpha" 的工作负载集群 "cluster-alpha" 在管理集群的
tenant-alpha Namespace 中管理;而在 "cluster-alpha" 集群内部,租户的应用运行在 app-alpha Namespace 中。
4.3 RBAC:租户的权限门禁
RBAC 在 Cluster API 多租户架构中承担双重角色:
- 管理集群 RBAC: 控制租户管理员对自身 Cluster API 资源的操作权限(如创建/删除 MachineDeployment、读取 Cluster 状态)。
- 工作负载集群 RBAC: 通过 ClusterResourceSet 或直接在工作负载集群上配置 RBAC,控制租户内部用户的访问权限。
典型的 RBAC 映射关系如下表:
| 角色 | 管理集群权限 | 工作负载集群权限 | Cluster API 资源映射 |
|---|---|---|---|
| 租户管理员 | 对 tenant-* Namespace 下的 Cluster、MachineDeployment 具有读写权限 |
集群管理员(cluster-admin) | Cluster、MachineDeployment、KubeadmControlPlane |
| 租户开发者 | 无管理集群权限 | 对特定 Namespace 具有读写权限 | 通过 ClusterResourceSet 注入 RBAC 配置 |
| 平台运维 | 集群范围(Cluster-wide)的 Cluster API 资源只读权限 | 所有工作负载集群的只读权限 | Cluster、Machine、ClusterResourceSet |
4.4 NetworkPolicy:租户的网络围栏
NetworkPolicy 是实现租户网络隔离的关键。在 Cluster API 架构中,NetworkPolicy 的配置通过 ClusterResourceSet 机制自动注入到工作负载集群中。
重要前提: NetworkPolicy 需要 CNI 插件的支持(如 Calico、Cilium、Weave Net)。如果工作负载集群使用不支持的 CNI,NetworkPolicy 将不会生效。
典型的租户网络隔离策略包括:
- 默认拒绝所有入站流量: 防止跨租户的意外访问。
- 允许同 Namespace 内通信: 保障租户内部服务正常调用。
- 允许特定监控/日志系统的入站流量: 通过标签选择器开放必要的管理端口。
- 拒绝所有出站流量到其他租户的 Namespace: 防止数据泄露。
4.5 映射关系总览:Cluster API 资源 ↔ 多租户模型
下面的 SVG 图展示了 Cluster API 核心资源与 Kubernetes 多租户模型之间的完整映射关系:
4.6 实践映射:ClusterResourceSet 注入多租户配置
ClusterResourceSet 是 Cluster API 提供的配置注入机制,它允许平台团队在创建工作负载集群时,自动应用一组 Kubernetes 资源。对于多租户网络隔离,这是最关键的映射点。
以下是一个通过 ClusterResourceSet 注入 NetworkPolicy 和 RBAC 的示例:
apiVersion: addons.cluster.x-k8s.io/v1beta1
kind: ClusterResourceSet
metadata:
name: tenant-network-isolation
namespace: tenant-alpha
spec:
clusterSelector:
matchLabels:
tenant: alpha
resources:
- name: default-deny-ingress
kind: ConfigMap
- name: allow-same-namespace
kind: ConfigMap
- name: tenant-admin-rbac
kind: ConfigMap
strategy: ApplyOnce
---
apiVersion: v1
kind: ConfigMap
metadata:
name: default-deny-ingress
namespace: tenant-alpha
data:
policy.yaml: |
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-ingress
namespace: tenant-alpha-apps
spec:
podSelector: {}
policyTypes:
- Ingress
---
apiVersion: v1
kind: ConfigMap
metadata:
name: allow-same-namespace
namespace: tenant-alpha
data:
policy.yaml: |
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-same-namespace
namespace: tenant-alpha-apps
spec:
podSelector: {}
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: tenant-alpha-apps
policyTypes:
- Ingress
映射要点: ClusterResourceSet 的
clusterSelector 通过标签选择器将配置绑定到特定租户的集群。当 Cluster API 创建匹配标签的集群时,会自动应用这些 NetworkPolicy 和 RBAC 配置,实现租户网络的自动化隔离。
4.7 隔离模型对比:软隔离 vs 硬隔离
在 Cluster API 多租户架构中,需要根据安全需求选择隔离模型:
| 维度 | 软隔离(Namespace + RBAC + NetworkPolicy) | 硬隔离(独立集群) |
|---|---|---|
| 资源开销 | 低(共享控制面) | 高(每个租户独立控制面) |
| 安全边界 | 逻辑隔离(依赖配置正确性) | 物理隔离(独立 etcd、API Server) |
| 管理复杂度 | 中(需要精细的 RBAC 和 NetworkPolicy 管理) | 高(需要管理多个集群的生命周期) |
| Cluster API 映射 | 单个 Cluster 对象 + 多个 Namespace | 多个 Cluster 对象(每个租户一个) |
| 适用场景 | 开发/测试环境、信任度较高的租户 | 生产环境、高安全要求、合规场景 |
实践建议: 在 Cluster API 驱动的控制面架构中,推荐采用“混合隔离”策略:使用软隔离作为默认方案降低资源开销,对高安全需求的租户单独创建独立集群实现硬隔离。Cluster API 的声明式集群管理能力使得这种混合策略的运维成本可控。