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 多副本),而数据面随节点数线性增长。
- 安全边界:控制面组件即使出现故障,已下发的策略在数据面仍持续生效。
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 时调用。它的工作流程非常简洁:
- ADD 操作:为 Pod 创建 veth 对,一端放入 Pod 网络命名空间,另一端接入 Cilium 管理的网络。
- IP 分配:从 IPAM 模块获取 IP 地址并配置到 Pod 接口。
- 端点注册:通知 Cilium Agent 新 Pod 的元数据(标签、命名空间、IP),触发身份分配。
- DEL 操作:在 Pod 删除时清理网络接口和端点状态。
常见陷阱:CNI 插件执行失败通常表现为 Pod 无法获取 IP 或网络接口创建失败。在策略测试环境中,如果遇到 Pod 一直处于
ContainerCreating 状态,应优先检查 Cilium Agent 日志和 CNI 配置是否正确。
2.6 组件间通信与数据流
理解组件间的通信方式对于排查策略问题至关重要。下图展示了策略下发和 Pod 创建时的关键交互路径:
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 组件问题还是策略规则本身的问题。