4. Cilium 基础架构:eBPF 数据面、L3/L4/L7 策略、Hubble 可观测性

Cilium 是构建于 eBPF(extended Berkeley Packet Filter)之上的云原生网络、安全与可观测性项目。它利用 Linux 内核的 eBPF 技术,在无需修改内核或应用代码的前提下,动态注入高效的网络处理与安全策略逻辑。本章将拆解 Cilium 的核心架构:eBPF 数据面转发路径、多层网络策略模型以及 Hubble 可观测性组件。

4.1 整体架构概览

Cilium 采用控制面与数据面分离的架构。控制面组件(如 Operator、Agent)通过 Kubernetes API 监听资源变化,生成 eBPF 程序并加载到节点内核;数据面完全由 eBPF 程序在内核态完成网络转发、负载均衡与策略执行,避免传统 iptables 或 IPVS 的线性遍历开销。

Cilium 整体架构:控制面与数据面 Cilium 整体架构:控制面与数据面 控制面(用户态) Kubernetes API Cilium Operator Cilium Agent(每个节点) eBPF 程序生成与加载 Hubble Relay / Server 数据面(内核态 eBPF) 网络数据包(入口/出口) eBPF 钩子(XDP / TC / cgroup) 转发 / 负载均衡 / 策略执行 Hubble 事件导出 Linux 内核
关键设计原则:Cilium 将策略决策下推到内核 eBPF 层,每个数据包仅经过一次 eBPF 程序判定,无需在用户态与内核态之间反复切换,这是其性能优于传统 iptables 方案的根本原因。

4.2 eBPF 数据面:内核态网络处理

Cilium 的数据面完全基于 eBPF 实现,主要利用以下内核钩子:

钩子类型 触发位置 典型用途 性能特征
XDP 网卡驱动层(最早) DDoS 防护、早期丢包、重定向 纳秒级,无 skb 分配
TC(Traffic Control) 内核协议栈入口/出口 Pod 间转发、封装/解封装、策略执行 微秒级,可访问完整 skb
cgroup/sock Socket 创建/连接 Socket 级策略、DNS 解析拦截 连接级,开销极低

Cilium 使用 BPF Map 在 eBPF 程序与用户态 Agent 之间共享数据,包括端点信息、策略规则、服务后端列表等。数据包处理流程如下:

  1. 入口:数据包到达节点网卡,XDP 程序优先处理(若启用),决定放行、重定向或丢弃。
  2. TC Ingress:数据包进入内核协议栈前,TC 程序执行身份识别(Identity)、策略查找、封装(VXLAN/Geneve)或直接转发。
  3. 转发决策:根据 BPF Map 中的端点信息,判断目标是否在同一节点;若是,通过 veth pair 直接送达目标 Pod;若否,查找隧道或原生路由。
  4. 负载均衡:Service 访问在 eBPF 中完成 DNAT 和后端选择,无需 conntrack 遍历。
  5. 出口:TC Egress 程序执行出站策略,然后通过 veth 或物理网卡发出。
etcd 压测关联:在 etcd 集群中,Cilium eBPF 数据面将每个 Raft 消息的转发延迟从 iptables 的毫秒级降低到微秒级。对于 3 节点 etcd,Leader 到 Follower 的探测(Heartbeat)和日志复制(AppendEntries)路径上的每一跳延迟都直接影响集群的选举超时和写入吞吐。

4.3 L3/L4/L7 网络策略模型

Cilium 的网络策略比 Kubernetes 原生 NetworkPolicy 更精细,支持从网络层到应用层的多层控制。策略通过 CiliumNetworkPolicy(CNP)和 CiliumClusterwideNetworkPolicy(CCNP)CRD 定义。

策略层级 匹配维度 典型规则示例 eBPF 实现方式
L3 IP CIDR、标签、集群 允许来自 10.0.0.0/8 的流量 BPF Map 中存储 CIDR 前缀树
L4 协议(TCP/UDP/SCTP)、端口 允许 TCP 2379(etcd 客户端端口) BPF Map 中存储端口范围
L7 HTTP 方法/路径、gRPC 服务/方法、Kafka 主题 允许 GET /v3/kv/range,拒绝 DELETE 用户态代理(Envoy)或 eBPF 原生 L7 解析

策略执行的核心机制是 Identity(身份):Cilium 为每个 Pod 分配一个 24 位安全身份标识,策略规则基于身份而非 IP 地址。当 Pod 重启或迁移时,身份保持不变,策略无需重新计算。

etcd 安全最佳实践:在 etcd 集群中,建议使用 L4 策略严格限制 2379(客户端)和 2380(peer)端口的访问来源。若启用 L7 策略,需注意 Envoy 代理会引入额外延迟(约 50-200µs),在压测场景下可能影响尾延迟(p99)。对于纯 etcd 流量,优先使用 L3/L4 策略以保持最低延迟。

4.4 Hubble 可观测性:网络流与延迟可视化

Hubble 是 Cilium 的可观测性层,利用 eBPF 在内核态采集网络事件,提供实时流量监控、延迟分析和依赖关系图。Hubble 组件包括:

  • Hubble Agent:每个节点运行,从 Cilium Agent 获取 eBPF 事件,通过 gRPC 暴露流数据。
  • Hubble Relay:聚合多节点数据,提供集群级查询接口。
  • Hubble UI:基于 Web 的图形界面,展示服务拓扑和流量详情。
  • hubble CLI:命令行工具,支持实时观察和过滤。
Hubble 可观测性数据流与延迟分析 Hubble 可观测性数据流与延迟分析 节点 1 Cilium Agent Hubble Agent eBPF 事件采集 延迟: 2µs 节点 2 Cilium Agent Hubble Agent eBPF 事件采集 延迟: 3µs 节点 3 Cilium Agent Hubble Agent eBPF 事件采集 延迟: 2µs Hubble Relay(聚合与查询) Hubble UI / CLI / Prometheus 端到端延迟 p50: 5µs / p99: 15µs

Hubble 在 etcd 压测中的核心价值:

  • 逐跳延迟分解:通过 Hubble 的流记录,可以精确测量 etcd 集群中每个 Raft 消息从源 Pod 到目标 Pod 的每一跳延迟,区分网络排队、eBPF 策略处理、隧道封装等各阶段耗时。
  • 丢包与重传检测:Hubble 可以标记 TCP 重传和丢包事件,帮助定位 etcd 集群中的网络不稳定问题。
  • 服务依赖拓扑:自动生成 etcd 集群内 Pod 之间的通信拓扑,验证网络策略是否按预期生效。
压测实战命令:
# 实时观察 etcd 命名空间下的网络流
hubble observe --namespace etcd --since 5m --output json

# 查看特定 Pod 的延迟分布
hubble observe --pod etcd-0 --verdict DROPPED --since 1h

# 通过 Hubble Metrics 暴露延迟直方图到 Prometheus
# 在 CiliumAgent 中启用:--hubble-metrics="drop:sourceContext=identity;destinationContext=identity"

4.5 本章小结