4. Cilium与eBPF生态:Cilium简介、eBPF在Cilium中的应用、Hubble可观测性

4.1 Cilium 简介:基于 eBPF 的云原生网络、安全与可观测性平台

Cilium 是 CNCF 毕业项目,核心设计理念是“利用 eBPF 在 Linux 内核中动态注入程序,为容器工作负载提供高速网络、安全策略与可观测性”。它摒弃了传统 CNI 插件依赖 iptables 或用户态代理的架构,将数据面完全下沉到内核 eBPF 钩子中执行。

关键定位: Cilium 不是单纯的 CNI 网络插件,而是一个集成了网络(L3/L4/L7)、安全(基于身份的策略、API 感知)、可观测性(Hubble)以及服务网格(基于 Envoy 的 L7 治理)的统一平台。

Cilium 的核心组件与职责:

组件 运行位置 核心职责 与 eBPF 的关系
Cilium Agent 每个节点(DaemonSet) 与 K8s API Server 交互,管理 eBPF Map/Program 的加载与更新 eBPF 程序的编排者
Cilium Operator 集群级单副本 处理集群范围任务(如 IPAM、CiliumEndpoint 同步) 间接管理 eBPF 资源分配
Cilium CNI Chainer 节点级 实现 CNI 接口,调用 Agent 配置 Pod 网络命名空间 触发 eBPF 程序附着到 Pod 端
Envoy (L7 代理) 可选组件 处理 L7 HTTP/gRPC 策略与流量治理 通过 eBPF 加速流量重定向到 Envoy
Hubble Relay/UI 集群级 聚合节点 eBPF 事件,提供可观测性 API 与 UI 消费 eBPF 导出的可观测性数据

4.2 eBPF 在 Cilium 中的核心应用

Cilium 是 eBPF 技术在生产环境最成功的落地案例。它利用 eBPF 的多个钩子点,实现了传统 CNI 无法比拟的性能与灵活性。

4.2.1 网络数据面:eBPF 替代 iptables 与 Overlay 隧道

  • TC (Traffic Control) 钩子: Cilium 在 Pod 的 veth 对宿主端和物理网卡上附着 eBPF 程序,直接处理数据包的封装、路由、转发。无需经过 iptables 规则链,延迟降低 40%-60%。
  • XDP (eXpress Data Path) 钩子: 在网卡驱动层(RX 最早阶段)执行 eBPF,实现 DDoS 防护、负载均衡的源地址转换(Maglev 一致性哈希),吞吐量可达线速。
  • 直接路由与隧道模式: 无论哪种模式,Cilium 都通过 eBPF 完成封装(VXLAN/Geneve)或路由决策,避免在用户态和内核态之间切换。
性能对比: 在同等硬件条件下,Cilium (eBPF) 相比 Calico (iptables) 在 PPS 转发性能上提升约 3-5 倍,连接建立速率提升 10 倍以上。

4.2.2 安全策略:基于身份(Identity)的 L3/L4/L7 执行

Cilium 不依赖 IP 地址或安全组标签,而是为每个 Pod 分配一个全局唯一的 Security Identity(基于 Label 的哈希值)。eBPF 程序在 sk_lookup 和 sk_skb 钩子中直接查询 BPF Map(cilium_ipcache、cilium_policy),实现微秒级的策略匹配。

  • L3/L4 策略: 在 eBPF 中直接检查 IP 协议、端口、Identity,拒绝非法包,无需 iptables 遍历。
  • L7 策略: 通过 eBPF 的 sockops 和 cgroup/connect 钩子,将匹配特定 HTTP 方法或路径的流量重定向到本地 Envoy 代理,由 Envoy 执行精细的 L7 策略。

4.2.3 负载均衡:Maglev 一致性哈希与 DSR

Cilium 的 kube-proxy 替代模式完全基于 eBPF。它在 connect 系统调用或 XDP 层拦截 Service 请求,使用 Maglev 一致性哈希算法选择后端,并支持直接服务器返回(DSR),避免流量经过节点二次转发。

// 简化示意:eBPF 程序在 connect 钩子中执行 Service 负载均衡
// 实际代码位于 bpf/bpf_lxc.c 和 bpf/bpf_xdp.c
int cilium_connect4(struct bpf_sock_addr *ctx) {
    struct lb4_key key = { .address = ctx->user_ip4, .dport = ctx->user_port };
    struct lb4_service *svc = map_lookup_elem(&LB4_SERVICES_MAP, &key);
    if (svc) {
        // Maglev 哈希选择后端
        struct lb4_backend *backend = select_backend_maglev(svc, ctx->cookie);
        ctx->user_ip4 = backend->address;
        ctx->user_port = backend->port;
    }
    return 0;
}

4.3 Hubble:基于 eBPF 的可观测性层

Hubble 是 Cilium 的可观测性组件,它不依赖 sidecar 或应用埋点,而是直接从 eBPF 程序导出的元数据中构建服务拓扑、流量日志和指标。

4.3.1 Hubble 的数据采集架构

Hubble 可观测性数据流架构 eBPF 程序 (TC/XDP/sockops 钩子) Per-CPU Buffer (事件暂存) cilium_monitor (内核事件通道) Cilium Agent (gRPC 流式读取) Hubble Observer (节点级 gRPC Server) Hubble Relay (集群级事件聚合与去重) Hubble UI / CLI (可视化与查询接口) 说明:所有数据均从 eBPF 程序直接导出,无需修改应用代码或注入 sidecar

4.3.2 Hubble 的核心可观测性能力

能力维度 数据来源(eBPF 钩子) 典型输出 运维价值
服务依赖拓扑 tracepoint/skb/consume、kprobe/tcp_connect 实时服务地图,显示流量方向、协议、速率 快速定位调用链断裂或异常依赖
网络流日志 TC 入口/出口钩子 五元组、Verdict(允许/丢弃)、字节数、延迟 安全审计、故障排查(如 DNS 解析失败)
HTTP/gRPC 指标 sockops + Envoy 导出 请求速率、P99 延迟、状态码分布 应用性能监控,无需 Prometheus 埋点
DNS 可观测性 kprobe/udp_sendmsg DNS 查询域名、响应 IP、响应时间 排查服务发现延迟或 DNS 劫持
TCP 状态跟踪 kprobe/tcp_set_state TCP 连接建立/关闭、重传、RTT 网络性能调优,识别连接泄漏

4.3.3 Hubble 与 Cilium 的集成优势

  • 零开销采集: eBPF 事件导出是内核原生操作,相比 Prometheus 拉取或 sidecar 抓包,CPU 开销可忽略不计(通常 < 1%)。
  • 安全策略审计: Hubble 可以展示每条流量的 Verdict(ALLOWED / DENIED),并关联到具体的 CiliumNetworkPolicy 规则,帮助验证安全策略是否生效。
  • 与 Prometheus/Grafana 集成: Hubble 暴露标准的 Prometheus 指标端点(:9965/metrics),可直接被 Prometheus 抓取,无需额外 exporter。
注意: 在大型集群(节点数 > 500)中,Hubble Relay 的内存消耗可能较高,建议为 Relay 分配至少 2GB 内存,并启用事件采样(--hubble-event-queue-size)以避免 OOM。

4.4 本章小结