4. 多租户模型设计:租户(Tenant)定义、命名空间(Namespace)与租户映射、租户标签规范与资源配额

多租户模型是构建企业级 Kubernetes 平台的基础。在多租户签名链路网络隔离场景中,租户不仅是资源隔离的边界,更是网络策略签名与信任链的起点。本节将系统阐述租户的定义方式、命名空间与租户的映射关系、标签规范以及资源配额控制策略。

4.1 租户(Tenant)定义

在 Kubernetes 原生体系中,并不存在“租户”这一内置资源对象。因此,我们需要通过组合使用命名空间(Namespace)、标签(Label)、RBAC 以及资源配额(ResourceQuota)来抽象出租户的概念。一个租户通常包含以下核心属性:

属性 说明 示例值
租户 ID 全局唯一标识,用于签名链路中的主体识别 tenant-ai-platform
租户名称 可读性名称,用于运维与审计 AI 平台团队
租户类型 标识租户的隔离级别或业务属性 production / sandbox
签名公钥指纹 用于验证该租户下网络策略签名的公钥摘要 SHA256:abc123...
所属组织 上层组织架构归属 org-data
设计建议: 租户 ID 应使用小写字母、数字和连字符组成,避免使用下划线或特殊字符,以兼容 Kubernetes 标签值规范。建议将租户 ID 作为所有关联资源的公共标签值。

4.2 命名空间(Namespace)与租户映射

命名空间是 Kubernetes 中资源隔离的基本单位。在多租户模型中,一个租户可以拥有一个或多个命名空间。映射关系通常采用 1:N 模式,即一个租户对应多个命名空间,用于区分环境(如 dev、staging、prod)或业务模块。

映射策略分为以下三种常见模式:

  • 严格一对一映射: 每个租户仅拥有一个命名空间,管理简单,但缺乏环境隔离能力。
  • 标签驱动映射: 通过命名空间上的标签 tenant-id 来标识归属,一个租户可跨多个命名空间。
  • 层级命名映射: 命名空间名称包含租户前缀,例如 tenant-ai-platform-prod,通过命名规则实现映射。

在签名链路网络隔离场景中,推荐使用 标签驱动映射,因为它能够与网络策略的标签选择器无缝集成,且不依赖命名空间名称的解析。

映射示例: 租户 tenant-ai-platform 拥有三个命名空间,分别对应开发、预发布和生产环境。
apiVersion: v1
kind: Namespace
metadata:
  name: ai-platform-dev
  labels:
    tenant-id: tenant-ai-platform
    environment: dev
---
apiVersion: v1
kind: Namespace
metadata:
  name: ai-platform-staging
  labels:
    tenant-id: tenant-ai-platform
    environment: staging
---
apiVersion: v1
kind: Namespace
metadata:
  name: ai-platform-prod
  labels:
    tenant-id: tenant-ai-platform
    environment: production

4.3 租户标签规范

统一的标签规范是实现自动化策略签名、审计与隔离的关键。我们定义以下强制标签体系,所有与租户相关的资源(命名空间、Pod、Service、NetworkPolicy)均需携带:

标签键 标签值规范 作用范围 说明
tenant-id 小写字母、数字、连字符,最长 63 字符 命名空间、Pod、Service、NetworkPolicy 标识资源所属租户,签名链路中的主体标识
tenant-tier production / staging / development / sandbox 命名空间、Pod 标识环境层级,用于网络策略的层级隔离
tenant-org 组织编码,如 org-data、org-infra 命名空间 用于跨租户的审计与资源统计
policy-signature 签名指纹,由策略控制器自动注入 NetworkPolicy 存储签名信息,用于验证策略的合法性与完整性
注意: 标签 tenant-id 是签名链路的核心标识。任何网络策略在签名时,必须校验其 tenant-id 标签与签名者身份是否一致。禁止跨租户的 Pod 通过标签选择器直接访问,除非显式声明了跨租户策略并经过二次签名。

