3. Cilium与Hubble架构:Cilium数据平面、Hubble观测层、组件通信流程

理解Cilium与Hubble的架构是进行eBPF配额校准与性能调优的基础。Cilium负责数据平面的网络与安全策略执行,而Hubble则构建在Cilium之上,提供深度可观测性。两者通过共享内核eBPF Map和gRPC服务实现高效通信。

3.1 Cilium数据平面架构

Cilium的数据平面完全基于eBPF,绕过了传统的iptables和内核网络栈的复杂路径,直接在网络数据路径的关键钩子点注入eBPF程序。其核心组件包括:

  • Cilium Agent (cilium-agent):运行在每个节点上的守护进程,负责与Kubernetes API Server交互,将网络策略、Service定义和端点信息翻译为eBPF Map和程序,并通过bpffs加载到内核。
  • Cilium Operator:集群级别的组件,处理全局任务,如IPAM(IP地址管理)、ClusterMesh多集群网络、以及CiliumNetworkPolicy的验证。
  • eBPF程序:挂载在网络设备(如eth0、lxc、cilium_host)的XDP、TC ingress/egress、以及cgroup/sockops等钩子点,执行转发、封装、策略过滤、负载均衡等操作。
  • eBPF Map:内核与用户空间共享的关键数据结构,存储端点信息、策略规则、连接跟踪(Conntrack)表、负载均衡后端等。这是Hubble获取观测数据的核心来源。
性能关键点: Cilium数据平面不依赖iptables规则遍历,而是通过eBPF Map的哈希查找直接决策,这使得数据包处理延迟从毫秒级降至微秒级,是配额校准性能调优的基础保障。
Cilium 数据平面架构(单节点视角) cilium-agent cilium-operator 内核 eBPF 子系统 XDP / TC 程序 CGroup Sockops 策略过滤程序 Endpoint Map Policy Map Conntrack Map 数据包流向

3.2 Hubble观测层架构

Hubble作为Cilium原生的可观测性层,通过非侵入式的方式从Cilium数据平面采集流量和状态信息。其架构分为三个层次:

层次 组件 功能描述
数据采集层 Hubble Agent (hubble-agent) 运行在每个节点上,通过gRPC订阅Cilium Agent暴露的eBPF Map事件(如Flow、Drop、PolicyVerdict),并进行初步聚合与缓存。
中继与存储层 Hubble Relay (hubble-relay) 集群级组件,接收所有Hubble Agent上报的流数据,提供全局时间排序、去重和缓存,对外暴露统一的gRPC API。
消费与展示层 hubble CLI / Hubble UI / Prometheus 用户交互界面。CLI用于实时调试;UI提供拓扑图与流日志;Prometheus负责指标存储与告警。
配额校准关联: Hubble Agent 直接从 Cilium 的 eBPF Map 中读取 Conntrack 和 Policy Map 的命中计数。在配额校准场景中,我们可以通过 Hubble 的指标(如 hubble_flows_processed_total)来验证 eBPF 程序是否按预期处理了所有数据包,从而判断配额是否被正确执行。

3.3 组件通信流程

Cilium与Hubble之间的通信流程是理解观测数据来源的关键。整个流程从数据包进入节点开始,到Hubble UI展示结束,涉及多个组件间的协作。

  1. 数据包触发eBPF程序:网络数据包到达节点网卡,触发挂载在XDP或TC钩子点的eBPF程序执行。
  2. eBPF程序决策与记录:程序查询eBPF Map(如Policy Map、Conntrack Map)做出转发、丢弃或允许的决策,并将事件(Flow Event、Drop Event)写入perf event ring buffer或专门的eBPF Map中。
  3. Cilium Agent 事件导出:Cilium Agent 通过 cilium-agent 内部的gRPC服务器,将eBPF Map中的事件流式导出。Hubble Agent 作为客户端订阅这个流。
  4. Hubble Agent 处理与转发:Hubble Agent 接收原始事件,添加节点元数据(如Pod标签、Service名称),然后通过gRPC上报给Hubble Relay。
  5. Hubble Relay 聚合与排序:Relay 接收来自所有节点的流,执行全局时间戳排序,去重,并缓存最近的流数据。
  6. 用户查询与展示:用户通过 hubble observe CLI 或 Hubble UI 发起查询请求,Relay 返回排序后的流数据,最终在UI上以拓扑图或表格形式呈现。
Cilium & Hubble 组件通信流程 Kubernetes 节点 1 eBPF 程序 Cilium Agent Hubble Agent Kubernetes 节点 2 eBPF 程序 Cilium Agent Hubble Agent Hubble Relay (集群级) Hubble UI / CLI / Prometheus

3.4 关键通信协议与接口

组件间的通信依赖以下核心协议与接口,理解它们有助于排查观测链路中的性能瓶颈:

接口/协议 通信双方 用途 性能考量
gRPC (双向流) Cilium Agent ↔ Hubble Agent 实时推送Flow、Drop、PolicyVerdict事件 高吞吐场景下需关注gRPC消息大小和流控
gRPC (Unary/Server Streaming) Hubble Agent ↔ Hubble Relay 节点事件上报与全局聚合 网络延迟和Relay的排序能力是瓶颈
eBPF Map (perf event ring buffer) eBPF程序 ↔ Cilium Agent 内核态向用户态传递事件 ring buffer大小直接影响丢事件概率
Prometheus Metrics Cilium Agent / Hubble Agent → Prometheus 指标暴露(如丢包计数、流速率) 指标基数过大可能影响Agent性能
调优注意: 在配额校准场景中,如果发现Hubble显示的流量计数与预期不符,应首先检查 cilium-agent 与 hubble-agent 之间的gRPC连接是否健康,以及eBPF perf event ring buffer是否因过小导致事件丢失。可以通过 cilium metrics list 查看 cilium_events_rate_limit 和 hubble_ring_buffer_dropped_events_total 指标进行诊断。