3. Cilium与Hubble架构:Cilium Agent、Hubble Relay、Hubble UI的组件与数据流

Cilium 基于 eBPF 实现网络、安全和可观测性,而 Hubble 则是其原生的流量可视化层。理解 Cilium Agent、Hubble Relay 与 Hubble UI 三个核心组件的职责及数据流转,是进行节点池巡检与通信链路分析的基础。

3.1 核心组件与职责

下表梳理了三个组件的部署位置与核心功能:

组件 部署位置 核心职责
Cilium Agent 每个 Kubernetes 节点(DaemonSet) 管理 eBPF 程序、实现网络策略、服务负载均衡;同时作为 Hubble 的本地数据采集端点。
Hubble Relay 集群内(Deployment) 聚合所有 Cilium Agent 上报的流数据,提供全局一致的 API 查询接口。
Hubble UI 集群内(Deployment) 基于 Relay API 提供图形化服务依赖图与流量可视化界面。

3.2 组件数据流全景

下图展示了从 eBPF 内核事件到 Hubble UI 用户界面的完整数据流路径:

Cilium & Hubble 组件数据流架构 Cilium & Hubble 组件数据流架构 eBPF 内核程序 (XDP / TC hook) Cilium Agent (每节点 DaemonSet) Hubble Relay (集群级聚合) Hubble UI (图形化界面) eBPF 事件 gRPC 流 REST API 说明: Cilium Agent 通过 Unix Socket 暴露本地 Hubble gRPC 端点。

3.3 组件交互详解

3.3.1 Cilium Agent:数据采集的起点

  • eBPF 事件捕获:Agent 通过加载的 eBPF 程序(挂载于 XDP、TC、cgroup 等 hook)捕获网络数据包的五元组、DNS 请求、HTTP 头部等元数据。
  • 本地缓存与去重:Agent 在用户态维护一个环形缓冲区,对高频事件进行聚合与去重,降低 Relay 的负载。
  • gRPC 服务暴露:每个 Agent 在本地 Unix Socket(/var/run/cilium/hubble.sock)上提供 gRPC 服务,供 Relay 拉取。
巡检要点: 检查 Agent 的 Hubble 服务是否正常监听:
# 在任意节点执行
cilium status | grep Hubble
# 预期输出:Hubble:  OK  Observability:  Enabled

3.3.2 Hubble Relay:集群级聚合层

  • 节点发现:Relay 通过 Kubernetes API 自动发现所有运行 Cilium Agent 的节点。
  • 流数据拉取:Relay 并行向每个 Agent 的 gRPC 端点发起长连接,持续拉取流事件。
  • 全局排序与去重:Relay 根据时间戳对来自不同节点的流进行全局排序,并去除重复事件。
  • 统一 API 暴露:对外提供 gRPC 和 REST 接口,支持按命名空间、Pod、标签、IP 等维度过滤查询。

3.3.3 Hubble UI:可视化呈现

  • 服务依赖图:自动绘制集群内 Pod 之间的通信拓扑,显示流量方向、协议、速率。
  • 实时流查询:支持按时间范围、源/目的 IP、端口等条件过滤并查看原始流日志。
  • 策略可视化:叠加显示 CiliumNetworkPolicy 规则,直观展示哪些流量被允许或拒绝。

3.4 数据流关键路径总结

以下步骤概括了一次完整的数据流从产生到可视化的过程:

  1. 内核捕获:eBPF 程序在网卡驱动层或网络栈中捕获数据包。
  2. Agent 处理:Cilium Agent 从 eBPF map 中读取事件,提取元数据并写入本地缓存。
  3. Relay 聚合:Hubble Relay 通过 gRPC 流从所有 Agent 拉取数据,执行全局排序。
  4. UI 展示:Hubble UI 调用 Relay 的 REST API,将数据渲染为服务依赖图或流日志列表。
常见问题: 如果 Hubble UI 显示“No data”,通常原因包括:
- Cilium Agent 未启用 Hubble(检查 --enable-hubble=true 参数)。
- Hubble Relay 无法连接 Agent(检查网络策略或节点防火墙是否放行 gRPC 端口 4244)。
- 集群内没有实际流量产生(尝试用 hubble observe 命令手动验证)。

3.5 组件通信端口一览

组件 端口/协议 用途
Cilium Agent Unix Socket 本地 Hubble gRPC 端点
Hubble Relay 4245 (gRPC) 对外提供流查询 API
Hubble UI 80/443 (HTTP/S) Web 界面访问