3. eBPF 基础与 Cilium:eBPF 程序类型、Map 机制、Cilium 如何利用 eBPF 实现网络与安全策略
3.1 eBPF 技术基石:从沙箱到内核可编程
eBPF(extended Berkeley Packet Filter)是一项革命性的内核技术,它允许用户在 Linux 内核中安全、高效地运行沙箱化程序,而无需修改内核源代码或加载内核模块。Cilium 正是基于 eBPF 构建其网络、可观测性与安全能力。
核心价值: eBPF 将内核从“固定功能”转变为“可编程平台”,使得 Cilium 能够以极低的开销实现细粒度的网络策略与安全观测。
3.2 eBPF 程序类型:挂载点决定能力
eBPF 程序必须挂载到特定的内核事件(挂载点)上才能执行。不同的程序类型决定了其能访问的数据和能实现的功能。Cilium 主要依赖以下几种核心类型:
| eBPF 程序类型 | 挂载点 / 触发时机 | Cilium 中的核心用途 |
|---|---|---|
| XDP (eXpress Data Path) | 网卡驱动层,最早的数据包处理点 | 高性能数据包过滤、DDoS 缓解、负载均衡(DSR) |
| TC (Traffic Control) Ingress/Egress | 内核协议栈的入口/出口 | L3/L4 网络策略执行、封装/解封装(VXLAN/Geneve)、带宽管理 |
| Socket Filter | Socket 操作(bind, connect, sendmsg) | 进程级网络策略、Socket 级别的可观测性 |
| Kprobe / Uprobe | 内核/用户态函数的动态插桩 | 深度可观测性、跟踪系统调用、排查性能瓶颈 |
| Tracepoint | 内核预定义的静态跟踪点 | 稳定的内核事件监控(如 skb 分配、TCP 状态变更) |
| cgroup (v2) | cgroup 层级中的设备、套接字、系统调用 | 容器级别的网络隔离与策略控制 |
性能关键路径: XDP 在网卡驱动层运行,绕过内核协议栈,是 Cilium 实现高吞吐、低延迟网络的关键。TC 程序则在协议栈内部提供更丰富的上下文,用于执行复杂的策略逻辑。
3.3 eBPF Map 机制:程序间的数据共享与状态持久化
eBPF Map 是内核中的键值存储结构,用于在 eBPF 程序之间、eBPF 程序与用户空间之间共享数据和维护状态。Map 是 Cilium 实现策略查找、连接跟踪和负载均衡的核心数据结构。
- 策略查找: Cilium 将网络策略(NetworkPolicy)编译为 eBPF Map 条目(如
cilium_policyMap)。当数据包到达时,eBPF 程序通过查找 Map 快速决定允许或拒绝。 - 连接跟踪(CT Map): 记录活动连接的五元组、状态和元数据,用于有状态防火墙和 NAT。
- 端点(Endpoint)信息: 存储 Pod 的 IP、安全标识(Security Identity)、MAC 地址等信息,用于快速路由和策略决策。
- 负载均衡(LB Map): 存储 Service 的后端 Pod IP 列表和权重,实现高效的 Service 负载分发。
// 示例:Cilium 策略 Map 的简化结构(伪代码)
struct policy_key {
__u32 identity; // 源安全标识
__u32 dest_identity; // 目的安全标识
__u16 dest_port; // 目的端口
__u8 protocol; // 协议类型
};
struct policy_entry {
__u8 action; // 允许 (1) 或 拒绝 (0)
__u8 log; // 是否记录日志
};
3.4 Cilium 如何利用 eBPF 实现网络与安全策略
Cilium 将 eBPF 程序、Map 和用户空间代理(如 Envoy)深度集成,构建了一个完整的网络与安全解决方案。其核心工作流如下:
3.5 安全策略实现:基于 Identity 的 L3/L7 控制
Cilium 不依赖传统的 IP 地址或 Pod 标签,而是引入 Security Identity 的概念。每个 Pod 根据其标签被分配一个全局唯一的数字标识。eBPF 程序在数据路径上直接基于 Identity 进行策略查找,而非 IP,这带来了以下优势:
- 消除 IP 变动影响: Pod 重启或扩缩容时,Identity 保持不变,策略无需重新下发。
- 细粒度 L7 策略: 通过集成 Envoy 代理,Cilium 可以在 eBPF 决策后,将 HTTP/gRPC 流量导向用户空间代理进行 L7 解析,实现基于方法、路径、Header 的精细控制。
- 加密与认证: 利用 eBPF 和 WireGuard 或 IPsec,Cilium 可以在节点间实现透明的、高性能的传输加密。
# 示例:CiliumNetworkPolicy 定义 L3/L4 策略
apiVersion: "cilium.io/v2"
kind: CiliumNetworkPolicy
metadata:
name: "allow-frontend-to-backend"
spec:
endpointSelector:
matchLabels:
app: backend
ingress:
- fromEndpoints:
- matchLabels:
app: frontend
toPorts:
- ports:
- port: "8080"
protocol: TCP
性能调优要点: eBPF Map 的大小和查找效率直接影响数据路径延迟。在生产环境中,需要根据 Pod 规模和策略数量调整 Map 的预分配大小(通过 Cilium Agent 的
--bpf-ct-global-any-max 等参数),避免动态扩容带来的性能抖动。
3.6 本章小结
eBPF 为 Cilium 提供了在内核中安全、高效执行自定义代码的能力。通过组合 XDP/TC 程序、eBPF Map 和基于 Identity 的策略模型,Cilium 实现了比传统 iptables 模式更灵活、性能更优的网络与安全方案。理解 eBPF 程序类型和 Map 机制,是后续进行 GitOps 流水线集成和性能调优的理论基础。