3. Hubble 架构解析:Hubble Server、Hubble Relay、Hubble CLI 的数据流与组件交互

在 Cilium 集群中,Hubble 是构建在 eBPF 之上的可观测性层。它通过捕获节点上的网络流量与策略事件,提供细粒度的流量流向图、L3/L4/L7 可观测性以及安全事件审计能力。理解 Hubble 的组件架构与数据流,是进行节点池流量基线巡检的前提。

3.1 核心组件与职责

Hubble 由三个主要组件构成,它们各自运行在不同的进程上下文中,通过 gRPC 协议进行通信:

组件 部署位置 核心职责 数据来源
Hubble Server 每个 Cilium Agent 节点(DaemonSet) 从本地 Cilium Agent 的 eBPF Map 中读取流事件;提供本地 gRPC 服务 本地 eBPF Map(conntrack、policy、endpoint)
Hubble Relay 集群级 Deployment(通常 1-2 副本) 聚合所有 Hubble Server 的流数据;提供全局查询视图;缓存与去重 所有节点的 Hubble Server gRPC 流
Hubble CLI 用户终端 / CI/CD 环境 向 Hubble Relay 或直接向 Hubble Server 发起查询;输出 JSON/文本/流式数据 Hubble Relay 或 Hubble Server 的 gRPC 端点
关键认知: Hubble Server 是“数据生产者”,Hubble Relay 是“数据聚合器”,Hubble CLI 是“数据消费者”。在节点池巡检场景中,Hubble Relay 提供了跨节点的统一流量视图,是流量基线对比的核心入口。

3.2 组件交互与数据流路径

下图展示了 Hubble 三个组件之间的数据流关系,以及它们与 Cilium Agent、eBPF 内核层的交互方式:

Hubble 组件架构与数据流 Hubble 组件架构与数据流 eBPF 内核层(每个节点) eBPF Map:conntrack / policy / endpoint / ipcache Cilium Agent 进程(每个节点) 监听 eBPF Map 变化 → 生成 Flow / Event 通过 Unix Domain Socket 暴露给 Hubble Server Hubble Server gRPC :4244 Hubble Relay(集群级) 聚合所有节点流 → 去重 → 缓存 → 统一 gRPC :4245 Hubble CLI / API 消费者 hubble observe / hubble status / JSON 输出 Hubble CLI 也可直连 Hubble Server(调试模式)
数据流要点:
  • 节点内路径: eBPF Map → Cilium Agent 事件管道 → Hubble Server(Unix Socket)→ gRPC 流
  • 集群路径: 各节点 Hubble Server → Hubble Relay(gRPC 双向流)→ Hubble CLI / 外部系统
  • 巡检场景: Hubble CLI 通过 --server 参数指向 Hubble Relay 的 Service IP(通常为 hubble-relay.kube-system.svc.cluster.local:4245),获取全局流量基线

3.3 Hubble Server:节点级数据生产者

Hubble Server 是每个节点上的核心数据源。它不直接读取 eBPF Map,而是通过 Cilium Agent 的 事件监听器(Event Listener) 获取流数据:

# Hubble Server 启动参数示例(实际由 Cilium Agent 自动管理)
hubble-server \
  --listen-address :4244 \
  --unix-socket /var/run/cilium/hubble.sock \
  --metrics-server :9091
特性 说明
数据来源 Cilium Agent 内部事件管道(基于 eBPF perf_event_output)
暴露接口 gRPC 服务(TCP :4244)+ Unix Domain Socket(本地调试)
数据范围 仅限本节点上的 endpoint 流量与策略事件
缓存策略 环形缓冲区(Ring Buffer),默认保留最近 1GB 或 5 分钟数据
关键指标 hubble_flows_processed_total、hubble_ring_buffer_size
节点池巡检注意: 当节点池中的某个节点发生升级时,该节点上的 Hubble Server 会随 Cilium Agent 一起重启。重启期间(通常 10-30 秒),该节点的流数据会中断。Hubble Relay 会自动处理这种断连,并在节点恢复后重新建立 gRPC 流。巡检脚本需要关注 hubble_relay_peer_status 指标,确认所有节点都已重新连入 Relay。

3.4 Hubble Relay:集群级数据聚合器

Hubble Relay 是集群可观测性的“大脑”。它维护一个 节点列表,与每个节点的 Hubble Server 建立 gRPC 双向流,并将所有流数据合并为一个统一的查询接口:

# Hubble Relay 启动参数示例
hubble-relay \
  --listen-address :4245 \
  --dial-targets k8s://cilium:4244 \
  --cluster-name my-cluster \
  --sort-buffer-duration 5s \
  --sort-buffer-limit 10000
功能 实现方式 巡检场景价值
节点发现 通过 Kubernetes API 监听 Cilium Agent Pod 变化 自动感知节点池扩缩容与升级导致的 Agent 重启
流聚合 多路 gRPC 流合并,按时间戳排序 提供跨节点的统一流量视图,无需逐个节点查询
去重 基于 Flow ID 与时间戳的滑动窗口去重 避免节点间重复流(如 Service 转发场景)干扰基线计算
缓存 内存中维护最近流数据的排序缓冲区 支持 --last 参数快速获取最近 N 条流
健康检查 gRPC 健康探测 + 节点状态指标 hubble_relay_peer_status{status="connected"} 确认节点池完整性

3.5 Hubble CLI:查询与数据消费

Hubble CLI 是运维人员与自动化巡检脚本的主要交互工具。它支持两种连接模式:

  • Relay 模式(推荐): hubble observe --server hubble-relay:4245,获取全局流量视图
  • Server 模式(调试): hubble observe --server node-ip:4244,获取单节点流量视图
# 巡检场景常用命令示例

# 1. 查看最近 100 条流(JSON 格式,便于程序解析)
hubble observe --server hubble-relay:4245 --last 100 -o json

# 2. 按节点过滤(升级节点池巡检)
hubble observe --server hubble-relay:4245 \
  --node-pool upgraded-pool \
  --since 5m -o json

# 3. 查看流量速率(基线对比)
hubble observe --server hubble-relay:4245 \
  --since 1m --verdict DROPPED \
  --output flows-json | jq 'length'
巡检脚本最佳实践: 在节点池升级前后,使用 Hubble CLI 的 --since 参数固定时间窗口(如 5 分钟),分别导出 JSON 格式的流量数据。通过对比 source.ip、destination.ip、verdict、l4.policy 等字段的分布,可以快速发现升级导致的流量异常。

3.6 组件交互总结

下表总结了三个组件在节点池升级巡检中的角色与数据流方向:

组件 巡检角色 数据流方向 关键端口 故障影响
Hubble Server 节点级数据源 eBPF → Agent → Server → Relay TCP 4244 单节点流数据缺失
Hubble Relay 全局聚合与缓存 Server → Relay → CLI TCP 4245 全局查询不可用
Hubble CLI 数据消费与基线导出 CLI → Relay / Server 客户端端口 巡检脚本无法获取数据