4. Hubble Server 与 Relay:数据采集、聚合转发与 gRPC 通信

在 Hubble 的架构中,Hubble Server 与 Hubble Relay 构成了数据面与控制面的核心枢纽。Server 负责从 eBPF 数据源采集流日志与指标,Relay 则负责将分散的 Server 数据聚合、缓存并转发给外部消费者(如 UI、CLI、告警系统)。两者通过 gRPC 协议实现高效、双向的流式通信。

4.1 Hubble Server:节点级数据采集

Hubble Server 是一个运行在每个 Kubernetes 节点上的守护进程(通常以 DaemonSet 部署),直接对接节点内的 Cilium eBPF 程序。它通过 Unix Domain Socket 或本地 TCP 端口暴露 gRPC 服务,供同节点的 Hubble Relay 或 CLI 工具访问。

组件 职责 数据来源 输出接口
Hubble Server 节点级流日志采集、L3/L4/L7 元数据解析、指标暴露 Cilium eBPF Map、perf_event 环形缓冲区 gRPC Observer / Recorder 服务
eBPF 数据源 内核态捕获网络包、跟踪 TCP/UDP/HTTP/DNS 事件 TC 钩子、XDP 钩子、Socket 追踪 perf_event 或 BPF Map 共享内存
关键采集流程: eBPF 程序在钩子点生成事件 → 写入 perf_event 环形缓冲区 → Hubble Server 用户态轮询读取 → 解析为 Flow 结构体 → 通过 gRPC 流推送。

4.2 Hubble Relay:聚合、缓存与转发

Hubble Relay 是一个中心化组件(通常部署 1~2 个副本),负责从所有 Hubble Server 拉取流数据,执行去重、排序、聚合,并提供统一的查询接口。Relay 的存在使得上层消费者无需感知节点拓扑变化。

  • 聚合策略: 按时间窗口(默认 1s)合并来自不同 Server 的相同 Flow,消除重复。
  • 缓存机制: 内存中维护一个环形缓冲区(默认 1h 窗口),支持历史回溯查询。
  • 转发目标: Hubble UI、hubble observe CLI、Prometheus Metrics、外部告警 Webhook。
生产建议: Relay 的内存消耗与节点数、流速率正相关。建议为 Relay 配置 2~4 CPU 和 4~8 GB 内存,并启用 --flow-buffer-size 参数限制最大缓存流数。

4.3 gRPC 通信机制

Hubble 的整个数据管道基于 gRPC 双向流(Bidirectional Streaming)构建。Server 与 Relay 之间、Relay 与 UI 之间均使用 Protocol Buffers 定义的 Observer 服务。

gRPC 服务 方法 方向 用途
Observer GetFlows Server → Relay (流式) 实时推送流日志
Observer GetAgentEvents Server → Relay (流式) 推送 Agent 状态变更事件
Observer GetNodes Relay → 消费者 (Unary) 查询节点列表
Recorder Record 消费者 → Server (控制) 启动/停止 pcap 抓包
注意: gRPC 连接默认使用 TLS 加密。在非生产环境可通过 --tls=false 禁用,但生产环境必须配置证书,防止流数据被中间人窃听。

4.4 架构总览:Server ↔ Relay 数据流

下图展示了从 eBPF 内核事件到 Hubble Relay 聚合输出的完整数据路径:

Hubble Server ↔ Relay 数据流架构 Hubble Server ↔ Relay 数据流架构 eBPF 内核钩子 TC / XDP / Socket perf_event Hubble Server 节点级采集 & 解析 gRPC 双向流 Hubble Relay 聚合 / 缓存 / 排序 消费者 / 下游组件 Hubble UI hubble observe CLI 告警 / Webhook gRPC 通信关键特征 • 使用 Protocol Buffers (protobuf) 序列化,传输效率高、带宽占用低 • 双向流模式:Server 持续推送 Flow,Relay 可动态调整过滤条件 • 内置 TLS 加密与身份认证,支持 mTLS 双向证书校验 • 支持流控(Flow Control)与背压(Backpressure),防止消费者过载

4.5 关键配置参数

以下为 Hubble Server 与 Relay 在生产环境中的常用配置项:

组件 参数 默认值 说明
Server --listen-grpc unix:///var/run/hubble.sock gRPC 监听地址,建议使用 Unix Socket 减少开销
Server --max-flows 4095 节点级最大缓存流数,超出后丢弃旧流
Relay --server k8s:// 自动发现所有 Hubble Server 端点
Relay --flow-buffer-size 100000 全局流缓冲区大小,影响历史查询深度
Relay --sort-buffer-len 100 排序窗口长度,越大排序越精确但延迟增加
性能基准: 在 100 节点集群中,每个 Server 处理约 5000 flows/s,Relay 聚合后输出约 3000 flows/s(去重后)。gRPC 单连接吞吐可达 200 Mbps,CPU 占用 < 0.5 核。

4.6 故障排查与告警联动

当 Relay 与 Server 之间的 gRPC 连接中断时,Hubble 提供以下检测与恢复机制:

  • 健康检查: Relay 定期向每个 Server 发送 GetNodes Unary 请求,超时 5s 标记节点为不可用。
  • 自动重连: gRPC 客户端内置指数退避重试(初始 1s,最大 30s)。
  • 告警指标: Prometheus 指标 hubble_relay_connections_failed_total 和 hubble_server_flows_dropped_total 可直接对接告警引擎。
联动示例: 当 hubble_relay_connections_failed_total 在 5 分钟内持续 > 0,触发告警 → 自动拉起诊断 Job → 收集 Server 日志与 gRPC 连接状态 → 输出故障分析报告。