Cilium 架构基础:组件与数据面/控制面分离设计

Cilium 的架构设计遵循现代云原生网络的核心原则——数据面与控制面分离。这种设计使得网络策略的执行与策略的决策逻辑解耦,从而在 Kubernetes 环境中实现高性能、可扩展且安全的网络与可观测性能力。理解 Cilium 的组件构成及其交互方式是掌握网络策略工程实践的前提。

2.1 核心组件概览

Cilium 在 Kubernetes 集群中主要部署为三个核心组件:Cilium Agent、Cilium Operator 和 Cilium CNI 插件。它们各自承担不同的职责,共同构成了完整的 Cilium 运行时环境。

组件 部署形态 核心职责 所属平面
Cilium Agent DaemonSet(每个节点一个 Pod) 管理 eBPF 程序、实现网络策略、服务负载均衡、可观测性数据采集 数据面 + 控制面(本地决策)
Cilium Operator Deployment(通常 1~2 个副本) 集群级协调、身份管理、IPAM(IP 地址管理)、与 Kubernetes API Server 交互 控制面(全局协调)
Cilium CNI 插件 二进制文件(由 kubelet 调用) Pod 网络接口的创建与配置、将 Pod 接入 Cilium 网络 数据面(接口配置)
关键理解: Cilium Agent 是唯一直接操作 eBPF 的组件,所有数据包处理、策略执行都在 Agent 所在节点完成。Operator 不参与数据路径,只负责集群范围的元数据管理。

2.2 数据面与控制面分离设计

Cilium 的架构核心在于将策略决策(控制面)与策略执行(数据面)分离。控制面负责计算和分发策略规则,数据面负责在节点上通过 eBPF 高效执行这些规则。这种分离带来了显著的工程优势:

  • 性能隔离:数据面使用 eBPF 在内核态运行,不受控制面组件重启或延迟的影响。
  • 可扩展性:控制面可以水平扩展(如 Operator 多副本),而数据面随节点数线性增长。
  • 安全边界:控制面组件即使出现故障,已下发的策略在数据面仍持续生效。
Cilium 数据面与控制面分离架构图 Cilium 数据面与控制面分离架构 控制面(Control Plane) Kubernetes API Server Cilium Operator 身份管理 / IPAM 数据面(Data Plane) Kubernetes 节点 1 Cilium Agent eBPF 程序 / 策略执行 CNI 插件(二进制) Kubernetes 节点 2 Cilium Agent eBPF 程序 / 策略执行 CNI 插件(二进制) 节点 N Cilium Agent eBPF 程序 CNI 插件 控制面通过 gRPC 与 Agent 通信,下发身份标识和策略规则;数据面通过 eBPF 在内核态执行转发和策略决策

2.3 Cilium Agent:数据面的核心执行者

Cilium Agent 是运行在每个 Kubernetes 节点上的 DaemonSet Pod,它是整个 Cilium 架构中最关键的组件。Agent 直接负责:

  • eBPF 程序管理:将网络策略、服务转发规则编译为 eBPF 字节码并加载到内核。
  • 网络策略执行:基于身份(Identity)而非 IP 地址进行 L3/L4/L7 策略过滤。
  • 服务负载均衡:实现 Kubernetes Service 的南北向和东西向流量转发。
  • 可观测性:通过 Hubble 组件采集网络流日志和指标。
工程要点:在控制面授权测试中,Agent 是策略生效的最终验证点。测试人员需要关注 Agent 日志(cilium-agent)和 eBPF 映射表状态,以确认策略是否被正确加载和执行。

2.4 Cilium Operator:集群级控制面协调者

Cilium Operator 是一个 Deployment 部署的组件,负责集群范围的协调工作,不参与数据路径。其核心职责包括:

功能模块 具体职责 对策略测试的影响
身份管理 为每个端点(Pod)分配唯一的安全身份标识(Security Identity) 策略依赖身份而非 IP,身份分配错误会导致策略失效
IPAM 管理 Pod CIDR 分配,支持多种 IP 分配模式(CRD、ENI、Azure 等) IP 分配异常会影响 Pod 网络连通性,间接影响策略测试
端点修复 监控端点状态,处理异常端点恢复 端点状态不一致可能导致策略误判
CRD 同步 将 CiliumNetworkPolicy 等 CRD 资源同步到各节点的 Agent CRD 同步延迟是策略生效延迟的主要原因之一

2.5 Cilium CNI 插件:网络接口的桥梁

Cilium CNI 插件是一个轻量级二进制文件,由 kubelet 在创建 Pod 时调用。它的工作流程非常简洁:

  1. ADD 操作:为 Pod 创建 veth 对,一端放入 Pod 网络命名空间,另一端接入 Cilium 管理的网络。
  2. IP 分配:从 IPAM 模块获取 IP 地址并配置到 Pod 接口。
  3. 端点注册:通知 Cilium Agent 新 Pod 的元数据(标签、命名空间、IP),触发身份分配。
  4. DEL 操作:在 Pod 删除时清理网络接口和端点状态。
常见陷阱:CNI 插件执行失败通常表现为 Pod 无法获取 IP 或网络接口创建失败。在策略测试环境中,如果遇到 Pod 一直处于 ContainerCreating 状态,应优先检查 Cilium Agent 日志和 CNI 配置是否正确。

2.6 组件间通信与数据流

理解组件间的通信方式对于排查策略问题至关重要。下图展示了策略下发和 Pod 创建时的关键交互路径:

Cilium 组件间通信与策略下发流程 组件间通信与策略下发流程 用户创建 CiliumNetworkPolicy Kubernetes API Server Cilium Operator 监听 Cilium Agent(各节点) 编译并加载 eBPF 程序 内核态策略执行 策略下发延迟主要发生在 Operator 监听 → Agent 同步阶段,通常为秒级;eBPF 编译和加载为毫秒级

2.7 工程实践要点

在控制面授权测试中,基于 Cilium 的架构特点,需要重点关注以下工程实践:

  • 验证 Agent 状态:使用 cilium status 命令确认 Agent 健康、与 Kubernetes API Server 连接正常、eBPF 功能启用。
  • 检查身份分配:使用 cilium endpoint list 查看 Pod 的安全身份标识,确保身份与预期标签匹配。
  • 监控策略同步:使用 cilium policy get 查看节点上已加载的策略规则,确认策略已从 CRD 同步到 Agent。
  • 关注 Operator 日志:Operator 日志中记录了身份分配和 CRD 同步的关键事件,是排查策略未生效的重要线索。
测试建议:在搭建测试环境时,建议先部署一个简单的“允许所有”策略验证 Cilium 数据面正常工作,再逐步收紧策略进行授权测试。这有助于区分是 Cilium 组件问题还是策略规则本身的问题。