4. 控制平面分层模型总览:三层架构(编排层、策略层、执行层)及其职责划分

在 eBPF 租户隔离蓝图中,控制平面采用严格的三层分层模型:编排层(Orchestration Layer)、策略层(Policy Layer) 与 执行层(Execution Layer)。每一层只关注自身职责范围内的抽象与决策,通过定义良好的通信接口向下或向上传递信息,从而将“租户隔离需求”从高层业务意图逐级转化为底层 eBPF 程序中的具体规则。

设计原则:分层隔离的核心在于“职责单一”与“接口契约化”。编排层不关心 eBPF 映射的具体结构,策略层不关心租户身份认证的细节,执行层不关心策略的编排顺序。这种解耦使得每一层都可以独立演进、测试与替换。

4.1 三层架构职责总览

下表从核心职责、输入/输出、典型组件三个维度对比三层架构的差异:

层级 核心职责 输入 → 输出 典型组件
编排层 租户生命周期管理、全局拓扑感知、策略编排与下发调度 租户创建/删除请求 → 租户标识与全局策略绑定 Kubernetes Operator、租户管理 API、全局拓扑服务
策略层 租户隔离策略定义、策略冲突检测、策略到 eBPF 映射的转换 租户隔离需求 → 可执行的 eBPF 映射键值规则 策略引擎、冲突检测器、映射生成器
执行层 eBPF 程序加载与挂载、映射读写、运行时审计与事件上报 映射规则 → 内核态数据包/系统调用过滤结果 eBPF Loader、Map Manager、事件采集器

4.2 三层架构分层示意图

下图展示了控制平面三层架构的纵向分层关系以及层间通信的简要路径:

控制平面三层架构分层示意图 编排层(Orchestration Layer) 租户生命周期管理 · 全局拓扑感知 · 策略编排调度 典型组件:Kubernetes Operator · 租户管理 API · 全局拓扑服务 输出:租户标识 + 全局策略绑定 策略下发 策略层(Policy Layer) 隔离策略定义 · 冲突检测 · 策略到 eBPF 映射转换 典型组件:策略引擎 · 冲突检测器 · 映射生成器 输出:可执行的 eBPF 映射键值规则 规则加载 执行层(Execution Layer) eBPF 程序加载与挂载 · 映射读写 · 运行时审计 典型组件:eBPF Loader · Map Manager · 事件采集器 输出:内核态数据包/系统调用过滤结果 层间通信通过 gRPC / 共享内存 / eBPF Map 传递

4.3 编排层:租户隔离的“大脑”

编排层是整个控制平面的入口与调度中心,负责将上层业务意图转化为可执行的隔离策略需求。其核心职责包括:

  • 租户生命周期管理:处理租户的创建、更新、删除请求,为每个租户分配全局唯一的租户 ID(Tenant ID),并维护租户与命名空间、集群资源的映射关系。
  • 全局拓扑感知:通过监听 Kubernetes API Server 或自定义资源(CRD),实时感知集群节点、Pod、Service 的拓扑变化,确保隔离策略始终与当前基础设施状态一致。
  • 策略编排与下发:将租户隔离需求(如“租户 A 与租户 B 之间禁止通信”)编排为策略层可理解的策略描述,并通过层间接口下发。
关键设计点:编排层不直接操作 eBPF 映射或程序。它只负责“做什么”(What),而不关心“怎么做”(How)。这种抽象使得编排层可以独立于底层 eBPF 实现进行单元测试。

4.4 策略层:隔离规则的“翻译官”

策略层是三层架构中的核心转换枢纽,负责将编排层下发的抽象策略描述转换为执行层能够加载的具体 eBPF 映射规则。其核心职责包括:

  • 隔离策略定义与解析:支持多种策略模型,如基于 CIDR 的网络隔离、基于 Label 的租户隔离、基于系统调用号的资源隔离。策略层将策略描述解析为内部策略对象。
  • 冲突检测与策略合并:当多个策略作用于同一租户或同一资源时,策略层需要检测规则冲突(如允许与拒绝规则重叠),并根据优先级或显式策略合并算法生成最终规则集。
  • 映射规则生成:将最终规则集转换为 eBPF 映射(Map)的键值对格式,例如将“租户 A 禁止访问租户 B 的 80 端口”转换为 tc 程序中的黑名单映射条目。
// 策略层生成的 eBPF 映射规则示例(伪代码)
struct tenant_rule {
    __u32 src_tenant_id;
    __u32 dst_tenant_id;
    __u16 dst_port;
    __u8  action; // 0: 允许, 1: 拒绝
};

// 写入 eBPF Map
bpf_map_update_elem(&tenant_policy_map, &key, &rule, BPF_ANY);

4.5 执行层:内核态的“守门员”

执行层是三层架构中最接近内核的一层,直接负责 eBPF 程序的加载、挂载、映射管理以及运行时事件采集。其核心职责包括:

  • eBPF 程序加载与挂载:将预编译的 eBPF 程序(如 tc、XDP、kprobe 程序)加载到内核,并挂载到正确的 hook 点(如网络接口、系统调用入口)。
  • 映射读写与管理:接收策略层下发的映射规则,通过 bpf_map_update_elem 写入 eBPF Map;同时负责映射的清理与版本管理。
  • 运行时审计与事件上报:采集 eBPF 程序执行过程中产生的审计事件(如拒绝的访问请求、异常系统调用),通过 perf_event 或 ring buffer 上报给用户态监控组件。
注意:执行层必须处理 eBPF 程序的热更新问题。当策略发生变化时,执行层需要在不中断现有流量或进程的情况下,原子性地替换 eBPF 程序或更新映射内容。通常采用 BPF_PROG_TYPE_EXT 或映射版本号机制实现。

4.6 三层通信机制概览

三层之间的通信遵循严格的单向依赖原则:编排层 → 策略层 → 执行层。反向通信(如执行层上报审计事件)通过独立的异步通道实现。下表总结了层间通信的主要机制:

通信方向 通信协议/机制 数据内容 实时性要求
编排层 → 策略层 gRPC(双向流) 策略描述(Protobuf 序列化) 秒级(策略变更触发)
策略层 → 执行层 Unix Domain Socket / gRPC eBPF 映射键值规则 毫秒级(规则生效)
执行层 → 编排层(审计) Ring Buffer / Kafka 审计事件、拒绝日志、指标 秒级(异步上报)