4.4 资源配额(ResourceQuota)与租户边界

资源配额是防止单个租户过度消耗集群资源的关键机制。每个租户的命名空间应绑定独立的 ResourceQuota 对象,确保租户间的资源公平性。

以下是为租户 tenant-ai-platform 的生产命名空间配置的资源配额示例:

apiVersion: v1
kind: ResourceQuota
metadata:
  name: quota-ai-platform-prod
  namespace: ai-platform-prod
  labels:
    tenant-id: tenant-ai-platform
    environment: production
spec:
  hard:
    requests.cpu: "40"
    requests.memory: "80Gi"
    limits.cpu: "80"
    limits.memory: "160Gi"
    persistentvolumeclaims: "10"
    pods: "50"
    services: "20"
    configmaps: "30"
    secrets: "30"

除了 ResourceQuota,还可以结合 LimitRange 设置每个 Pod 或容器的默认资源请求与限制,防止单个 Pod 异常占用。

最佳实践: 在租户创建流程中,使用自动化工具(如 Operator 或 GitOps 流水线)同时生成命名空间、ResourceQuota、LimitRange 以及初始的 RBAC 绑定。确保租户上线时即具备完整的资源边界。

4.5 多租户模型架构总览

下图展示了租户、命名空间、标签与资源配额之间的整体关系:

多租户模型架构总览 租户定义 tenant-id: tenant-ai 类型: production 命名空间组 ai-platform-dev ai-platform-staging ai-platform-prod 标签规范 tenant-id / tenant-tier tenant-org / policy-signature 资源配额 ResourceQuota LimitRange 关键映射关系说明 1. 一个租户可以拥有多个命名空间(1:N 映射),通过标签 tenant-id 关联。 2. 每个命名空间必须携带 tenant-id 和 tenant-tier 标签,用于网络策略选择器。 3. 每个命名空间绑定独立的 ResourceQuota,确保租户资源隔离。 4. 网络策略签名时,校验策略的 tenant-id 标签与签名者身份是否一致。 5. 跨租户访问必须通过显式的签名策略声明,并经过二次签名审批。 6. 标签规范由平台团队统一制定,所有租户上线前必须完成标签合规检查。

4.6 租户生命周期与配额管理流程

为了保障多租户模型的可持续运维,建议建立标准化的租户生命周期管理流程。下图展示了从租户申请到配额回收的完整步骤:

租户生命周期与配额管理流程 1. 租户申请 提交租户信息 2. 审批与签名 生成签名密钥对 3. 资源创建 Namespace + Quota 4. 标签注入 自动打标与校验 5. 策略部署 签名网络策略 6. 运行监控 配额使用审计 7. 配额调整 动态扩缩容 8. 租户回收 资源清理与归档 持续运营与审计循环 流程自动化建议:步骤 1-4 可通过 GitOps 流水线或自定义 Operator 实现全自动化,步骤 5-7 需结合策略控制器与监控系统联动。 步骤 8 的租户回收必须确保所有签名策略已解除,且数据已完成备份或迁移。

4.7 租户隔离的边界条件

在多租户签名链路网络隔离中,除了资源配额,还需要关注以下隔离边界:

  • 网络隔离边界: 默认禁止跨租户 Pod 通信,除非存在显式的、经过签名的 NetworkPolicy 允许规则。
  • RBAC 隔离边界: 租户管理员只能管理本租户命名空间内的资源,不能查看或修改其他租户的策略。
  • 签名密钥隔离: 每个租户拥有独立的签名密钥对,密钥的私钥部分仅由该租户的授权管理员持有。
  • 审计日志隔离: 审计系统应支持按 tenant-id 标签过滤日志,确保租户只能查询到本租户的操作记录。
核心原则: 租户隔离的最终目标是实现“租户 A 无法感知租户 B 的存在”,包括网络、存储、策略与审计四个维度。签名链路在此基础上增加了“策略可信”的保障。