Cilium 与 Hubble 架构:数据平面与观测平面

在深入排查镜像拉取网络流量故障之前,必须理解 Cilium 与 Hubble 的架构分层。Cilium 本身是一个基于 eBPF 的数据平面,负责网络策略、负载均衡和安全;而 Hubble 则是构建在 Cilium 之上的可观测性平面,专门用于捕获、记录和展示流量。两者共享 eBPF 内核技术栈,但职责分离清晰。

2.1 核心组件总览

Cilium 与 Hubble 的部署通常以 DaemonSet 形式运行在 Kubernetes 集群的每个节点上。下表列出了核心组件及其职责:

组件 所属平面 运行模式 核心职责
Cilium Agent 数据平面 DaemonSet (cilium-agent) 管理 eBPF 程序、实现网络策略、Service 负载均衡、IPAM
Cilium Operator 控制平面 Deployment 处理集群级任务(如 IP 分配、身份管理)
Hubble Relay 观测平面 Deployment 聚合各节点 Hubble 观测数据,提供集群级 API
Hubble UI 观测平面 Deployment 可视化服务依赖图与流量流转
Hubble CLI 观测平面 二进制工具 命令行查询流量、过滤事件、导出流日志
排查要点: 当镜像拉取出现网络问题时,首先确认 cilium-agent Pod 是否健康运行,因为它是 eBPF 数据路径的守护进程。若 Agent 异常,所有节点网络都将中断。

2.2 数据平面:Cilium 与 eBPF 内核技术

Cilium 的数据平面完全构建在 eBPF(extended Berkeley Packet Filter)之上。eBPF 允许用户在 Linux 内核中安全地运行沙箱程序,而无需修改内核源码或加载内核模块。Cilium 利用 eBPF 在数据路径的关键钩子点(Hook Points)注入程序,实现网络转发、策略执行和观测数据采集。

下图展示了 Cilium 数据平面在内核中的主要 eBPF 钩子位置及数据流路径:

Cilium 数据平面 eBPF 钩子与数据流 用户空间:Cilium Agent / 应用容器 内核空间 eBPF 钩子 XDP (网卡驱动层) 最早包处理点 TC Ingress 网络协议栈入口 策略执行 L3/L4/L7 Socket BPF 应用层连接管理 TC Egress 出站流量封装 说明:每个钩子点都挂载了 Cilium 编译的 eBPF 程序,实现转发、策略与观测数据采集
关键理解: 镜像拉取流量从容器网卡出发,依次经过 XDP(可选)、TC Ingress、策略执行、Socket BPF,最终到达应用。Cilium 在每个钩子点都可以采集流量元数据,供 Hubble 使用。

2.3 观测平面:Hubble 的架构与数据流

Hubble 作为 Cilium 的可观测性层,本身不参与数据转发。它通过 eBPF 程序在内核中被动监听事件,并将这些事件通过 perf ring buffer 或 BPF map 传递给用户空间的 Hubble Agent。Hubble Agent 再通过 gRPC 暴露流日志和服务映射关系。

下图展示了 Hubble 观测平面的组件协作关系:

Hubble 观测平面架构与数据流 内核 eBPF 事件源 perf ring buffer / BPF map → 事件通知 Hubble Agent (每个节点 DaemonSet) 监听 eBPF 事件,缓存流日志,暴露 gRPC 端点 Hubble Relay (集群级聚合) 聚合所有节点流日志,提供统一查询 API Hubble UI 可视化服务依赖图 Hubble CLI 命令行流日志查询
排查陷阱: 如果 Hubble Relay 未正确配置或网络不通,Hubble UI 和 CLI 将无法获取跨节点的流量信息,导致镜像拉取故障的观测范围受限。务必检查 hubble-relay 的 Service 与 Endpoint 是否正常。

2.4 eBPF 技术基础:Cilium 的基石

eBPF 是 Cilium 和 Hubble 能够高效工作的核心技术。理解以下 eBPF 基础概念,有助于诊断流量观测中的异常:

  • BPF 程序类型: Cilium 主要使用 BPF_PROG_TYPE_XDP、BPF_PROG_TYPE_SCHED_CLS(TC)、BPF_PROG_TYPE_CGROUP_SOCK 等,分别对应不同的网络钩子点。
  • BPF Map: 用于在内核与用户空间之间共享数据。Cilium 使用 Map 存储策略规则、端点信息、连接跟踪表。
  • perf ring buffer: Hubble 通过 perf ring buffer 将内核事件(如网络包丢弃、连接建立)高效地传递给用户空间的 Hubble Agent。
  • BPF CO-RE (Compile Once – Run Everywhere): Cilium 利用 BTF(BPF Type Format)实现一次编译,多内核版本运行,避免了对特定内核头文件的依赖。
故障排查关联: 当镜像拉取流量被 Cilium 策略丢弃时,eBPF 程序会在内核中记录丢弃原因(如 POLICY_DENIED)。Hubble 通过读取这些 eBPF 事件,能够精确告知你哪个策略、哪个标签导致了流量阻断。

2.5 数据平面与观测平面的协作关系

下表总结了 Cilium 数据平面与 Hubble 观测平面在镜像拉取流量排查中的不同角色:

维度 Cilium 数据平面 Hubble 观测平面
核心任务 转发、策略执行、负载均衡 事件采集、流日志存储、可视化
数据来源 eBPF 程序直接处理网络包 从 eBPF 事件中被动监听
对性能影响 极低(内联在内核路径) 极低(仅复制元数据)
排查价值 确认策略是否生效、流量是否到达 提供丢弃原因、延迟、流路径
常用工具 cilium endpoint list、cilium policy trace hubble observe、hubble status

在实际排查中,你通常先使用 Hubble 观测流量是否被丢弃或延迟,再通过 Cilium 数据平面工具定位具体的策略或转发问题。两者结合,才能完整还原镜像拉取流量的全链路状态。