4. Cilium 架构详解:Cilium Agent、Cilium Operator、Cilium CNI 插件、eBPF 数据路径
在生产环境中实现 拉取加速 SLO,必须深入理解 Cilium 的核心组件及其协作方式。Cilium 并非单一二进制,而是由 Cilium Agent、Cilium Operator、Cilium CNI 插件 以及底层的 eBPF 数据路径 构成的分布式系统。本章将逐一拆解这些组件,并揭示它们如何共同实现高性能网络与安全策略。
4.1 整体架构概览
下图展示了 Cilium 在 Kubernetes 集群中的核心组件布局与数据流关系。理解这张图是掌握后续 SLO 调优的基础。
4.2 Cilium Agent:节点级控制平面
Cilium Agent 以 DaemonSet 形式运行在每个 Kubernetes 工作节点上,是节点上最核心的进程。它负责与 Kubernetes API Server 交互,并将网络和安全意图转化为节点本地的 eBPF 程序。
- API 监听与状态同步: 通过 Informer 机制监听 Pod、Service、Endpoint、NetworkPolicy 等资源变化。
- eBPF 程序生命周期管理: 编译、加载、附加和卸载 eBPF 程序到网络接口、cgroup 等挂载点。
- IP 地址管理 (IPAM): 为节点上的 Pod 分配 IP 地址,支持 CRD、Kuberenetes HostScope、AWS ENI、Azure 等多种模式。
- 服务负载均衡: 将 Kubernetes Service 转换为 eBPF 中的 BPF_MAP_TYPE_HASH 映射,实现高性能南北向和东西向流量转发。
- 网络策略执行: 将 CiliumNetworkPolicy (CNP) 和 Kubernetes NetworkPolicy 编译为 eBPF 中的查找表,在数据路径上执行 L3/L4/L7 策略。
- 可观测性数据导出: 通过 Hubble 组件收集流日志、指标和事件,供监控和排障使用。
4.3 Cilium Operator:集群级协调器
Cilium Operator 是集群级别的控制器,通常以 Deployment 形式运行(建议至少 2 副本以保证高可用)。它不直接参与数据路径,而是负责全局协调任务。
| 功能模块 | 说明 | 对 SLO 的影响 |
|---|---|---|
| 身份管理 (Identity) | 为每个安全相关的端点(Pod 或 IP)分配全局唯一的数字身份 (Security Identity)。 | 身份分配延迟直接影响新 Pod 的网络就绪时间。 |
| CNP 聚合 | 将集群范围内的 CiliumNetworkPolicy 规则聚合,并分发到各节点的 Agent。 | 策略变更的传播速度影响安全策略生效的 SLO。 |
| IPAM 池管理 | 管理全局 IP 地址池,为节点分配 IP 子网。 | IP 池耗尽或分配缓慢会导致 Pod 创建失败。 |
| KVStore 维护 | 当使用 etcd 作为后端时,负责维护集群状态的一致性。 | KVStore 的性能瓶颈会拖慢整个集群的协调速度。 |
4.4 Cilium CNI 插件:Pod 网络接入点
Cilium CNI 插件是一个轻量级二进制文件,遵循 Kubernetes CNI 规范。当 kubelet 需要创建或删除 Pod 网络时,会调用该插件。
工作流程:
- ADD 操作: kubelet 调用 Cilium CNI 二进制,传入 Pod 的命名空间、名称、Sandbox ID 等信息。
- 接口创建: 插件在 Pod 的网络命名空间中创建 veth pair,一端放入 Pod,另一端连接到主机的 cilium_host 或 lxc 接口。
- IP 分配: 插件向本地的 Cilium Agent 请求 IP 地址(通过 Unix Socket 通信)。
- eBPF 挂载: Agent 为新的 Pod 接口加载对应的 eBPF 程序,用于流量转发和策略执行。
- 路由配置: 在主机和 Pod 命名空间中配置必要的路由规则。
cilium_cni_duration_seconds 指标。
4.5 eBPF 数据路径:高性能内核态处理
eBPF 数据路径是 Cilium 实现高性能网络和安全的核心。Cilium Agent 将网络策略、服务转发规则等编译为 eBPF 字节码,并加载到内核的特定挂载点。
关键挂载点与功能:
| 挂载点 | eBPF 程序类型 | 功能描述 |
|---|---|---|
| XDP (eXpress Data Path) | BPF_PROG_TYPE_XDP | 在网卡驱动层处理数据包,实现最早的丢包、转发或重定向。适用于 DDoS 防护和高压负载均衡。 |
| TC (Traffic Control) Ingress/Egress | BPF_PROG_TYPE_SCHED_CLS | 在协议栈处理前后进行过滤、转发、封装/解封装。是 Cilium 默认的数据路径,支持所有高级功能。 |
| cgroup/skb | BPF_PROG_TYPE_CGROUP_SKB | 在 cgroup 级别对进出 Pod 的数据包进行策略控制,用于实现 NetworkPolicy。 |
| cgroup/sock | BPF_PROG_TYPE_CGROUP_SOCK | 在 socket 创建、连接、绑定等操作时执行策略,用于实现基于身份的安全策略。 |
数据路径处理流程(以 Pod 间通信为例):
- Pod A 发送数据包到 veth 对端(主机侧接口)。
- 主机侧接口上的 TC Ingress eBPF 程序 被触发。
- 程序查找 BPF_MAP(包含服务映射、策略映射、身份映射),决定数据包的处理方式:
- 转发: 直接重定向到目标 Pod 的接口。
- 负载均衡: 修改目标 IP 和端口为后端 Pod 地址。
- 加密: 通过 WireGuard 或 IPsec 进行加密。
- 丢弃: 如果违反网络策略,直接丢包。 - 处理后的数据包通过 TC Egress eBPF 程序 发送到目标 Pod 的接口。
- XDP 模式: 如果节点网卡支持,启用 XDP 卸载可以大幅降低数据包处理延迟,对镜像仓库的大流量拉取有明显加速效果。
- eBPF Map 大小: 确保
cilium_bpf_map_max配置足够大,避免在高密度 Pod 场景下出现 map 溢出,导致策略失效或转发错误。 - 直接路由 (Direct Routing): 相比隧道模式(VXLAN/Geneve),直接路由模式减少了一次封装/解封装开销,能提升拉取吞吐量。
4.6 组件协作流程总结
以下表格总结了在 创建新 Pod 并开始 拉取镜像 的场景中,各组件如何协作:
| 步骤 | 组件 | 动作 | 对拉取 SLO 的影响 |
|---|---|---|---|
| 1 | Kubernetes API Server | 创建 Pod 对象 | 调度延迟 |
| 2 | Cilium Operator | 为 Pod 分配 Security Identity | 身份分配延迟 |
| 3 | kubelet → Cilium CNI | 调用 CNI ADD | CNI 插件执行时间 |
| 4 | Cilium Agent | 分配 IP、加载 eBPF 程序 | Agent 响应时间 |
| 5 | eBPF 数据路径 | 处理 Pod 网络流量 | 数据包转发延迟、吞吐量 |
| 6 | Hubble (Agent 内) | 生成网络流日志 | 可观测性开销(通常可忽略) |
理解上述组件的职责与协作关系,是后续章节中诊断拉取性能瓶颈、优化 Cilium 配置、以及制定 SLO 指标的基础。下一章将深入探讨如何利用 Hubble 观测这些组件的行为。