2. Cilium与Hubble生态:Cilium项目架构、Hubble作为可观测性层的角色、Cilium与eBPF的关系

2.1 Cilium项目架构概览

Cilium 是一个基于 eBPF 的云原生网络、安全与可观测性项目,专为 Kubernetes 等容器编排平台设计。其核心思想是利用 eBPF 在内核中动态注入程序,替代传统的 iptables 或用户态代理,实现高性能的数据平面与控制平面。

Cilium 的架构分为 数据平面 和 控制平面 两大层次,中间通过 Cilium Agent 进行桥接。

架构核心组件:
  • Cilium Agent (DaemonSet): 运行在每个 Kubernetes 节点上,负责与 kube-apiserver 通信,监听 Pod/Service/NetworkPolicy 变化,编译并加载 eBPF 程序到节点内核。
  • Cilium Operator: 处理集群级别的任务,如 IPAM(IP 地址管理)、Service 负载均衡器的协调、多集群网络等。
  • Cilium CNI Plugin: 实现 CNI 接口,在 Pod 创建时配置网络接口和 eBPF 规则。
  • eBPF Data Path: 直接运行在内核中的 eBPF 程序,负责数据包转发、负载均衡、网络策略执行、流量加密(WireGuard/IPsec)等。
  • Hubble Server/Relay: 可观测性层,从 Cilium Agent 收集 eBPF 事件流,提供集群范围的流量可视化和监控。
关键设计理念: Cilium 将网络策略、负载均衡、可观测性全部下沉到 eBPF 层,避免了 iptables 规则链的线性遍历和 conntrack 的性能瓶颈,同时实现了内核级别的安全隔离。

下表总结了 Cilium 各组件在集群中的部署形态与职责:

组件 部署类型 核心职责 与 eBPF 的关系
Cilium Agent DaemonSet 管理 eBPF 程序生命周期、策略解析、端点管理 直接编译和加载 eBPF 程序
Cilium Operator Deployment IPAM、Service 协调、多集群 间接,通过 Agent 下发配置
Hubble Server DaemonSet (嵌入 Agent) 采集 eBPF 事件、生成流日志 从 eBPF map 和 perf event 读取数据
Hubble Relay Deployment 聚合多节点 Hubble Server 数据 无直接 eBPF 交互
eBPF Data Path 内核态 数据包处理、策略执行、负载均衡 核心执行体

2.2 Cilium 与 eBPF 的深度关系

Cilium 是 eBPF 技术在云原生领域最成功的实践者之一。理解两者的关系,需要从 eBPF 的能力边界 和 Cilium 的抽象层次 两个维度切入。

  • eBPF 提供内核可编程性: eBPF 允许在 Linux 内核的安全上下文中运行沙箱程序,无需修改内核源码或加载内核模块。Cilium 利用 eBPF 的 XDP、TC (Traffic Control)、cgroup/skb、sockops 等 hook 点,实现网络数据包的拦截与处理。
  • Cilium 封装 eBPF 复杂性: 直接编写 eBPF 程序需要深入理解内核数据结构、BPF 验证器限制、map 类型等。Cilium 通过 Go 语言编写的 Agent 和高级配置(YAML/CLI),将 eBPF 的复杂性封装起来,用户只需声明网络策略或 Service,Cilium 自动生成并加载对应的 eBPF 代码。
  • eBPF Map 作为数据共享通道: Cilium 大量使用 eBPF map(如哈希 map、数组 map、LRU map)在内核态和用户态之间共享数据。例如,cilium_ct4 map 存储连接跟踪信息,cilium_lb4_services map 存储负载均衡后端列表。Hubble 通过读取这些 map 和订阅 perf event 来获取流量元数据。
性能关键点: Cilium 的 eBPF 程序必须通过内核 BPF 验证器的严格检查。验证器会确保程序无循环、无越界访问、执行路径有限。Cilium 在生成 eBPF 代码时,会针对不同内核版本进行优化,避免使用验证器不支持的特性。升级内核时,需同步验证 Cilium 的兼容性。

以下 SVG 展示了 Cilium 如何利用 eBPF 在 Kubernetes 节点上构建完整的数据路径:

