3. Cilium 架构与核心组件解析
Cilium 的架构设计围绕 eBPF(extended Berkeley Packet Filter)技术展开,将数据平面与控制平面解耦,同时提供强大的可观测性能力。理解其核心组件——Cilium Agent、Cilium Operator、CNI 插件、eBPF 数据路径以及 Hubble——是进行多租户网络调优的基础。
3.1 整体架构概览
下图展示了 Cilium 在 Kubernetes 集群中的核心组件及其交互关系。数据平面通过 eBPF 程序直接在内核中处理网络包,控制平面则负责策略下发与状态同步。
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 时调用。其工作流程如下:
- ADD 操作:kubelet 调用 CNI 插件,传入 Pod 的命名空间、名称和网络配置。
- IP 分配:插件通过 Cilium Agent 的 API 请求 IP 地址(来自 CRD-based IPAM 或 Kubernetes Node CIDR)。
- 接口创建:在 Pod 的网络命名空间中创建 veth 对,一端放入 Pod,另一端连接到主机的 cilium_host 网桥或直接挂载 eBPF 程序。
- eBPF 挂载:Agent 为 Pod 的接口挂载对应的 eBPF 程序(如
cil_from_container、cil_to_container),用于流量处理和策略执行。 - 路由注入:在 Pod 和主机路由表中添加必要的路由条目,确保流量能够到达正确的 eBPF 处理点。
性能对比: 与传统 iptables 模式相比,Cilium 的 CNI 插件在 Pod 创建延迟上通常有 30%-50% 的提升,因为 eBPF 避免了 iptables 规则链的线性遍历开销。
3.3 eBPF 数据路径
eBPF 数据路径是 Cilium 性能优势的根本来源。它通过在内核的多个钩子点(Hook Points)注入程序,实现网络包的拦截、处理和转发。
关键 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 | 流日志生成、指标聚合、可视化展示 |