多租户架构基础:多租户定义、租户隔离模型与资源配额管理

在云原生与 GitOps 实践中,多租户架构是支撑企业级平台复用、成本分摊与安全隔离的核心设计。本章从定义出发,逐步拆解租户隔离的三种模型,并给出资源配额管理的具体实现方法。

2.1 多租户定义

多租户(Multi-Tenancy)是指同一套 Kubernetes 集群或控制平面同时服务于多个独立业务单元(租户),每个租户在逻辑上拥有专属的工作负载、网络策略与资源视图,但共享底层基础设施。多租户的核心目标是:

  • 成本分摊:通过共享集群降低运维与资源开销。
  • 安全隔离:防止租户间越权访问或资源争抢。
  • 运维效率:统一升级、监控与 GitOps 同步策略。
关键区分:多租户 ≠ 多集群。多租户强调逻辑隔离,多集群强调物理隔离。在成本 GitOps 场景下,优先使用多租户共享集群以降低基础设施成本。

2.2 租户隔离模型

根据隔离粒度与安全等级,Kubernetes 多租户通常分为三种模型。下表对比了各模型的核心特征:

隔离模型 隔离粒度 共享范围 典型场景 安全等级
命名空间隔离 Kubernetes Namespace 同一集群、同一控制平面 开发/测试环境、内部微服务团队 中
集群隔离 独立 Kubernetes 集群 无共享 生产环境、金融合规、强安全要求 高
控制平面隔离 虚拟控制平面(vCluster / Kiosk) 共享数据平面,独立 API 视图 SaaS 平台、外部客户租户 高(逻辑隔离)

2.2.1 命名空间隔离(Namespace Isolation)

最轻量的隔离方式。每个租户分配一个或多个 Namespace,通过 RBAC、NetworkPolicy、ResourceQuota 实现访问与资源限制。优点是无额外控制平面开销,缺点是共享 API Server 与节点,存在一定的爆炸半径风险。

2.2.2 集群隔离(Cluster Isolation)

每个租户拥有独立的 Kubernetes 集群。隔离最彻底,但管理成本与资源碎片率最高。适用于对安全与合规有严格要求的场景,如金融核心交易、医疗数据。

2.2.3 控制平面隔离(Control Plane Isolation)

通过虚拟集群技术(如 vCluster、Kiosk、Virtual Kubelet)为每个租户提供独立的 API 控制平面,但共享底层节点与数据平面。租户看到的是完整 Kubernetes API,但实际资源调度在宿主集群上。这是成本与隔离之间的最佳平衡点,也是本课程后续同步波次编排的主要目标模型。

三种租户隔离模型对比 命名空间隔离 NS-A NS-B NS-C NS-D 共享 API Server 共享节点 集群隔离 集群-A 集群-B 集群-C 集群-D 独立 API Server 独立节点 控制平面隔离 vCluster-A vCluster-B vCluster-C vCluster-D 独立 API 视图 共享节点

2.3 租户资源配额管理

无论采用哪种隔离模型,资源配额都是防止租户“吵闹邻居”效应的关键手段。Kubernetes 原生提供 ResourceQuota 与 LimitRange 对象,在 GitOps 多租户场景下,配额管理需要与租户生命周期自动化绑定。

2.3.1 核心配额对象

资源类型 Kubernetes 对象 作用范围 示例
计算资源 ResourceQuota Namespace requests.cpu: "10"
存储资源 ResourceQuota Namespace requests.storage: "100Gi"
对象数量 ResourceQuota Namespace count/deployments: "20"
容器默认限制 LimitRange Namespace / Pod default: cpu: 500m

2.3.2 租户配额配置示例

以下是一个典型的租户 ResourceQuota 配置,适用于命名空间隔离模型:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: tenant-quota
  namespace: tenant-alpha
spec:
  hard:
    requests.cpu: "8"
    requests.memory: "16Gi"
    limits.cpu: "16"
    limits.memory: "32Gi"
    requests.storage: "50Gi"
    persistentvolumeclaims: "10"
    count/deployments: "15"
    count/services: "10"

2.3.3 配额管理最佳实践

  • 配额与租户绑定:在 GitOps 仓库中为每个租户目录维护独立的 quota.yaml,通过 ArgoCD ApplicationSet 或 Flux Kustomization 自动同步。
  • 预留与限制分离:requests 保证调度,limits 防止突发占用。建议 limits 为 requests 的 1.5~2 倍。
  • 对象数量限制:防止租户创建过多小对象导致 etcd 压力,尤其要限制 count/secrets 与 count/configmaps。
  • 动态调整:结合成本监控数据,定期调整配额。在同步波次编排中,可将配额更新作为波次前置检查。
常见陷阱:ResourceQuota 只限制 Namespace 级别的资源总和,无法限制单个 Pod 的突发行为。必须配合 LimitRange 设置默认的容器资源上下限,否则 Pod 可能因未设置 limits 而被拒绝调度。
租户资源配额管理流程 GitOps 仓库 (租户配额 YAML) ArgoCD / Flux (自动同步) K8s API Server (ResourceQuota) 租户 Namespace (配额生效) 配额超限告警

2.4 隔离模型选型建议

在实际项目中,选择哪种隔离模型取决于安全要求、运维成本与资源利用率的平衡。以下决策树可辅助判断:

  1. 租户是否互信?(如内部团队)→ 命名空间隔离 + 严格 RBAC。
  2. 租户是否需要独立 API 视图?(如外部客户)→ 控制平面隔离。
  3. 是否有合规审计要求?(如金融、医疗)→ 集群隔离。
  4. 成本敏感且租户数量大?(如 SaaS 平台)→ 控制平面隔离 + 资源配额。