3. 集群蓝图总览:多租户集群的整体架构图、控制面与数据面分离、租户生命周期管理
本章是整门课程的架构总纲。我们将从全局视角出发,绘制多租户隔离集群的完整蓝图,明确控制面与数据面的职责边界,并梳理租户从创建到销毁的完整生命周期。理解这张蓝图,是后续所有分层设计与技术选型的基础。
3.1 多租户集群整体架构图
下图展示了多租户隔离集群的核心组件与交互关系。整个系统遵循“控制面-数据面”分离原则,租户仅能感知到属于自己的隔离资源。
架构要点:控制面统一管理所有租户的元数据与策略,数据面通过 Namespace、NetworkPolicy、ResourceQuota 实现租户间的硬隔离。多租户控制器是控制面的核心扩展组件,负责租户的创建、配额初始化与策略注入。
3.2 控制面与数据面分离
控制面与数据面的分离是多租户集群设计的基石。这种分离不仅带来了安全收益,也使得控制面的扩展与数据面的弹性伸缩可以独立进行。
| 维度 | 控制面 (Control Plane) | 数据面 (Data Plane) |
|---|---|---|
| 职责 | 租户管理、认证授权、配额校验、策略下发 | 运行用户工作负载、网络通信、存储挂载 |
| 安全要求 | 极高,需严格审计与 RBAC | 高,需 NetworkPolicy 与 Pod Security |
| 扩展性 | 垂直扩展为主,支持 HA | 水平扩展,Node 池可独立扩缩 |
| 租户可见性 | 不可见,仅平台管理员操作 | 可见,租户可查看自己的资源 |
| 故障影响 | 影响整个集群调度能力 | 仅影响该租户的工作负载 |
最佳实践:控制面组件应部署在独立的 Master 节点上,并开启 etcd 加密与审计日志。数据面节点应禁止非授权访问,且所有节点间的通信必须使用 TLS。
3.3 租户生命周期管理
租户的生命周期管理是平台自动化的核心。一个完整的租户生命周期包含以下五个阶段,每个阶段都有对应的自动化操作与校验点。
3.4 租户生命周期管理的关键操作清单
下表列出了每个生命周期阶段中,平台需要执行的具体操作与校验点,供架构设计与自动化脚本开发参考。
| 阶段 | 操作项 | 校验点 | 自动化程度 |
|---|---|---|---|
| 创建 | 提交租户申请、审批流程、分配租户 ID | 租户名称唯一性、配额模板有效性 | 全自动 / 半自动 |
| 初始化 | 创建 Namespace、ServiceAccount、ResourceQuota、LimitRange | Namespace 是否成功创建、Quota 是否生效 | 全自动 |
| 激活 | 绑定 RBAC、下发 NetworkPolicy、配置 Pod Security | RBAC 权限是否正确、NetworkPolicy 是否阻断跨租户流量 | 全自动 |
| 运行 | 资源监控、成本计量、审计日志、配额预警 | 资源使用率是否超过阈值、是否有异常操作 | 全自动 |
| 销毁 | 删除 Namespace、清理 etcd 元数据、通知计费系统 | Namespace 是否完全删除、残留资源是否清理 | 全自动(需确认) |
注意:租户销毁阶段必须设计“软删除”机制。建议先标记租户为“冻结”状态,保留数据 7-30 天,确认无数据恢复需求后再执行硬删除。直接删除 Namespace 可能导致 PVC 数据无法恢复。
3.5 多租户控制器核心逻辑
多租户控制器是控制面的核心扩展组件,它监听租户 CRD 的变化,并自动执行生命周期操作。以下是一个简化的控制器工作流程伪代码:
// 多租户控制器核心逻辑(伪代码)
func (c *MultiTenantController) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
tenant := &multitenancyv1.Tenant{}
if err := c.Get(ctx, req.NamespacedName, tenant); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
}
switch tenant.Status.Phase {
case "Pending":
// 1. 创建 Namespace
ns := buildNamespace(tenant)
if err := c.Create(ctx, ns); err != nil { return ctrl.Result{}, err }
// 2. 创建 ResourceQuota
rq := buildResourceQuota(tenant)
if err := c.Create(ctx, rq); err != nil { return ctrl.Result{}, err }
// 3. 更新状态为 "Initializing"
tenant.Status.Phase = "Initializing"
c.Status().Update(ctx, tenant)
case "Initializing":
// 4. 绑定 RBAC
roleBinding := buildRoleBinding(tenant)
if err := c.Create(ctx, roleBinding); err != nil { return ctrl.Result{}, err }
// 5. 下发 NetworkPolicy
netPol := buildDefaultNetworkPolicy(tenant)
if err := c.Create(ctx, netPol); err != nil { return ctrl.Result{}, err }
// 6. 更新状态为 "Active"
tenant.Status.Phase = "Active"
c.Status().Update(ctx, tenant)
case "Terminating":
// 7. 删除 Namespace(级联删除所有资源)
ns := &corev1.Namespace{ObjectMeta: metav1.ObjectMeta{Name: tenant.Spec.Namespace}}
if err := c.Delete(ctx, ns); err != nil { return ctrl.Result{}, err }
// 8. 更新状态为 "Deleted"
tenant.Status.Phase = "Deleted"
c.Status().Update(ctx, tenant)
}
return ctrl.Result{}, nil
}
设计建议:租户 CRD 应包含 Spec(租户名称、配额模板、管理员列表)和 Status(阶段、资源使用概览、错误信息)。控制器应使用 Finalizer 确保资源被正确清理,避免孤儿资源。