2. Cilium核心架构:eBPF数据面、Agent、Operator组件详解

Cilium 的架构设计围绕三个核心组件展开:eBPF 数据面、Cilium Agent 和 Cilium Operator。理解这三者的职责与协作关系,是进行网络性能调优与资源配额规划的前提。eBPF 数据面负责内核中的高速包处理,Agent 负责控制面逻辑与 API 交互,Operator 则管理集群级别的生命周期任务。

2.1 整体架构概览

下图展示了 Cilium 在 Kubernetes 集群中的核心组件布局及其交互关系。eBPF 数据面运行在 Linux 内核中,Agent 以 DaemonSet 形式运行在每个节点上,Operator 则以 Deployment 形式运行在控制平面。

Cilium 核心架构组件关系图 Cilium 核心架构组件关系图 Kubernetes 集群边界 控制平面节点 kube-apiserver Cilium Operator (Deployment) CRD 管理 / 身份分配 工作节点 1 Cilium Agent (DaemonSet) eBPF 数据面 Pod A / Pod B CNI / 路由 / 策略 工作节点 2 Cilium Agent (DaemonSet) eBPF 数据面 Pod C / Pod D CNI / 路由 / 策略 eBPF 直接转发(无隧道) Agent 通过 gRPC 与 kube-apiserver 交互
架构要点:Agent 是每个节点上的“大脑”,负责将网络策略、服务定义翻译为 eBPF 程序;Operator 是集群级别的“管家”,处理无需每节点重复的任务;eBPF 数据面是“高速执行器”,在内核中完成包处理。

2.2 eBPF 数据面:内核中的高速网络引擎

eBPF(extended Berkeley Packet Filter)是 Cilium 的核心技术基石。Cilium 利用 eBPF 在内核中动态注入网络处理程序,实现高性能的数据包转发、负载均衡、安全策略执行和可观测性。

2.2.1 eBPF 数据面的关键能力

能力维度 实现机制 性能优势
网络转发 通过 TC(Traffic Control)或 XDP(eXpress Data Path)挂载 eBPF 程序 绕过 iptables,减少内核态与用户态切换,延迟降低 40%~60%
负载均衡 使用 eBPF map 实现 Service 后端查找与 NAT 无需 conntrack 回写,吞吐量提升 3~5 倍
网络策略 基于身份(Security Identity)的 L3/L4/L7 策略执行 策略匹配在 eBPF 中完成,无额外进程开销
可观测性 通过 eBPF 采集网络流、DNS、HTTP 等事件 零侵入采集,CPU 开销低于 5%

2.2.2 eBPF 数据面工作流程

当数据包到达节点网卡时,eBPF 程序在内核中按以下路径处理:

  1. XDP 入口:在驱动层直接处理,适用于 DDoS 防护和高性能转发。
  2. TC 入口:在协议栈入口处处理,适用于复杂策略和隧道封装。
  3. eBPF map 查询:查找 Service 映射、策略规则、身份标识。
  4. 转发决策:根据查询结果执行转发、丢弃、重定向或封装。
  5. 可观测性事件:将元数据写入 perf_event 或 map,供 Agent 消费。
性能调优关注点:eBPF 数据面的性能瓶颈通常出现在 map 查询频率过高或程序复杂度超标。建议将 eBPF 程序复杂度控制在 BPF 验证器允许的 4096 条指令以内,并合理使用 map 预分配。

2.3 Cilium Agent:节点级控制面

Cilium Agent 是一个运行在每个 Kubernetes 节点上的守护进程(DaemonSet),它是 Cilium 的控制面核心。Agent 负责与 Kubernetes API Server 通信,监听资源变化,并将这些变化编译为 eBPF 程序和数据。

2.3.1 Agent 的核心职责

  • CNI 插件实现:处理 Pod 的网络创建与删除,分配 IP 地址,配置网络接口。
  • eBPF 程序管理:编译、加载、更新和卸载 eBPF 程序及 map。
  • 服务与策略同步:监听 Service、Endpoint、NetworkPolicy、CiliumNetworkPolicy 等资源。
  • 身份管理:为每个 Pod 分配安全身份(Security Identity),用于策略匹配。
  • 可观测性数据聚合:从 eBPF 数据面收集流日志、指标,并通过 Prometheus 暴露。
  • KVStore 交互:在集群模式下与 etcd 或 Kubernetes CRD 后端同步状态。

