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 蓝图的生命周期管理
租户隔离蓝图从创建到销毁经历五个阶段,每个阶段都有明确的控制平面操作与验证点:
- 定义(Define):管理员编写 YAML 并提交到集群。控制平面校验语法、字段合法性(如 VNI 是否冲突、CIDR 是否重叠)。
- 审批(Approve):通过 RBAC 或策略引擎(如 OPA/Gatekeeper)检查蓝图是否符合全局安全基线。例如:禁止生产环境蓝图使用
DenyAll策略。 - 部署(Provision):控制平面根据蓝图自动创建 Namespace、NetworkPolicy、VNI 分配、ServiceAccount 绑定。此阶段会触发
onProvision钩子。 - 运行(Runtime):蓝图进入监控态。控制平面持续校验租户实际网络状态与蓝图期望是否一致。若发现漂移(如手动修改了 NetworkPolicy),触发告警或自动修复。
- 销毁(Deprovision):管理员删除蓝图或租户。控制平面执行
onDeprovision钩子,清理 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。下图展示了蓝图到租户实例的映射关系:
这种设计使得管理员只需维护少量蓝图模板,即可控制成百上千个租户的网络行为。控制平面升级后,蓝图本身的版本管理(通过 metadata.generation 和 metadata.resourceVersion)确保了每个租户实例都能平滑迁移到新策略。