Cilium 架构深度解析:核心组件与数据路径

Cilium 的架构设计围绕 eBPF 技术展开,将数据平面与控制平面解耦,同时提供强大的可观测性能力。理解其核心组件——Cilium Agent、Cilium Operator、CNI 插件、eBPF 数据路径以及 Hubble——是进行容量基线校准和准入策略评审的基础。

2.1 核心组件总览

下表总结了 Cilium 各组件的职责、部署形态及其在压测与运维中的关键作用:

组件 部署形态 核心职责 压测/运维关注点
Cilium Agent DaemonSet(每节点一个) 管理 eBPF 程序、策略执行、IPAM、服务转发 CPU/内存开销、eBPF map 大小、API 响应延迟
Cilium Operator Deployment(通常 1-2 副本) 集群级协调:CIDR 分配、身份管理、故障恢复 Leader 选举稳定性、API Server 请求频率
CNI 插件 二进制文件(由 kubelet 调用) Pod 网络接口创建与配置 Pod 启动延迟、配置失败率
eBPF 数据路径 内核内(由 Agent 加载) 网络包处理、策略过滤、负载均衡 PPS 吞吐、延迟分布、连接跟踪表容量
Hubble DaemonSet + Deployment 流日志采集、网络可观测性、指标暴露 流日志速率、存储开销、gRPC 连接数

2.2 Cilium Agent:节点级控制平面

Cilium Agent 是运行在每个 Kubernetes 节点上的守护进程,是 Cilium 最核心的控制组件。它通过 gRPC 与 kube-apiserver 通信,监听 Pod、Service、Endpoint、NetworkPolicy 等资源变化,并将这些事件转化为 eBPF 程序与 map 的更新。

压测关键指标: Agent 的 cilium-agent 进程内存占用与节点上管理的 Endpoint 数量呈正相关。在 5000 Pod/节点的规模下,Agent 内存消耗通常在 500MB-1.5GB 之间,具体取决于策略复杂度与连接跟踪规模。

2.3 Cilium Operator:集群级协调器

Operator 负责执行需要集群全局视角的操作,例如:

  • CIDR 分配: 为每个节点分配 PodCIDR 范围。
  • 身份管理: 维护安全身份(Security Identity)与标签的映射关系。
  • 故障恢复: 在节点故障时清理残留的端点状态。

Operator 通常以 Deployment 形式运行,通过 Leader 选举保证高可用。在压测场景下,需要关注 Operator 对 API Server 的请求速率,避免成为控制平面的瓶颈。

2.4 CNI 插件:Pod 网络入口

当 kubelet 创建 Pod 时,会调用 Cilium CNI 二进制文件。CNI 插件负责:

  1. 为 Pod 创建 veth pair 设备。
  2. 将一端放入 Pod 网络命名空间,另一端接入主机。
  3. 调用 Cilium Agent 的 API 为 Pod 分配 IP 并加载初始 eBPF 程序。
性能基准: 在裸金属节点上,Cilium CNI 的 Pod 启动延迟通常在 5-15ms 之间。如果超过 50ms,需要排查 Agent 响应延迟或 API Server 负载。

2.5 eBPF 数据路径:内核内网络处理

Cilium 将网络处理逻辑下沉到 Linux 内核的 eBPF 钩子点,避免了传统 iptables 或 IPVS 的上下文切换与规则遍历开销。核心数据路径包括:

  • XDP(eXpress Data Path): 在网卡驱动层进行最早期的包处理,适用于 DDoS 防护和高性能转发。
  • TC(Traffic Control)ingress/egress: 在协议栈入口/出口处执行策略过滤、封装/解封装、负载均衡。
  • Socket-level BPF: 通过 BPF_PROG_TYPE_CGROUP_SKB 实现 Pod 级别的策略隔离。
容量规划警告: eBPF map 的大小是有限的。连接跟踪表(CT map)默认大小可能只支持 65536 条并发连接。在压测前必须根据预期并发连接数调整 bpf-ct-global-tcp-max 等参数,否则会导致丢包。
Cilium 核心组件架构图 Kubernetes 集群 控制平面 kube-apiserver Cilium Operator Hubble Server 数据平面(每节点) Node 1 Cilium Agent eBPF 数据路径 Hubble Relay CNI 插件 Node 2 Cilium Agent eBPF 数据路径 Hubble Relay CNI 插件

2.6 Hubble:可观测性组件

Hubble 是 Cilium 原生的可观测性层,基于 eBPF 采集网络流数据,提供实时流量监控、策略审计和故障排查能力。其组件包括:

  • Hubble Relay: 以 DaemonSet 形式运行在每个节点,从 Cilium Agent 获取流事件,并通过 gRPC 流式传输。
  • Hubble Server: 集群级聚合层,提供统一的查询接口和指标暴露(Prometheus 格式)。
  • Hubble UI: 基于 Web 的可视化界面,展示服务依赖图、流量拓扑和策略执行状态。
压测数据驱动: 在压测期间,Hubble 的流日志速率可能达到每秒数十万条。需要提前配置 hubble-flow-buffer-size 和 monitor-aggregation 参数,避免 Agent 因日志积压导致 OOM。
eBPF 数据路径与 Hubble 流日志采集流程 网络包入口 XDP 钩子 TC Ingress Socket BPF 策略过滤 负载均衡 连接跟踪 Hubble 流日志采集 Hubble Relay 传输 Hubble Server 聚合 说明:eBPF 数据路径在内核内完成包处理,Hubble 通过 perf_event 环形缓冲区 从 eBPF 程序采集流日志,对数据路径性能影响极小(通常 < 1% 延迟增加)

2.7 组件交互流程

一个典型的 Pod 网络创建与策略应用流程如下:

  1. kubelet 调用 Cilium CNI 插件 为 Pod 创建网络命名空间。
  2. CNI 插件通过 Unix Socket 向本地 Cilium Agent 请求 IP 分配与端点注册。
  3. Agent 从 Operator 管理的 IP 池中分配 IP,并加载初始 eBPF 程序到 Pod 的 cgroup 和 veth 设备。
  4. 当网络策略发生变化时,Agent 更新 eBPF map(如策略 map、连接跟踪 map),实现实时策略生效。
  5. Hubble Relay 从 Agent 的 eBPF 事件环形缓冲区读取流日志,上报给 Hubble Server。
准入策略评审要点: 在压测前,应通过 Hubble 的 hubble observe 命令验证策略是否按预期生效。例如:
# 观察特定 Pod 的流量是否被策略丢弃
hubble observe --pod default/my-app --verdict DROPPED