4. 租户边界定义:Namespace隔离、RBAC绑定、ResourceQuota、NetworkPolicy在快照中的边界标记

在多集群拓扑中,租户边界是保障安全与资源公平性的第一道防线。KubeConfig 快照不仅要记录集群连接信息,还必须将 Namespace 隔离、RBAC 绑定、ResourceQuota 和 NetworkPolicy 这四层边界标记为可回退的“租户契约”。本章将逐一拆解每层边界的快照标记方法,并给出完整的边界标记结构。

4.1 四层租户边界模型

租户边界从下到上分为四个层次,每一层解决不同的隔离与管控问题:

层次 边界类型 快照标记字段 回退验证要点
L1 Namespace 隔离 tenant.namespace Namespace 是否存在、标签是否匹配
L2 RBAC 绑定 tenant.rbac.roleRef + subjects Role/ClusterRole 权限范围、Subject 身份
L3 ResourceQuota tenant.quota 配额数值、作用域、是否超限
L4 NetworkPolicy tenant.networkPolicy 入站/出站规则、PodSelector 匹配
关键原则:快照中的租户边界标记必须采用“四层全量 + 差异增量”策略——首次快照记录完整边界,后续快照仅记录与基线不同的增量,减少存储开销并提升回退速度。

4.2 Namespace 隔离:快照中的第一道门

Namespace 是 Kubernetes 中最基础的租户隔离单元。在快照中,我们使用 tenant.namespace 字段记录以下信息:

  • Namespace 名称:直接对应集群中的 Namespace 资源名。
  • 标签集:用于标识租户归属,例如 tenant: alpha、environment: staging。
  • 注解:可选,记录租户描述、联系人、创建时间等元数据。
# 快照片段:Namespace 边界标记
tenant:
  namespace:
    name: "team-alpha"
    labels:
      tenant: "alpha"
      environment: "staging"
    annotations:
      description: "Alpha team production namespace"
回退演练提示:当回退 Namespace 时,快照工具应自动检查目标集群是否已存在同名 Namespace。若存在,则对比标签与注解是否一致;若不一致,需弹出警告并允许用户选择“覆盖”或“跳过”。

4.3 RBAC 绑定:权限边界的快照标记

RBAC 绑定决定了租户在 Namespace 内能执行的操作。快照中需要记录 RoleRef(角色引用)和 Subjects(主体列表)两个核心部分:

字段 说明 示例值
roleRef.kind 角色类型:Role 或 ClusterRole Role
roleRef.name 角色名称 namespace-admin
subjects[].kind 主体类型:User、Group、ServiceAccount ServiceAccount
subjects[].name 主体名称 alpha-sa
subjects[].namespace 主体所在 Namespace(仅 ServiceAccount 需要) team-alpha
# 快照片段:RBAC 边界标记
tenant:
  rbac:
    roleRef:
      kind: "Role"
      name: "namespace-admin"
    subjects:
      - kind: "ServiceAccount"
        name: "alpha-sa"
        namespace: "team-alpha"
      - kind: "User"
        name: "alice@example.com"
常见陷阱:ClusterRole 绑定(ClusterRoleBinding)是集群范围的,快照中必须显式标记 scope: cluster,否则回退时可能误将集群角色绑定到 Namespace 级别,导致权限泄露。

4.4 ResourceQuota:资源边界的快照标记

ResourceQuota 限制了租户在 Namespace 内可消耗的 CPU、内存、存储等资源总量。快照标记需要包含:

  • 配额硬限制(hard):资源上限,如 cpu: "10"、memory: 20Gi。
  • 作用域(scopes):可选,限制配额生效范围,如 BestEffort、NotTerminating。
  • 当前使用量(status.used):快照时刻的实际使用量,用于回退时判断是否超限。
# 快照片段:ResourceQuota 边界标记
tenant:
  quota:
    name: "alpha-quota"
    hard:
      cpu: "10"
      memory: "20Gi"
      persistentvolumeclaims: "5"
    scopes:
      - "NotTerminating"
    status:
      used:
        cpu: "6.5"
        memory: "12Gi"
        persistentvolumeclaims: "3"
