4、Cilium数据平面:eBPF数据路径、网络策略执行、负载均衡、安全身份标识

Cilium 的数据平面完全构建在 eBPF(extended Berkeley Packet Filter)之上,绕过了传统的 iptables 和内核网络栈的复杂路径。本章深入解析 Cilium 数据平面的四大核心机制:eBPF 数据路径、网络策略执行、负载均衡以及安全身份标识(Security Identity)。理解这些机制是掌握 Cilium 通信原理和进行接口测试设计的基础。

4.1 eBPF 数据路径:从 Pod 到网络的加速通道

Cilium 通过 eBPF 程序直接挂载到网络设备(如 veth、eth0)和内核钩子点(如 XDP、TC、cgroup),实现数据包的快速转发与处理。相比 iptables,eBPF 数据路径具有更低的延迟和更高的吞吐量。

核心优势: eBPF 数据路径将网络策略、负载均衡和封装/解封装逻辑编译为字节码,在内核中即时执行,避免了用户态与内核态之间的频繁上下文切换。

下图展示了 Cilium 中一个数据包从源 Pod 到目标 Pod 的 eBPF 数据路径概览:

Cilium eBPF 数据路径概览 Cilium eBPF 数据路径概览 源 Pod (App A) veth (bpf_redirect) eth0 (XDP/TC) 网络 (VXLAN/ Geneve) eth0 (XDP/TC) veth (bpf_redirect) 目标 Pod (App B) P P 说明: • 数据包在源节点经过 veth 的 bpf_redirect 和 eth0 的 XDP/TC 钩子。 • 红色“P”点表示 eBPF 程序在此执行网络策略检查和负载均衡决策。 • 封装/解封装(VXLAN/Geneve)由 eBPF 在内核中完成,无需用户态代理。

4.2 网络策略执行:基于 eBPF 的 L3/L4/L7 过滤

Cilium 的网络策略(NetworkPolicy)不再依赖 iptables 规则链,而是通过 eBPF 的 BPF_PROG_TYPE_SCHED_CLS 或 BPF_PROG_TYPE_XDP 程序直接在内核网络栈中执行。策略规则被编译为 eBPF 映射(Map),查找效率极高。

策略层级 eBPF 实现方式 性能特征
L3/L4 策略 基于 IP 地址、端口、协议在 eBPF Map 中查找,决定允许/丢弃 O(1) 哈希查找,纳秒级延迟
L7 HTTP/gRPC 策略 eBPF 程序解析应用层协议头(如 HTTP Method、Path),匹配规则 微秒级解析,支持正则匹配
DNS 策略 eBPF 程序拦截 DNS 请求,基于域名进行访问控制 避免 DNS 重绑定攻击,低开销
接口测试要点: 测试 L7 策略时,需构造包含特定 HTTP 方法(GET/POST)和路径的请求,验证 eBPF 程序是否正确解析并执行允许/拒绝动作。建议使用 curl 或 grpcurl 工具,并配合 cilium monitor 观察策略命中日志。

4.3 负载均衡:eBPF 实现的 Maglev 一致性哈希

Cilium 使用 eBPF 实现高性能的负载均衡,替代了传统的 kube-proxy 和 iptables。其核心是基于 Maglev 一致性哈希算法的后端选择器,所有逻辑都在内核 eBPF 程序中完成。

  • Maglev 哈希表: 在 eBPF Map 中预计算一个大小为 65537 的查找表,将源 IP/端口哈希到具体的后端 Pod。
  • DSR(Direct Server Return): 支持直接服务器返回模式,回程流量绕过负载均衡节点,直接返回客户端,减少路径跳数。
  • 会话保持: 通过 eBPF Map 记录会话状态,确保同一客户端的请求始终转发到同一后端。
Cilium eBPF 负载均衡流程 Cilium eBPF 负载均衡流程 客户端 Service IP:80 eBPF 负载均衡器 Maglev 哈希表 DSR 模式 Pod A (10.1.1.1) Pod B (10.1.1.2) Pod C (10.1.1.3)
避坑指南: 测试负载均衡时,注意 Cilium 的 Maglev 哈希表在集群规模变化(Pod 扩缩容)时会重新计算,可能导致少量连接中断。建议在接口测试中验证会话保持功能,确保长连接在扩缩容后仍能正确路由。

4.4 安全身份标识:基于 Label 的 Security Identity

Cilium 不使用传统的 Kubernetes NetworkPolicy 中的 IP 地址作为身份标识,而是引入 Security Identity(安全身份标识)。每个 Pod 或端点根据其 Kubernetes Label 被分配一个 24 位的数字标识(Numeric Identity),该标识在 eBPF Map 中与策略规则关联。

  • 标识生成: Cilium Agent 通过 cilium identity 命令或 API 为 Label 组合生成唯一 ID。例如,app=frontend,env=prod 可能对应 ID 1678。
  • 标识传递: 数据包在源节点被 eBPF 程序打上 Security Identity 标记(通过 skb->mark 或 cilium_capture 元数据),目标节点根据该标识执行策略。
  • 优势: 避免 IP 地址变化带来的策略失效问题,实现基于身份的零信任网络。
概念 传统 iptables 方式 Cilium eBPF 方式
身份标识 源/目标 IP 地址 Security Identity(数字 ID)
策略查找 遍历 iptables 规则链 eBPF Map 哈希查找
IP 变化影响 策略需重新匹配,可能中断 身份 ID 不变,策略持续生效
性能 随规则数线性下降 O(1) 常数级,规则数无影响
接口测试设计: 测试安全身份标识时,可修改 Pod 的 Label 并观察 Security Identity 是否更新。使用 cilium identity list 查看当前标识,通过 cilium monitor --type policy-verdict 验证策略决策是否基于正确的身份 ID。

4.5 数据平面关键组件总结

下表汇总了 Cilium 数据平面各核心组件及其在 eBPF 中的实现角色:

组件 eBPF 程序类型 主要功能 相关 Map
数据路径 BPF_PROG_TYPE_SCHED_CLS / XDP 数据包转发、封装/解封装 cilium_lxc, cilium_ipcache
网络策略 BPF_PROG_TYPE_SCHED_CLS L3/L4/L7 策略执行 cilium_policy, cilium_ct4
负载均衡 BPF_PROG_TYPE_SCHED_CLS Maglev 哈希、DSR、会话保持 cilium_lb4, cilium_lb6
安全身份标识 BPF_PROG_TYPE_SCHED_CLS 身份标记、基于 ID 的策略查找 cilium_identity, cilium_ipcache