2. Cilium 架构基础:数据平面与控制平面核心组件解析

Cilium 的架构清晰地划分为数据平面和控制平面两个部分。数据平面负责处理实际的数据包转发、负载均衡和网络策略执行;控制平面则负责管理数据平面的状态、与 Kubernetes API Server 交互以及提供可观测性数据。理解这两个平面的核心组件及其协作方式,是进行性能调优的前提。

2.1 数据平面:eBPF 与 XDP 的深度集成

Cilium 的数据平面完全构建在 Linux 内核的 eBPF(extended Berkeley Packet Filter)技术之上。它不再依赖传统的 iptables 或 ipvs,而是通过在内核中动态注入 eBPF 程序来实现网络功能。XDP(eXpress Data Path)则提供了更早的数据包处理入口,位于网卡驱动层之后、内核协议栈之前。

性能关键点: eBPF 程序运行在内核沙箱中,避免了用户态与内核态之间的上下文切换。XDP 在数据包进入内核协议栈前就完成处理,延迟极低,非常适合 DDoS 防护和负载均衡场景。
Cilium 数据平面:eBPF / XDP 处理路径 网卡 (NIC) XDP 钩子 (驱动层) eBPF 程序 (内核) 数据包 传递 eBPF Map (状态共享) 内核协议栈 (可选) 重定向/传递 用户态应用 (Pod) 核心说明: 1. XDP 在网卡驱动层直接处理数据包,性能最高,适合 DDoS 防护和负载均衡。 2. eBPF 程序在内核中执行,支持更复杂的网络逻辑(如 L7 协议解析)。 3. eBPF Map 用于在 eBPF 程序与用户态 Agent 之间共享状态(如端点信息、策略规则)。 4. 数据包可通过 eBPF 直接重定向到用户态应用,绕过内核协议栈,降低延迟。

2.2 控制平面:Agent 与 Operator 的分工协作

Cilium 的控制平面由两个核心组件构成:Cilium Agent 和 Cilium Operator。它们各自承担不同的职责,共同维护集群的网络状态。

组件 部署方式 核心职责 与数据平面的交互
Cilium Agent DaemonSet(每个节点一个) 管理本地 eBPF 程序、端点、网络策略、服务负载均衡 直接通过系统调用加载/更新 eBPF 程序,读写 eBPF Map
Cilium Operator Deployment(通常 1-2 个副本) 处理集群级任务:IPAM、CNI 协调、节点间同步、CRD 管理 不直接操作 eBPF,通过 Agent 间接下发配置
调优视角: Agent 是性能敏感组件,其与 kube-apiserver 的交互频率、eBPF Map 的更新策略直接影响数据平面的转发性能。Operator 则负责全局资源协调,其处理延迟会影响新 Pod 的网络就绪时间。
Cilium 控制平面:Agent 与 Operator 架构 Kubernetes API Server Cilium Operator IPAM / CNI / CRD 管理 Watch / Informer 节点 1 (Node-1) Cilium Agent eBPF 程序管理 / 策略执行 eBPF Map (本地状态) 节点 2 (Node-2) Cilium Agent eBPF 程序管理 / 策略执行 eBPF Map (本地状态) Watch / Informer Watch / Informer CRD 状态同步 CRD 状态同步 组件交互说明: 1. Agent 通过 Kubernetes Informer 监听 Pod、Service、Endpoint 等资源变化,实时更新本地 eBPF 程序。 2. Operator 负责集群级 IPAM(IP 地址管理),为每个节点分配 PodCIDR,并通过 CRD 将分配结果同步给 Agent。 3. Agent 之间不直接通信,所有跨节点状态同步均通过 API Server 或 Operator 协调完成。

2.3 核心组件详细解析

2.3.1 Cilium Agent