Cilium eBPF 数据路径架构(单节点视图) 用户空间 (User Space) Cilium Agent | Hubble Server | kubelet | 用户态代理 (Envoy) 内核空间 (Kernel Space) XDP / TC eBPF 数据包转发 & 负载均衡 Cilium Network Policy L3/L4/L7 策略执行 eBPF Maps CT / LB / Policy Linux 内核网络栈 (Netfilter / conntrack / TCP/IP) 硬件层 (NIC / veth pair / overlay tunnel) 说明:eBPF 程序挂载在 XDP/TC hook 点,优先于内核网络栈处理数据包; 策略和负载均衡决策直接在内核态完成,避免上下文切换。

2.3 Hubble:Cilium 的可观测性层

Hubble 是 Cilium 生态中专门负责 可观测性 的组件,它并非独立项目,而是深度集成在 Cilium 内部。Hubble 的核心价值在于将 eBPF 采集的底层网络事件,转化为开发者可理解的、具有 Kubernetes 语义的流日志和指标。

2.3.1 Hubble 的角色定位

  • 数据采集器: Hubble Server 运行在每个节点上,通过 Cilium Agent 暴露的 gRPC 接口,订阅 eBPF 产生的 perf_event 和 tracepoint 数据。它捕获每一次网络连接的建立、数据包传输、策略命中/拒绝事件。
  • 上下文增强器: 原始 eBPF 事件只包含 IP 地址、端口、协议号等内核级信息。Hubble 将这些信息与 Kubernetes API 中的 Pod、Service、Namespace、Label 进行关联,输出类似 frontend-xxx 访问 backend-yyy:80 (TCP) 被策略 allow-l7 允许 的可读日志。
  • 数据聚合与查询: Hubble Relay 作为集群范围的聚合层,从所有节点的 Hubble Server 拉取数据,提供统一的 gRPC 和 REST API。用户可以通过 hubble observe CLI 或 Hubble UI 进行实时流量查询、过滤和监控。
与 Cilium 的集成方式: Hubble Server 默认作为 Cilium Agent 的 sidecar 进程运行(同一 Pod 内),共享 Cilium 的 eBPF map 文件描述符。这种设计避免了额外的数据拷贝,使得 Hubble 能够以近乎零开销的方式读取 eBPF 事件。

2.3.2 Hubble 的架构组件

组件 功能 数据流
Hubble Server 节点级事件采集、缓存、gRPC 服务 eBPF perf_event → Hubble Server → 内存缓存
Hubble Relay 集群级聚合、去重、排序、API 暴露 Hubble Server (gRPC) → Hubble Relay → 外部客户端
Hubble UI 基于 Web 的流量可视化界面 Hubble Relay (REST) → Hubble UI → 浏览器
hubble CLI 命令行流量观察工具 Hubble Relay (gRPC) → 终端
Hubble Exporter 将 Hubble 指标转换为 Prometheus 格式 Hubble Server → Prometheus

2.3.3 Hubble 与 eBPF 的数据流

以下 SVG 展示了从 eBPF 事件产生到 Hubble UI 展示的完整数据流:

Hubble 数据流:从 eBPF 事件到可视化 K8s 节点 1 eBPF 程序 Hubble Server perf_event / eBPF map K8s 节点 2 eBPF 程序 Hubble Server perf_event / eBPF map K8s 节点 N eBPF 程序 Hubble Server perf_event / eBPF map Hubble Relay (集群聚合层) gRPC 流聚合 · 去重 · 排序 · 上下文增强 Hubble CLI hubble observe Hubble UI Web 可视化 Prometheus 指标监控

2.4 三者关系总结

eBPF、Cilium、Hubble 三者构成了一个从内核能力到用户可观测性的完整技术栈:

  • eBPF 是底层引擎,提供内核级的数据包处理、策略执行和事件采集能力。
  • Cilium 是上层框架,利用 eBPF 实现高性能网络和安全策略,同时封装了 eBPF 的复杂性,提供 Kubernetes 原生的声明式 API。
  • Hubble 是可观测性层,专门消费 Cilium 暴露的 eBPF 事件,将其转化为具有业务语义的流日志、指标和拓扑图。
生产环境最佳实践:
  • 启用 Hubble 时,确保 Cilium Agent 的 --enable-hubble 和 --enable-hubble-export 参数正确配置。
  • 对于大规模集群(>100 节点),建议为 Hubble Relay 分配独立的资源(CPU: 2-4 核,内存: 4-8 GB),并启用 gRPC 压缩。
  • 使用 hubble export 将流日志持久化到对象存储(如 S3、GCS),用于审计和离线分析。
  • 监控 Hubble Server 的 hubble_events_total 和 hubble_drop_total 指标,快速定位丢包或策略拒绝问题。