3. Cilium 架构与核心组件解析

Cilium 的架构设计围绕 eBPF(extended Berkeley Packet Filter)技术展开,将数据平面与控制平面解耦,同时提供强大的可观测性能力。理解其核心组件——Cilium Agent、Cilium Operator、CNI 插件、eBPF 数据路径以及 Hubble——是进行多租户网络调优的基础。

3.1 整体架构概览

下图展示了 Cilium 在 Kubernetes 集群中的核心组件及其交互关系。数据平面通过 eBPF 程序直接在内核中处理网络包,控制平面则负责策略下发与状态同步。

Cilium 核心组件架构图 Cilium 核心组件架构图 Kubernetes 集群 控制平面 (Control Plane) Cilium Operator 身份管理 / 策略 K8s API Server 资源监听 数据平面 (Data Plane) - 每个 Node 上运行 Node 1 Cilium Agent eBPF 程序 Pod A (app=web) Node 2 Cilium Agent eBPF 程序 Pod B (app=api) Hubble Relay / UI 可观测性 流量日志 策略下发 指标/流

3.2 核心组件详解

3.2.1 Cilium Agent

Cilium Agent 是运行在每个 Kubernetes 节点上的守护进程(DaemonSet),是 Cilium 数据平面的核心执行者。它负责管理该节点上所有与网络相关的 eBPF 程序。

  • CNI 实现:作为 CNI 插件被 kubelet 调用,为 Pod 分配 IP 地址并配置网络接口。
  • eBPF 管理:编译、加载和卸载 eBPF 程序到内核,实现网络转发、负载均衡、安全策略等。
  • 策略执行:监听来自 Kubernetes API Server 的网络策略(NetworkPolicy)和 CiliumNetworkPolicy,并将其转化为 eBPF 映射表。
  • 身份管理:为本地 Pod 分配安全身份(Security Identity),用于后续的策略匹配。
调优要点: 在大型多租户集群中,Cilium Agent 的资源限制(CPU/内存)直接影响 Pod 启动速度和策略生效延迟。建议为 Agent 预留 0.5-1 核 CPU 和 512Mi-1Gi 内存,并开启 --preallocate-bpf-maps 以减少运行时映射表扩容开销。

3.2.2 Cilium Operator

Cilium Operator 是集群级别的控制平面组件,通常只运行一个副本(或高可用部署)。它不参与数据路径,而是负责全局协调任务。

职责 说明 多租户影响
身份分配 为整个集群的端点(Pod/Service)分配全局唯一的安全身份 ID。 租户隔离依赖身份标签的正确性,需确保身份不冲突。
IPAM 管理 管理 IP 地址池(CRD-based IPAM),处理 IP 分配与回收。 可为不同租户配置独立的 IP 池,实现地址域隔离。
策略 CRD 同步 将 CiliumNetworkPolicy 等 CRD 资源同步到所有节点的 Agent。 Operator 的同步延迟决定了策略生效的全局一致性。
KVStore 协调 当使用 etcd 作为状态存储时,负责与 etcd 交互。 KVStore 的性能瓶颈可能影响大规模集群的稳定性。

3.2.3 CNI 插件

Cilium 的 CNI 插件是一个轻量级的二进制文件(cilium-cni),由 kubelet 在创建 Pod 时调用。其工作流程如下:

  1. ADD 操作:kubelet 调用 CNI 插件,传入 Pod 的命名空间、名称和网络配置。
  2. IP 分配:插件通过 Cilium Agent 的 API 请求 IP 地址(来自 CRD-based IPAM 或 Kubernetes Node CIDR)。
  3. 接口创建:在 Pod 的网络命名空间中创建 veth 对,一端放入 Pod,另一端连接到主机的 cilium_host 网桥或直接挂载 eBPF 程序。
  4. eBPF 挂载:Agent 为 Pod 的接口挂载对应的 eBPF 程序(如 cil_from_container、cil_to_container),用于流量处理和策略执行。
  5. 路由注入:在 Pod 和主机路由表中添加必要的路由条目,确保流量能够到达正确的 eBPF 处理点。
性能对比: 与传统 iptables 模式相比,Cilium 的 CNI 插件在 Pod 创建延迟上通常有 30%-50% 的提升,因为 eBPF 避免了 iptables 规则链的线性遍历开销。

3.3 eBPF 数据路径

eBPF 数据路径是 Cilium 性能优势的根本来源。它通过在内核的多个钩子点(Hook Points)注入程序,实现网络包的拦截、处理和转发。

eBPF 数据路径流程图 eBPF 数据路径流程图 网络包到达 (NIC) XDP 钩子 (早期丢包/转发) TC Ingress 钩子 (策略检查) eBPF 核心处理 路由查找 / 负载均衡 / 策略匹配 / 封装解封 转发到目标 Pod/Node

关键 eBPF 钩子点说明:

  • XDP (eXpress Data Path):在网络驱动层之后、协议栈之前执行,适合 DDoS 防护和早期包过滤,性能极高。
  • TC (Traffic Control) Ingress/Egress:在协议栈内部执行,Cilium 在此实现大部分网络策略、负载均衡(如 Maglev)和封装(VXLAN/Geneve)。
  • Socket BPF:在 socket 层操作,用于 socket-level 的负载均衡和策略,减少上下文切换。

3.4 Hubble 可观测性组件

Hubble 是 Cilium 的可观测性层,利用 eBPF 程序自动捕获网络流量和事件,提供实时的服务依赖图、流量日志和指标监控。

3.4.1 Hubble 组件构成

组件 部署方式 功能
Hubble Agent 与 Cilium Agent 同节点运行 从 eBPF 映射表读取流量事件,生成流日志和指标。
Hubble Relay 集群级 Deployment 聚合所有 Agent 的数据,提供全局查询 API(gRPC)。
Hubble UI 可选 Deployment 基于 Relay API 的 Web 界面,展示服务依赖图和流量详情。
Hubble CLI 客户端工具 命令行工具 hubble observe,用于实时流量观察和调试。

3.4.2 多租户场景下的 Hubble 使用

在多租户环境中,Hubble 可以结合 Cilium 的身份标签进行流量过滤和审计:

示例命令: 观察特定租户(namespace=tenant-a)的流量
# 实时观察 tenant-a 命名空间下的所有流量
hubble observe --namespace tenant-a

# 观察从 tenant-a 到 tenant-b 的流量
hubble observe --from-namespace tenant-a --to-namespace tenant-b

# 查看特定 Pod 的 DNS 查询记录
hubble observe --pod web-0 --type l7 --protocol dns
注意: 在开启 Hubble 时,建议为每个租户配置独立的 Hubble 指标端点,避免租户间的可观测性数据互相泄露。可以通过 --hubble-metrics-server 和 Prometheus 的 relabel 配置实现。

3.5 组件交互流程总结

以下表格总结了核心组件在 Pod 创建和网络策略生效过程中的交互关系:

阶段 触发组件 参与组件 关键动作
Pod 创建 kubelet CNI 插件 → Cilium Agent → eBPF IP 分配、接口创建、eBPF 程序挂载
策略下发 用户/控制器 K8s API → Operator → Agent → eBPF Map 策略 CRD 同步、身份映射更新
网络通信 Pod 进程 eBPF 程序(XDP/TC/Socket) 包处理、策略匹配、转发/丢弃
可观测性 Hubble Agent eBPF Map → Hubble Agent → Relay → UI/CLI 流日志生成、指标聚合、可视化展示