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 用户界面的完整数据流路径:
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 数据流关键路径总结
以下步骤概括了一次完整的数据流从产生到可视化的过程:
- 内核捕获:eBPF 程序在网卡驱动层或网络栈中捕获数据包。
- Agent 处理:Cilium Agent 从 eBPF map 中读取事件,提取元数据并写入本地缓存。
- Relay 聚合:Hubble Relay 通过 gRPC 流从所有 Agent 拉取数据,执行全局排序。
- UI 展示:Hubble UI 调用 Relay 的 REST API,将数据渲染为服务依赖图或流日志列表。
常见问题: 如果 Hubble UI 显示“No data”,通常原因包括:
- Cilium Agent 未启用 Hubble(检查
- Hubble Relay 无法连接 Agent(检查网络策略或节点防火墙是否放行 gRPC 端口 4244)。
- 集群内没有实际流量产生(尝试用
- 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 界面访问 |