4. 蓝图定义:什么是租户隔离蓝图、蓝图的结构与YAML描述、蓝图的生命周期管理

在控制平面升级后的多租户集群中,租户隔离蓝图(Tenant Isolation Blueprint) 是定义租户网络边界、通信策略与资源配额的标准模板。它本质上是一份声明式 YAML 文档,由控制平面解析并下发给数据平面组件(如 CNI 插件、kube-proxy、Gateway API 控制器),确保每个租户的流量隔离、服务发现与出口控制行为一致且可审计。

4.1 什么是租户隔离蓝图

租户隔离蓝图是集群管理员预先定义的网络与安全策略模板,它抽象了以下核心能力:

  • 网络域划分:为每个租户分配独立的 VPC、子网或虚拟网络标识(如 VNI、VRF)。
  • 通信规则:定义租户内部 Pod 间、跨租户(需显式授权)、租户与外部服务的流量准入/拒绝规则。
  • 资源绑定:将租户的 Namespace、ServiceAccount、NetworkPolicy 与蓝图关联,实现自动注入。
  • 审计与监控:记录蓝图变更历史,并暴露租户级别的流量指标。
关键区别:租户隔离蓝图不同于普通的 NetworkPolicy。蓝图是模板层,定义“租户应该长什么样”;NetworkPolicy 是实例层,由蓝图自动生成并作用于具体 Namespace。

4.2 蓝图的结构与 YAML 描述

一个完整的租户隔离蓝图 YAML 包含四个主要部分:元数据、网络域、通信策略、资源配额。以下是一个标准示例:

apiVersion: isolation.blueprint.io/v1
kind: TenantIsolationBlueprint
metadata:
  name: tenant-blueprint-strict
  labels:
    tier: production
    compliance: pci-dss
spec:
  # 1. 网络域定义
  networkDomain:
    type: VXLAN
    vniRange: 100-200
    subnetCIDR: "10.100.0.0/16"
    gatewayMode: distributed

  # 2. 通信策略
  communicationPolicies:
    - name: deny-cross-tenant
      action: Deny
      direction: Ingress
      sourceSelector:
        matchLabels:
          tenant: other
    - name: allow-dns
      action: Allow
      direction: Egress
      destination:
        service: kube-dns
        namespace: kube-system
        port: 53

  # 3. 资源配额
  resourceQuotas:
    pods: 500
    services: 100
    networkPolicies: 50
    egressBandwidth: "100Mbps"

  # 4. 生命周期钩子
  lifecycle:
    onProvision:
      - createNamespace
      - applyDefaultNetworkPolicy
    onDeprovision:
      - deleteNamespace
      - cleanupNetworkResources

下表详细解释了每个字段的作用:

字段路径 类型 说明
spec.networkDomain.type string 底层网络隔离技术,可选 VXLAN / Geneve / VLAN / VRF
spec.networkDomain.vniRange string 租户可用的 VNI 范围,控制平面自动分配不重复的 VNI
spec.communicationPolicies[].action string Allow / Deny / Mirror,决定流量行为
spec.communicationPolicies[].direction string Ingress / Egress / Both
spec.resourceQuotas.pods int 租户最大 Pod 数,防止资源滥用
spec.lifecycle.onProvision []string 租户创建时自动执行的操作列表
升级兼容性注意:控制平面升级后,蓝图 API 版本可能从 v1beta1 升级到 v1。如果旧蓝图使用了废弃字段(如 spec.legacyVlanID),控制平面应自动转换或拒绝,避免租户网络配置丢失。

4.3 蓝图的生命周期管理

租户隔离蓝图从创建到销毁经历五个阶段,每个阶段都有明确的控制平面操作与验证点:

  1. 定义(Define):管理员编写 YAML 并提交到集群。控制平面校验语法、字段合法性(如 VNI 是否冲突、CIDR 是否重叠)。
  2. 审批(Approve):通过 RBAC 或策略引擎(如 OPA/Gatekeeper)检查蓝图是否符合全局安全基线。例如:禁止生产环境蓝图使用 DenyAll 策略。
  3. 部署(Provision):控制平面根据蓝图自动创建 Namespace、NetworkPolicy、VNI 分配、ServiceAccount 绑定。此阶段会触发 onProvision 钩子。
  4. 运行(Runtime):蓝图进入监控态。控制平面持续校验租户实际网络状态与蓝图期望是否一致。若发现漂移(如手动修改了 NetworkPolicy),触发告警或自动修复。
  5. 销毁(Deprovision):管理员删除蓝图或租户。控制平面执行 onDeprovision 钩子,清理 Namespace、释放 VNI、回收子网 CIDR。
租户隔离蓝图生命周期 1. 定义 2. 审批 3. 部署 4. 运行 5. 销毁 YAML 编写 语法校验 VNI 冲突检测 RBAC 检查 OPA 策略评估 安全基线对齐 创建 Namespace 分配 VNI 注入 NetworkPolicy 状态监控 漂移检测 自动修复 清理 Namespace 释放 VNI 回收 CIDR 漂移触发 → 重新定义/修复

4.4 蓝图版本与升级策略

控制平面升级后,蓝图可能面临 API 版本变更或字段废弃。下表总结了常见的升级场景及处理方式:

升级场景 影响范围 控制平面处理策略
API 版本从 v1beta1 升到 v1 所有蓝图 YAML 需更新 apiVersion 自动转换旧版本请求,返回警告;新蓝图强制使用 v1
废弃字段 spec.legacyVlanID 使用该字段的旧蓝图 控制平面拒绝提交,提示迁移到 spec.networkDomain.vniRange
新增必填字段 spec.lifecycle 所有新蓝图必须包含生命周期钩子 旧蓝图自动补全默认钩子(如 onProvision: [createNamespace])
通信策略语法变更 sourceSelector 改为 from 控制平面提供迁移工具,批量转换存量蓝图
升级风险提示:如果控制平面升级后未正确处理蓝图版本兼容性,可能导致租户网络策略失效、VNI 冲突或 Namespace 创建失败。建议在升级前对所有蓝图执行 dry-run 校验,并保留旧版本控制平面的回滚能力。

4.5 蓝图与租户实例的关系

一个蓝图可以实例化为多个租户,每个租户拥有独立的 Namespace 和 VNI。下图展示了蓝图到租户实例的映射关系:

蓝图 → 租户实例映射 租户隔离蓝图 tenant-blueprint-strict 租户 A ns: tenant-a 租户 B ns: tenant-b 租户 C ns: tenant-c 每个租户继承蓝图的通信策略与配额,但拥有独立的 VNI 和 Namespace

这种设计使得管理员只需维护少量蓝图模板,即可控制成百上千个租户的网络行为。控制平面升级后,蓝图本身的版本管理(通过 metadata.generation 和 metadata.resourceVersion)确保了每个租户实例都能平滑迁移到新策略。