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 多租户架构中承担双重角色:

  1. 管理集群 RBAC: 控制租户管理员对自身 Cluster API 资源的操作权限(如创建/删除 MachineDeployment、读取 Cluster 状态)。
  2. 工作负载集群 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 多租户模型之间的完整映射关系:

Cluster API 资源 ↔ 多租户模型映射关系 Cluster API 资源层 Cluster MachineDeployment KubeadmControlPlane ClusterResourceSet Machine MachineHealthCheck 多租户模型层 Namespace(管理集群) RBAC(管理集群) Namespace(工作负载集群) NetworkPolicy RBAC(工作负载集群) ResourceQuota 映射说明 • Cluster → 管理集群 Namespace • MachineDeployment → RBAC 权限控制 • ClusterResourceSet → NetworkPolicy 注入

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 的声明式集群管理能力使得这种混合策略的运维成本可控。