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_policy Map)。当数据包到达时,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)深度集成,构建了一个完整的网络与安全解决方案。其核心工作流如下:

Cilium eBPF 网络与安全策略执行流程 Cilium Agent Kubernetes API eBPF 程序 (TC/XDP) eBPF Maps (策略/CT/LB) 网络数据包 核心流程 1. Cilium Agent 监听 K8s API,将 NetworkPolicy 编译为 eBPF Map 条目。 2. 数据包到达时,TC/XDP 程序执行,通过查找 eBPF Map 进行策略决策。

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 流水线集成和性能调优的理论基础。