2.3.2 Agent 的资源消耗特征

资源类型 消耗特征 影响因素
CPU 中等,主要消耗在 eBPF 编译、策略计算、API 监听 Pod 密度、策略复杂度、服务数量
内存 较高,eBPF map 和状态缓存占用主要内存 Endpoint 数量、Identity 数量、流日志缓冲区
网络带宽 低,仅用于与 API Server 和 KVStore 通信 集群规模、资源变更频率
资源配额提示:在大型集群(>500 节点)中,Agent 的内存占用可能达到 1~2 GiB。建议为 Agent 设置 requests: 256m CPU / 512Mi 内存,limits: 1 CPU / 2Gi 内存,并根据实际监控数据调整。

2.4 Cilium Operator:集群级生命周期管理

Cilium Operator 是一个 Deployment 级别的组件,通常只运行一个副本(或两个用于高可用)。Operator 负责执行那些不需要在每个节点上重复执行的集群级任务。

2.4.1 Operator 的核心职责

  • CRD 管理:确保 Cilium 所需的 CRD(如 CiliumNetworkPolicy、CiliumEndpoint)在集群中注册。
  • 身份分配:为集群中的每个端点分配全局唯一的 Security Identity。
  • 节点初始化:在新节点加入集群时,触发 Agent 的初始化流程。
  • CiliumEndpoint 同步:维护 CiliumEndpoint 资源的状态,确保与 Agent 上报信息一致。
  • 故障恢复:检测 Agent 失联或状态异常,触发重新调度或清理。

2.4.2 Operator 与 Agent 的职责对比

对比维度 Cilium Agent Cilium Operator
部署模式 DaemonSet(每节点一个) Deployment(通常 1~2 副本)
主要工作 eBPF 管理、CNI、策略执行 CRD 管理、身份分配、节点初始化
API Server 交互频率 高(持续监听资源变更) 低(仅在集群事件时触发)
资源消耗 中到高(随节点 Pod 密度增长) 低(通常 100m CPU / 256Mi 内存)
故障影响范围 仅影响所在节点 影响全局身份分配和 CRD 管理

2.5 组件协作流程示例

以下是一个 Pod 创建过程中,三个核心组件的协作时序:

  1. kube-scheduler 将 Pod 调度到工作节点。
  2. kubelet 调用 Cilium CNI 插件(Agent 的一部分)创建网络接口。
  3. Agent 为 Pod 分配 IP 地址和安全身份,并加载对应的 eBPF 程序。
  4. Agent 将新的 Endpoint 信息上报给 Operator。
  5. Operator 更新 CiliumEndpoint CRD 状态,确保全局身份唯一性。
  6. Agent 将 eBPF map 中的转发规则同步到其他节点的数据面。
调优启示:在 Pod 频繁创建/销毁的场景下,Agent 的 eBPF 编译和 map 更新是主要性能瓶颈。建议启用 eBPF map 预分配,并调整 --bpf-map-dynamic-size-ratio 参数以适配工作负载。

2.6 组件资源配额建议

基于生产环境经验,下表给出了 Cilium 核心组件的 Helm 资源配额推荐值:

组件 requests limits 适用场景
Agent 256m CPU / 512Mi 内存 1 CPU / 2Gi 内存 中小型集群(<100 节点)
Agent 512m CPU / 1Gi 内存 2 CPU / 4Gi 内存 大型集群(100~500 节点)
Operator 100m CPU / 128Mi 内存 500m CPU / 512Mi 内存 所有规模
KVStore(etcd) 200m CPU / 512Mi 内存 1 CPU / 2Gi 内存 集群模式专用
协同优化要点:Agent 的资源配额直接影响 eBPF 数据面的响应速度。当 Agent 因 CPU 限流导致 eBPF 编译延迟时,Pod 网络就绪时间会显著增加。建议将 Agent 的 CPU request 设置为与节点核心数成比例,例如每 10 个 Pod 分配 50m CPU。