2. Cilium与Hubble生态:Cilium项目介绍、Hubble组件架构、eBPF制品库的概念与作用

2.1 Cilium项目介绍

Cilium 是一个基于 eBPF 的开源云原生网络、安全与可观测性项目,专为 Kubernetes 等容器编排平台设计。它利用 eBPF 在内核层面动态注入程序,替代了传统的 iptables 或用户态代理模式,从而提供高性能、可扩展的网络策略与流量管理能力。

Cilium 的核心能力:

  • 网络连接:通过 eBPF 实现 Pod、Service、外部网络之间的高效转发,支持 VXLAN、Geneve、直接路由等多种数据路径。
  • 网络策略:基于身份(Identity)而非 IP 地址的 L3/L4/L7 安全策略,支持 HTTP、gRPC、Kafka 等协议过滤。
  • 负载均衡:在 XDP 或 tc 层实现高性能 Service 负载均衡,替代 kube-proxy。
  • 可观测性:通过 Hubble 组件提供集群内流量的实时可视化与监控。
  • 加密与隧道:支持 WireGuard 或 IPsec 透明加密。
关键优势: Cilium 将 eBPF 程序直接附着到网络钩子点(如 XDP、tc、cgroup),避免了传统 iptables 规则链的线性匹配开销,在延迟和吞吐量上均有显著提升。

2.2 Hubble组件架构

Hubble 是 Cilium 生态中的可观测性层,专门用于实时捕获、处理和展示 Kubernetes 集群中的网络流量。它利用 Cilium 已加载的 eBPF 程序来收集元数据,无需额外侵入式探针。

Hubble 架构组件:

组件 角色 部署位置
Hubble Agent 运行在每个节点上,从 Cilium 的 eBPF map 中读取流量事件,并暴露 gRPC 服务。 DaemonSet(每个节点一个)
Hubble Relay 聚合所有 Agent 的数据,提供集群范围的查询接口,支持时间戳排序和去重。 Deployment(通常 1-3 副本)
Hubble UI 基于 Web 的可视化界面,展示服务依赖图、流量流向、策略命中情况。 Deployment(可选)
Hubble CLI 命令行工具,用于实时观察流量、过滤事件、导出流日志。 用户终端

数据流路径:

  1. Cilium Agent 通过 eBPF 程序捕获网络事件,写入内核 eBPF map。
  2. Hubble Agent 定期从 eBPF map 中读取事件,并添加 Kubernetes 元数据(Pod 标签、Service 名等)。
  3. Hubble Relay 从所有 Agent 拉取数据,合并后对外提供统一 gRPC 接口。
  4. Hubble UI 或 CLI 通过 Relay 查询数据,生成可视化图表或流日志。
架构特点: Hubble 不直接加载 eBPF 程序,而是复用 Cilium 已挂载的程序。这种设计避免了重复的内核编程,同时保证了数据源的一致性。
Hubble 组件架构与数据流 Cilium Agent (eBPF 程序 + Map) Hubble Agent (读取 eBPF Map) Hubble Relay (聚合 & 排序) Hubble UI (可视化面板) Hubble CLI (命令行查询) 读取 eBPF 事件 gRPC 流 查询响应 查询响应 说明 1. Cilium Agent 通过 eBPF 程序捕获网络事件,写入内核 map。 2. Hubble Agent 读取 map 并添加 Kubernetes 元数据,通过 gRPC 上报给 Relay。 3. Hubble Relay 聚合多节点数据,提供集群级查询接口;UI/CLI 作为消费端。

2.3 eBPF制品库的概念与作用

eBPF制品库 是指用于存储、版本管理和分发 eBPF 程序及其相关元数据的仓库系统。在 Cilium 和 Hubble 的上下文中,制品库管理的内容包括:编译后的 eBPF 对象文件(.o)、BTF 类型信息、eBPF 程序源代码、加载配置以及策略模板。

核心作用:

作用维度 具体说明 示例场景
版本控制 追踪 eBPF 程序的不同版本,支持回滚和审计。 升级 Cilium 时保留旧版 eBPF 程序用于兼容性测试
一致性分发 确保集群中所有节点加载相同版本的 eBPF 程序。 通过容器镜像或 OCI 制品分发 eBPF 对象文件
依赖管理 管理 eBPF 程序依赖的内核头文件、BTF 信息、库文件。 为不同内核版本提供对应的 BTF 文件
安全扫描 对 eBPF 制品进行静态分析和漏洞检测。 检查 eBPF 程序是否包含不安全的辅助函数调用
CI/CD 集成 将 eBPF 程序的构建、测试、打包纳入持续集成流水线。 GitHub Actions 编译 eBPF 后推送至制品库
实践注意: eBPF 程序与内核版本紧密耦合。制品库中应同时存储目标内核的 BTF 信息,否则在非预期内核上加载可能导致程序验证失败或运行时崩溃。

在 Cilium/Hubble 中的具体体现:

  • Cilium 将 eBPF 程序编译为 ELF 对象文件,打包在容器镜像中,通过 DaemonSet 分发到各节点。
  • Hubble 不直接分发 eBPF 程序,但依赖 Cilium 的 eBPF map 布局,因此制品库需要保证 Cilium Agent 与 Hubble Agent 的版本匹配。
  • 社区正在推进 OCI 制品标准用于 eBPF 分发,使得 eBPF 程序可以像容器镜像一样被拉取和验证。
eBPF 制品库在 Cilium 工作流中的位置 eBPF 制品库 (OCI / 对象存储) CI/CD 流水线 (编译 + 测试 + 打包) Cilium Agent (加载 eBPF 程序) Hubble Agent (读取 eBPF Map) Kubernetes 集群 (节点运行时) 推送制品 拉取 eBPF 对象 拉取元数据 共享 eBPF Map 提供观测数据 关键流程 1. CI/CD 编译 eBPF 程序并推送至制品库,附带 BTF 和版本标签。 2. Cilium Agent 从制品库拉取匹配内核版本的 eBPF 对象,加载到内核。 3. Hubble Agent 通过共享的 eBPF Map 获取流量数据,无需独立加载程序。

2.4 三者关系总结

Cilium、Hubble 与 eBPF 制品库构成了一个完整的云原生网络可观测性闭环:

  • Cilium 是执行引擎,负责加载 eBPF 程序并实施网络策略。
  • Hubble 是观测层,复用 Cilium 的 eBPF 数据源,提供可视化与监控。
  • eBPF 制品库 是基础设施,确保 eBPF 程序的可追溯性、一致性和安全性。