Agent 是运行在每个 Kubernetes 节点上的守护进程,是控制平面与数据平面之间的桥梁。它负责以下关键任务:

  • eBPF 程序生命周期管理: 编译、加载、更新和卸载 eBPF 程序(如网络策略、负载均衡、观测性程序)。
  • 端点管理: 跟踪本地所有 Pod 的网络端点信息,并将其写入 eBPF Map。
  • 策略执行: 将 Kubernetes NetworkPolicy 或 CiliumNetworkPolicy 翻译为 eBPF 程序中的过滤规则。
  • 服务负载均衡: 管理 ClusterIP、NodePort、ExternalIP 等服务的 eBPF 实现。
  • 可观测性数据采集: 通过 eBPF 收集网络流量指标(如丢包、延迟、吞吐量),并通过 Prometheus 暴露。
性能风险: 当集群中 Pod 频繁创建/删除时,Agent 需要频繁更新 eBPF Map。如果更新速率超过 eBPF 系统的处理能力,可能导致数据平面短暂不一致或丢包。建议监控 cilium_agent_api_process_time_seconds 指标。

2.3.2 Cilium Operator

Operator 是一个集群级组件,通常以 Deployment 形式部署 1-2 个副本。它不直接参与数据包处理,但负责以下关键集群协调任务:

  • IPAM(IP 地址管理): 为每个节点分配 PodCIDR 范围,支持 CRD-backed、Kuberenetes HostScope、Azure、AWS 等多种 IPAM 模式。
  • CNI 协调: 处理 CNI 插件的安装、配置和健康检查。
  • CRD 管理: 维护 Cilium 相关的自定义资源(如 CiliumNetworkPolicy、CiliumEndpoint、CiliumNode)的状态。
  • 节点间同步: 在节点加入或离开集群时,更新全局网络拓扑信息。

2.4 数据平面与控制平面的交互流程

以下是一个典型的数据包处理流程,展示了控制平面如何影响数据平面:

  1. Pod 创建事件: Kubernetes API Server 创建 Pod,Cilium Agent 通过 Informer 监听到该事件。
  2. IP 分配: Agent 向 Operator 请求 IP 地址(或从本地缓存分配),Operator 确保 IP 不冲突。
  3. eBPF 程序更新: Agent 将新 Pod 的端点信息写入 eBPF Map,并更新网络策略相关的 eBPF 程序。
  4. 数据包到达: 当数据包到达节点网卡时,XDP 钩子首先处理,然后传递给 eBPF 程序。
  5. 策略匹配与转发: eBPF 程序查询 eBPF Map 中的端点信息和策略规则,决定允许、拒绝或重定向数据包。
  6. 可观测性数据: eBPF 程序将流量指标写入 Perf Event Buffer 或 eBPF Map,Agent 定期读取并暴露给 Prometheus。
调优要点: 步骤 2 和 3 的延迟直接影响 Pod 的网络就绪时间。在 Operator 集成场景中,如果 Operator 处理 IPAM 请求过慢,会导致 Agent 等待,进而延迟 eBPF 程序的更新。建议将 Operator 的副本数设置为 2,并启用 --operator-pprof 进行性能分析。

2.5 关键性能指标与监控

指标名称 类型 说明 调优阈值
cilium_agent_api_process_time_seconds Histogram Agent 处理 API 请求的耗时 P99 < 100ms
cilium_operator_ipam_allocation_duration_seconds Histogram Operator 分配 IP 地址的耗时 P99 < 200ms
cilium_ebpf_map_ops_total Counter eBPF Map 操作次数(更新/删除) 根据节点规模监控趋势
cilium_endpoint_regeneration_total Counter 端点重新生成次数(策略变更触发) 避免频繁波动
最佳实践: 在 Operator 集成场景中,建议将 Cilium Agent 的 --bpf-map-dynamic-size-ratio 参数从默认的 0.0025 调整为 0.005,以应对大规模集群中 eBPF Map 的频繁更新。同时,确保 Operator 的 --ipam-grpc-request-timeout 设置为合理的超时值(如 30s),避免因 IPAM 超时导致 Pod 创建失败。