2. Cilium 网络架构:数据路径、eBPF 与网络栈、Agent 与 Operator 角色

理解 Cilium 的网络架构是进行 MTU 调优的前提。Cilium 的核心能力来源于 eBPF 技术,其数据路径完全绕过了传统的 iptables 和内核网络栈的复杂路径,实现了高性能的网络转发与安全策略执行。本章将拆解 Cilium 的数据路径、eBPF 与网络栈的交互关系,以及 Cilium Agent 与 Operator 在集群中的角色分工。

2.1 Cilium 数据路径:从 Pod 到网络的完整旅程

Cilium 的数据路径是 eBPF 程序在内核中挂载的一系列钩子点。当数据包从一个 Pod 发出,到最终离开节点,会经历以下关键阶段:

关键路径节点:
  • TC Ingress/Egress (Netfilter 钩子): 在网卡驱动层捕获数据包,执行 L2/L3 转发决策。
  • XDP (eXpress Data Path): 在网卡驱动层之前执行,实现极速的 DDoS 防护和负载均衡。
  • L3/L4 策略执行: 基于 Identity (安全标识) 而非 IP 地址,在 eBPF map 中查找策略。
  • 隧道封装/解封装: 当使用 Overlay 模式 (如 VXLAN, Geneve) 时,eBPF 负责封装和解封装。
  • 直接路由 (Native Routing): 当使用 Direct Routing 模式时,eBPF 直接修改路由表或通过 ARP 代理转发。

下图展示了 Cilium 数据路径中,一个 Pod 发出的数据包如何经过 eBPF 程序处理,最终到达对端 Pod 或外部网络:

Cilium 数据路径流程图 Cilium 数据路径:Pod 到 Pod 的 eBPF 转发流程 Pod A (veth) TC Ingress (veth) L3/L4 策略检查 隧道封装/路由 物理网卡 egress 对端物理网卡 ingress 对端 Pod B (veth) 说明: eBPF 程序挂载在 TC 和 XDP 钩子, 实现无锁、可编程的数据路径。
MTU 调优关键点: 在隧道封装模式下,eBPF 会在原始数据包前增加额外的头部(如 VXLAN 50 字节、Geneve 50-100 字节)。如果物理网卡 MTU 未预留这些开销,会导致分片或丢包。Cilium 的 mtu 配置项正是用于告知 eBPF 程序预留正确的封装开销。

2.2 eBPF 与网络栈的交互:内核态与用户态的桥梁

Cilium 利用 eBPF 在内核中运行沙箱程序,这些程序通过 eBPF Maps 与用户态的 Cilium Agent 通信。eBPF 程序本身不负责复杂的业务逻辑,而是专注于高速数据包处理。

组件 运行位置 核心职责 与 MTU 的关系
eBPF 程序 内核 (Kernel) 数据包转发、策略执行、负载均衡、隧道封装 直接处理 MTU 计算和分片逻辑
eBPF Maps 内核 (Kernel) 存储策略、端点信息、路由表、MTU 配置 存储 Cilium Agent 下发的 MTU 值
Cilium Agent 用户态 (Userspace) 管理 eBPF 程序生命周期、下发配置、收集指标 计算并下发正确的 MTU 值到 eBPF Maps
Kubernetes API 控制面 提供 Pod/Node/Service 信息 Agent 通过 Watch 机制获取节点 MTU 信息

下图展示了 eBPF 程序与 Cilium Agent 之间的交互关系,以及 MTU 配置如何从 Agent 传递到内核 eBPF 程序:

eBPF 与 Cilium Agent 交互架构 eBPF 与 Cilium Agent 交互:MTU 配置下发流程 用户态 (Userspace) Cilium Agent MTU 计算、策略下发、eBPF 管理 内核态 (Kernel) eBPF Maps (MTU 配置) eBPF 程序 (数据路径) MTU 配置交互流程: 1. Agent 通过 Node 或 ConfigMap 获取 期望 MTU 值。 2. Agent 计算封装开销 (Overhead)。 3. Agent 通过 bpf() syscall 更新 eBPF Map 中的 mtu 字段。 4. eBPF 程序在转发时读取 Map, 动态调整分片或封装行为。 5. 若 MTU 不匹配,eBPF 可能触发 ICMP 需要分片消息。

2.3 Cilium Agent 与 Operator 角色分工

在 Cilium 架构中,Agent 和 Operator 是两个核心组件,它们分工明确,共同维护集群网络状态。

  • Cilium Agent (DaemonSet): 运行在每个 Kubernetes 节点上,是数据面的实际管理者。它负责:
    • 编译、加载和卸载 eBPF 程序。
    • 管理本地端点 (Endpoint) 和身份标识 (Identity)。
    • 与 kube-apiserver 交互,监听 Pod/Service/Node 变化。
    • 计算并下发 MTU 配置到 eBPF Maps。
    • 收集节点网络指标和 Hubble 可观测性数据。
  • Cilium Operator (Deployment): 运行在控制面,负责集群级别的协调任务。它负责:
    • 管理全局 Identity 分配。
    • 处理 ClusterMesh 多集群服务发现。
    • 管理 CiliumNetworkPolicy 的全局状态。
    • 处理节点故障时的 IP 地址回收。
    • 不直接参与数据路径,也不处理 MTU 计算。
维度 Cilium Agent Cilium Operator
部署方式 DaemonSet (每节点一个) Deployment (通常 1-2 个副本)
运行位置 数据面节点 控制面节点
核心功能 eBPF 管理、数据路径、策略执行 Identity 管理、多集群、全局协调
MTU 相关职责 计算、下发、监控 MTU 配置 无直接关系
故障影响范围 仅影响所在节点网络 影响全局 Identity 分配
MTU 调优注意: 由于 Agent 是 MTU 配置的实际执行者,任何 MTU 修改都需要重启 Agent 或触发配置热加载。Operator 不参与此过程,因此 Operator 的故障不会直接影响 MTU 配置,但会影响新 Pod 的 Identity 分配,间接导致网络策略异常。