回退策略:若回退时目标集群的当前使用量已超过快照中的配额硬限制,快照工具应自动拒绝回退并提示“资源超限,请扩容或清理后重试”。这是防止回退导致 Pod 驱逐的关键保护。

4.5 NetworkPolicy:网络边界的快照标记

NetworkPolicy 定义了 Pod 级别的网络访问规则。快照中需要记录 入站(ingress) 和 出站(egress) 规则,以及 PodSelector 和 策略类型:

字段 说明 示例值
podSelector 匹配目标 Pod 的标签选择器 app: frontend
policyTypes 策略类型:Ingress、Egress 或两者 ["Ingress", "Egress"]
ingress[].from 入站来源:ipBlock、namespaceSelector、podSelector namespaceSelector: { matchLabels: { tenant: alpha } }
egress[].to 出站目标:同上 ipBlock: { cidr: 10.0.0.0/8 }
# 快照片段:NetworkPolicy 边界标记
tenant:
  networkPolicy:
    - name: "alpha-ingress"
      podSelector:
        matchLabels:
          app: "frontend"
      policyTypes:
        - "Ingress"
      ingress:
        - from:
            - namespaceSelector:
                matchLabels:
                  tenant: "alpha"
          ports:
            - port: 8080
              protocol: "TCP"
    - name: "alpha-egress"
      podSelector:
        matchLabels:
          app: "backend"
      policyTypes:
        - "Egress"
      egress:
        - to:
            - ipBlock:
                cidr: "10.0.0.0/8"
                except:
                  - "10.96.0.0/12"

4.6 四层边界标记的完整快照结构

以下 SVG 图展示了四层租户边界在快照中的完整标记结构,以及各层之间的依赖关系:

租户边界快照标记结构(四层模型) L1: Namespace L2: RBAC 绑定 L3: ResourceQuota L4: NetworkPolicy 快照标记字段 • tenant.namespace • tenant.rbac.roleRef • tenant.rbac.subjects • tenant.quota.hard • tenant.quota.status.used • tenant.networkPolicy[].podSelector • tenant.networkPolicy[].ingress • tenant.networkPolicy[].egress • tenant.networkPolicy[].policyTypes 回退验证要点 ✓ Namespace 是否存在 ✓ 标签是否匹配 ✓ 角色权限范围 ✓ 配额是否超限 ✓ 作用域是否一致 ✓ PodSelector 匹配 ✓ 入站/出站规则 ✓ 策略类型完整性 ✓ 端口与协议 依赖关系:L1 → L2 → L3 → L4,下层边界是上层边界的前提条件 💡 快照回退时按 L4 → L3 → L2 → L1 逆序执行,避免资源残留

4.7 边界标记的版本化与差异快照

在实际多集群场景中,租户边界会频繁调整。快照工具应支持 版本化标记,每次变更生成一个增量快照:

# 快照版本化示例
snapshot:
  version: "v2025-04-01-001"
  baseVersion: "v2025-03-15-001"
  tenant:
    namespace:
      labels:
        +: { "cost-center": "cc-123" }   # 新增标签
        -: ["environment"]                # 删除标签
    quota:
      hard:
        cpu: "12"                         # 从 10 改为 12
最佳实践:建议将租户边界快照存储在 Git 仓库中,每次变更触发 CI/CD 流水线自动验证边界一致性。回退时直接从 Git 历史中检出目标版本,实现“声明式回退”。

4.8 本章小结

租户边界定义是 KubeConfig 快照的核心能力之一。通过将 Namespace 隔离、RBAC 绑定、ResourceQuota 和 NetworkPolicy 四层边界标记为结构化快照字段,我们实现了:

  • 可审计:每次边界变更都有完整记录。
  • 可回退:支持按版本逆序恢复边界状态。
  • 可验证:回退前自动检查资源冲突与权限泄露。
  • 可增量:仅存储差异,降低快照存储成本。