Cilium 架构速览:数据平面、控制平面与关键组件交互

Cilium 的架构可以清晰地划分为数据平面和控制平面两个核心层次。数据平面基于 eBPF 在内核中高效执行网络策略与转发;控制平面则由 Cilium Agent、Operator 以及 Hubble 等组件构成,负责策略下发、状态同步与可观测性。理解这两层及其关键组件的交互关系,是掌握 Cilium 运维与故障排查的基础。

1. 数据平面:eBPF 驱动的内核网络栈

Cilium 的数据平面完全构建在 eBPF(extended Berkeley Packet Filter)之上。eBPF 允许用户在 Linux 内核中安全地运行沙箱化程序,而无需修改内核源码或加载内核模块。Cilium 利用 eBPF 在数据路径的关键钩子点(如网络设备、套接字操作、XDP)注入程序,实现网络转发、负载均衡、安全策略与可观测性。

核心优势: 相比传统的 iptables 或 IPVS 方案,eBPF 数据平面具备更高的性能、更低的延迟以及更强的可编程性。它能够绕过复杂的 netfilter 框架,直接在协议栈早期处理数据包。

2. 控制平面:Agent 与 Operator 的协同

控制平面负责管理数据平面的状态。Cilium 的控制平面主要由两个组件构成:Cilium Agent 和 Cilium Operator。

  • Cilium Agent:以 DaemonSet 形式运行在每个 Kubernetes 节点上。它通过监听 Kubernetes API Server 获取 Pod、Service、NetworkPolicy 等资源变化,并将这些高层级意图编译为 eBPF 程序,加载到所在节点的内核中。Agent 还负责与节点上的容器运行时(如 containerd)交互,管理本地端点。
  • Cilium Operator:通常以 Deployment 形式运行,负责处理集群级别的任务,例如:管理 IP 地址分配(IPAM)、处理 CiliumNetworkPolicy 的集群范围校验、以及管理多集群服务网格的配置。Operator 不直接参与数据平面的数据包处理。

3. 关键组件交互关系

下图展示了 Cilium 数据平面与控制平面组件之间的核心交互流程,以及它们如何与 Kubernetes 生态集成。

Cilium 核心组件交互架构图 Cilium 组件交互关系 Kubernetes 集群 Kubernetes API Server 资源监听 / 状态上报 (Pod, Service, Policy) Cilium Operator IPAM / 集群策略校验 Cilium Agent eBPF 程序编译与加载 本地端点管理 eBPF 数据平面 网络 / 策略 / 负载均衡 Hubble 可观测性 / 流日志 Watch Watch 加载 eBPF 程序 事件流 指标 / 流 CNI 插件 (Pod 网络配置)

4. 关键组件详解

4.1 CNI 插件

Cilium 实现了标准的 CNI(Container Network Interface)插件。当 kubelet 请求创建 Pod 时,Cilium CNI 二进制文件被调用,负责为 Pod 分配网络命名空间、配置网络接口(通常是通过 eBPF 实现的虚拟以太网设备 veth pair),并分配 IP 地址。Cilium Agent 随后会为这个新 Pod 创建对应的本地端点(Endpoint),并加载相应的 eBPF 程序。

4.2 kube-proxy 替代

Cilium 可以完全替代 kube-proxy 的功能。它通过 eBPF 在节点上实现 Service 的负载均衡,无需依赖 iptables 或 IPVS。Cilium Agent 监听 Service 和 EndpointSlice 的变化,直接在 eBPF 映射表中维护后端端点列表。当数据包到达时,eBPF 程序执行高效的哈希或随机选择,将流量转发到正确的后端 Pod。

运维提示: 在部署 Cilium 时,可以通过设置 kubeProxyReplacement=true 来启用 kube-proxy 替代模式。这通常能带来更低的延迟和更好的可扩展性,尤其是在大规模集群中。

4.3 Hubble

Hubble 是 Cilium 的可观测性层。它从 Cilium Agent 和 eBPF 数据平面收集流日志、指标和事件,并提供实时的网络流量可视化。Hubble 的核心组件包括:

  • Hubble Agent:运行在每个节点上,从 Cilium Agent 获取事件并暴露本地 gRPC 服务。
  • Hubble Relay:集群级别的组件,聚合所有 Hubble Agent 的数据,提供统一的查询接口。
  • Hubble UI:基于 Web 的图形化界面,用于展示服务依赖关系、流量流向和策略执行情况。

5. 组件交互流程总结

下表总结了关键组件之间的交互方向与核心职责,帮助你在故障排查时快速定位问题所在。

源组件 目标组件 交互内容 关键作用
Kubernetes API Server Cilium Agent Pod / Service / NetworkPolicy 事件 驱动数据平面策略更新
Kubernetes API Server Cilium Operator 节点 / CiliumNode 资源 IPAM 与集群级配置协调
Cilium Agent eBPF 数据平面 编译后的 eBPF 程序与映射 执行网络转发与安全策略
Cilium Agent Hubble Agent 网络流事件与指标 提供可观测性数据源
eBPF 数据平面 Hubble Agent 丢弃的数据包 / 策略命中 捕获内核级事件
Hubble Relay Hubble UI / CLI 聚合后的流日志 集群范围网络可视化

6. 数据平面与控制平面的交互细节

为了更深入地理解故障场景,我们需要关注 Agent 如何将控制平面的意图转化为数据平面的具体行为。下图展示了这一关键转换过程。

控制平面到数据平面的策略转换流程 策略转换流程:从 Kubernetes 资源到 eBPF 映射 1. 监听资源 Cilium Agent Watch API Server 2. 编译策略 生成 BPF 指令 更新 BPF Map 3. 加载执行 tc / XDP 钩子 内核数据路径 4. 观测 Hubble 采集 事件与指标 关键点:Agent 将 NetworkPolicy 编译为 BPF 程序, 通过 bpf() 系统调用加载到内核,并更新 BPF Map 中的端点信息。
故障排查要点: 如果网络策略未生效,应首先检查 Cilium Agent 是否成功监听到策略事件(步骤 1),以及 eBPF 程序是否被正确加载(步骤 3)。可以使用 cilium bpf policy list 命令查看当前节点上的 BPF 策略映射表。