4. Hubble 架构深度解析:Hubble Relay、Hubble UI、Hubble CLI 组件交互与数据流

Hubble 是 Cilium 原生的可观测性层,基于 eBPF 实现无侵入的流量捕获与策略审计。其架构由三个核心组件构成:Hubble Relay、Hubble UI 和 Hubble CLI。理解这三者的角色、交互方式以及数据流转路径,是进行故障排查和自动化回滚的基础。

4.1 核心组件角色与职责

下表总结了三个组件在 Hubble 生态中的定位与关键职责:

组件 部署位置 核心职责 对外接口
Hubble Relay Kubernetes 集群内(Deployment) 聚合所有 Cilium Agent 的观测数据;提供全局服务地图;处理服务发现与缓存 gRPC API(端口 4245)
Hubble UI Kubernetes 集群内(Deployment) 基于 Relay 提供可视化服务拓扑、流量视图、策略审计界面 HTTP/HTTPS(前端端口 8081)
Hubble CLI 客户端/运维节点(二进制或容器) 通过 gRPC 连接 Relay 或直接连接 Agent,执行实时抓包、流查询、指标导出 gRPC(连接 Relay 或 Agent)
关键区别:Relay 是集群级聚合层,UI 和 CLI 都是它的消费者。CLI 也可以绕过 Relay 直接连接单个 Agent 的本地 gRPC 端点(端口 4244),用于节点级细粒度调试。

4.2 组件交互与数据流架构

下图展示了 Hubble 组件之间的通信路径与数据流向:

Hubble 组件交互与数据流架构图 Hubble 组件交互与数据流 Kubernetes 节点层(Cilium Agent + Hubble 嵌入式服务) Cilium Agent 1 eBPF 捕获 / gRPC 4244 Cilium Agent 2 eBPF 捕获 / gRPC 4244 Cilium Agent N eBPF 捕获 / gRPC 4244 Hubble Relay 聚合 / 缓存 / 服务发现 / gRPC 4245 gRPC 流(实时推送) Hubble UI 可视化 / 拓扑 / 策略审计 Hubble CLI hubble observe / status / metrics gRPC 查询 gRPC 查询 数据流说明: 1. 每个 Cilium Agent 内嵌 Hubble 服务,通过 eBPF 捕获流数据,以 gRPC 流实时推送至 Relay。 2. Relay 聚合全集群数据,提供统一查询接口。UI 和 CLI 均通过 Relay 获取全局视图。

4.3 数据流详细路径

Hubble 的数据流遵循“采集 → 聚合 → 消费”的三层模型。以下是每个阶段的详细说明:

  1. 采集层(Cilium Agent)
    • 每个 Kubernetes 节点上的 Cilium Agent 通过 eBPF 程序挂载到网络钩子(XDP、TC、cgroup)捕获数据包。
    • eBPF Map 存储流元数据(五元组、标签、Verdict、TCP 标志等)。
    • Hubble 嵌入式服务定期从 eBPF Map 读取数据,封装为 gRPC 流(Flow 消息)。
    • Agent 本地 gRPC 端点监听 :4244,支持直接连接调试。
  2. 聚合层(Hubble Relay)
    • Relay 通过 --relay-agent-address 发现所有 Agent,建立双向 gRPC 流。
    • Relay 维护全局服务缓存(ServiceCache),将 Pod IP 映射到 Kubernetes Service。
    • Relay 对来自多个 Agent 的流进行去重、排序、合并,提供一致的时间序视图。
    • Relay 自身暴露 gRPC 端点 :4245,支持过滤、分页、跟随(Follow)模式。
  3. 消费层(UI / CLI)
    • Hubble UI:通过 gRPC 查询 Relay 获取流数据,渲染为服务拓扑图、流量列表、策略审计日志。UI 后端(Go)将 gRPC 响应转换为 JSON API,前端(React)负责可视化。
    • Hubble CLI:直接调用 Relay 的 gRPC 接口,支持 hubble observe(实时流)、hubble status(节点健康)、hubble metrics(Prometheus 指标导出)。

4.4 关键交互协议:gRPC 流

Hubble 组件间通信全部基于 gRPC,使用 Protocol Buffers 定义消息格式。核心的 RPC 定义如下:

// 定义在 hubble.proto 中的关键 RPC
service Observer {
  // 获取流列表(支持过滤、分页、排序)
  rpc GetFlows(GetFlowsRequest) returns (stream GetFlowsResponse);

  // 获取 Agent 状态
  rpc GetAgentEvents(GetAgentEventsRequest) returns (stream GetAgentEventsResponse);

  // 获取调试事件
  rpc GetDebugEvents(GetDebugEventsRequest) returns (stream GetDebugEventsResponse);

  // 获取节点状态
  rpc GetNodes(GetNodesRequest) returns (GetNodesResponse);

  // 获取服务映射
  rpc GetNamespaces(GetNamespacesRequest) returns (GetNamespacesResponse);
}
故障排查要点:当 Hubble UI 或 CLI 无数据时,优先检查 Relay 到 Agent 的 gRPC 连接。使用 hubble status 查看各节点 Agent 的连通性;如果某个 Agent 显示 Unreachable,说明 Relay 无法建立 gRPC 流,常见原因为网络策略阻断或 Agent 进程异常。

4.5 组件交互的故障模式

下表列出了组件交互中常见的故障模式及其影响:

故障点 现象 影响范围 排查命令
Agent 本地 gRPC 端口 4244 不可达 Relay 日志报错 connection refused 该节点流量缺失 hubble status 查看节点状态
Relay 到 Agent 网络策略阻断 Relay 无法建立 gRPC 流 全集群流量不可见 cilium connectivity test
Relay 服务缓存过期 UI 显示错误的 Service 映射 拓扑图异常 重启 Relay Pod
UI 后端到 Relay 连接超时 UI 页面加载失败或空白 可视化不可用 kubectl logs -n kube-system hubble-ui-xxx
CLI 指定错误的 Relay 地址 hubble observe 返回 Unavailable CLI 无法查询 检查 --server 参数

4.6 架构设计要点总结

  • 无状态消费:UI 和 CLI 不直接连接 eBPF,所有数据通过 Relay 聚合,消费端无状态,便于水平扩展。
  • gRPC 双向流:Agent 到 Relay 使用 gRPC 流推送,Relay 到消费者也使用流,实现低延迟实时观测。
  • 服务发现解耦:Relay 通过 Kubernetes API 动态发现 Agent,无需静态配置,适应集群扩缩容。
  • 故障隔离:单个 Agent 故障不影响其他节点数据,Relay 会标记该节点为 Unreachable 并继续服务。
生产环境建议:确保 Hubble Relay 的 --relay-agent-address 配置正确,且 Relay 有足够的 CPU 和内存处理聚合流量。在大型集群(>100 节点)中,建议为 Relay 分配至少 2 核 CPU 和 4GB 内存,并启用 --flush-interval 参数控制缓存刷新频率。