2. Cilium 架构深度解析:Cilium Agent、Cilium Operator、Hubble 组件、CNI 插件与数据路径

Cilium 并非一个单一二进制,而是一组协同工作的组件集合。理解每个组件的职责、生命周期以及它们如何通过数据路径串联,是进行网络策略编写和性能调优的基础。本章将拆解 Cilium 的控制面与数据面核心组件,并深入其基于 eBPF 的数据路径。

2.1 核心组件总览

Cilium 架构主要分为控制面组件和数据面组件。控制面负责策略管理、身份认证和集群状态同步;数据面则负责实际的数据包转发和策略执行。

组件 类型 部署方式 核心职责
Cilium Agent DaemonSet 每个节点一个 管理 eBPF 程序、同步节点状态、执行网络策略、与 API Server 交互
Cilium Operator Deployment 集群级(通常 1-2 副本) 处理集群级任务:IPAM、多集群服务、CNI 配置管理
Hubble DaemonSet + Deployment 每个节点 + 集群级 UI 可观测性:流量抓取、服务依赖图、安全事件告警
CNI Plugin 二进制插件 节点本地 实现 Kubernetes CNI 接口,调用 Cilium Agent 完成 Pod 网络接入
Cilium CLI 客户端工具 用户终端 调试、状态检查、策略验证
关键认知: Cilium Agent 是唯一直接操作 eBPF 的组件,所有数据路径的修改都通过它完成。Operator 和 Hubble 是辅助性的控制面组件,它们的故障不会立即导致数据面中断,但会影响集群扩展性和可观测性。

2.2 Cilium Agent:数据面的核心引擎

Cilium Agent 以 DaemonSet 形式运行在每个 Kubernetes 节点上。它是整个架构中最繁忙的组件,负责将用户意图(网络策略、服务定义)转化为内核中的 eBPF 程序。

2.2.1 Agent 内部模块

  • Endpoint Manager:管理节点上所有 Pod(称为 Endpoint)的生命周期,包括 IP 分配、身份标签同步。
  • Policy Repository:存储并解析 CiliumNetworkPolicy 和 CiliumClusterwideNetworkPolicy,生成策略决策的 BPF Map。
  • Datapath Regenerator:当 Endpoint 或策略发生变化时,触发 eBPF 程序的重新编译和加载。
  • K8s Watcher:监听 Kubernetes API Server 的 Pod、Service、Node、Policy 事件。
  • KVStore Sync:在集群规模较大时,通过 etcd 或 Consul 同步全局身份标识(Identity)。

2.2.2 Agent 启动流程

  1. 节点启动,kubelet 调用 Cilium CNI 插件。
  2. CNI 插件通过 Unix Socket 请求 Cilium Agent 为 Pod 分配网络资源。
  3. Agent 为 Pod 创建 Endpoint,分配 IP 和 Security Identity。
  4. Agent 编译并加载针对该 Endpoint 的 eBPF 程序到网络设备(如 cilium_host、lxc*)。
  5. Agent 将 Endpoint 信息写入 BPF Map,供数据路径查找。
# 查看节点上 Cilium Agent 管理的 Endpoint
cilium endpoint list
ENDPOINT   POLICY (ingress)   POLICY (egress)   IDENTITY   LABELS (source:key[=value])   IPv6   IPv4           STATUS
           ENFORCEMENT        ENFORCEMENT
12345      Enabled            Enabled           1678       k8s:app=frontend              ...    10.0.1.5       ready

2.3 Cilium Operator:集群级协调者

Operator 负责那些不适合在每个 Agent 上独立执行的任务。它通过 Kubernetes 的控制器模式工作,确保集群状态符合预期。

功能模块 说明 性能影响
IPAM (IP Address Management) 管理 PodCIDR 分配,支持 CRD-backed、Kuberenetes HostScope、AWS ENI、Azure 等模式 高:IP 池耗尽会影响 Pod 调度
CNI Chaining 管理 Cilium 与其他 CNI 插件(如 Calico、Flannel)的链式部署配置 中:配置错误导致网络不通
Cluster Mesh 处理跨集群服务发现和网络策略同步 中:跨集群延迟和配置一致性
Node Init 新节点加入集群时,初始化 Cilium Agent 所需的系统配置(如内核参数) 低:仅在节点加入时触发
运维注意: 在大型集群(>500 节点)中,Operator 的 IPAM 控制器可能成为瓶颈。建议为 Operator 分配独立的资源配额,并启用 IPAM 的预分配缓存功能。

2.4 Hubble:可观测性的眼睛

Hubble 是 Cilium 的可观测性层,它利用 eBPF 在内核中直接捕获网络事件,无需修改应用代码或重启 Pod。

2.4.1 Hubble 组件架构

  • Hubble Agent (DaemonSet):运行在每个节点上,从 Cilium Agent 的 BPF Map 中读取流量事件,并通过 gRPC 暴露。
  • Hubble Relay (Deployment):集群级聚合层,将所有节点的 Hubble Agent 连接起来,提供全局查询接口。
  • Hubble UI (Deployment):基于 Web 的可视化界面,展示服务依赖图、TCP 流、DNS 请求等。
  • hubble CLI:命令行工具,用于实时观察流量和事件。

2.4.2 Hubble 核心能力

能力 描述 典型命令/操作
流量监控 查看 Pod 之间、Pod 与外部之间的 L3/L4/L7 流量 hubble observe --pod default/frontend
服务依赖图 自动生成服务间的通信拓扑 Hubble UI 中查看
DNS 监控 捕获并记录所有 DNS 查询和响应 hubble observe --type l7 --protocol dns
HTTP 监控 记录 HTTP 请求方法、路径、状态码、延迟 hubble observe --type l7 --protocol http
安全事件 记录被网络策略丢弃的数据包、DNS 劫持等 hubble observe --verdict DROPPED
# 实时观察 default 命名空间下所有被策略丢弃的流量
hubble observe --namespace default --verdict DROPPED
TIMESTAMP             SOURCE                   DESTINATION              TYPE     VERDICT   SUMMARY
2025-03-15T10:30:01   pod/frontend-abc-123     pod/backend-xyz-456      L3/L4    DROPPED   TCP 10.0.1.5:80 -> 10.0.2.7:8080

2.5 CNI 插件:Kubernetes 网络接入点

Cilium 的 CNI 插件是一个轻量级二进制文件,通常位于 /opt/cni/bin/cilium-cni。它不执行复杂的网络逻辑,而是作为 kubelet 和 Cilium Agent 之间的桥梁。

2.5.1 CNI 调用流程

  1. kubelet 需要创建 Pod,调用 CNI 插件的 ADD 命令。
  2. CNI 插件解析标准输入(stdin)中的 CNI 配置,提取 Pod 名称、命名空间、网络附件等信息。
  3. CNI 插件通过 Unix Socket(/var/run/cilium/cilium.sock)向 Cilium Agent 发送 gRPC 请求。
  4. Cilium Agent 执行实际的网络配置(创建 veth pair、分配 IP、加载 eBPF 程序)。
  5. CNI 插件将 Agent 返回的接口信息(MAC、IP、路由)返回给 kubelet。
# 查看节点上的 CNI 配置
cat /etc/cni/net.d/05-cilium.conf
{
  "cniVersion": "0.3.1",
  "name": "cilium",
  "type": "cilium-cni",
  "enable-debug": false
}

2.6 数据路径深度解析:eBPF 如何工作

Cilium 的数据路径完全基于 eBPF(extended Berkeley Packet Filter)实现。eBPF 允许在内核中安全地运行沙箱程序,无需修改内核源码或加载内核模块。

2.6.1 数据路径核心 Hook 点

  • XDP (eXpress Data Path):在网卡驱动层处理数据包,性能最高,适合 DDoS 防护和负载均衡。
  • TC (Traffic Control) Ingress/Egress:在协议栈入口/出口处理,是 Cilium 默认的数据路径。
  • cgroup/skb:在 cgroup 层级处理,用于 socket 级别的策略控制。
  • Kprobes/Uprobes:动态跟踪内核/用户函数,用于 Hubble 的可观测性。

2.6.2 数据包转发流程(以 Pod 到 Pod 为例)

  1. 源 Pod 发送数据包:数据包从 Pod 的 veth 端进入主机网络栈。
  2. TC Ingress Hook:Cilium 的 eBPF 程序在 cilium_host 或 lxc+ 接口的 TC Ingress 点被触发。
  3. 策略查找:eBPF 程序从 BPF Map 中查找源 Endpoint 的身份标识(Security Identity)。
  4. 路由决策:根据目标 IP 查找路由表,判断目标 Pod 是否在同一节点。
  5. 封装/转发:如果目标在同一节点,直接通过 veth pair 转发;如果跨节点,则通过 VXLAN/Geneve 隧道或直接路由转发。
  6. 目标节点处理:目标节点的 TC Ingress 程序再次执行策略检查,确认源身份允许访问后,将数据包交付给目标 Pod。
性能关键点: 整个数据路径完全在内核态完成,无需上下文切换到用户态。Cilium 通过 BPF Map 实现策略查找的 O(1) 时间复杂度,这是其性能优于 iptables 模式(O(n))的根本原因。

2.7 组件交互与数据路径架构图

下图展示了 Cilium 各组件之间的交互关系以及数据包在数据路径中的流转过程。

Cilium 组件交互与数据路径架构 Kubernetes API Server Pod/Service/Node 事件 CiliumNetworkPolicy 身份标识 (Identity) Cilium Operator IPAM / Cluster Mesh Hubble Relay + UI 全局可观测性聚合 Cilium Agent Endpoint Manager Policy Repository Datapath Regenerator Hubble Agent eBPF 事件抓取 eBPF 数据路径(内核态) XDP (网卡驱动) 早期丢包/转发 TC Ingress 策略执行入口 BPF Map 查找 O(1) 策略匹配 TC Egress 封装/路由/转发 数据包流转说明: 1. Pod 发送数据包 → 进入主机网络栈 2. XDP/TC Ingress 触发 eBPF 程序 → 查找源 Endpoint 身份 3. BPF Map 匹配目标身份与策略 → 允许/拒绝决策 4. TC Egress 执行封装(VXLAN/Geneve)或直接路由 → 发送到目标节点 5. 目标节点 TC Ingress 再次验证策略 → 交付给目标 Pod

2.8 关键性能指标与调优方向

理解架构后,我们需要关注影响性能的关键指标。下表列出了 Cilium 数据路径的核心性能指标及其调优方向。

指标 描述 典型值 调优方向
PPS (Packets Per Second) 每秒处理的数据包数量 XDP 模式可达 10M+ PPS 启用 XDP、调整 Ring Buffer 大小
Latency (P99) 数据包从源到目标的延迟 同节点 < 10μs,跨节点 < 100μs 使用直接路由替代隧道、优化 MTU
Connection Tracking 并发连接数 默认 65536,可调至 1M+ 调整 bpf-ct-global-max 参数
Policy Enforcement 策略匹配延迟 O(1) 查找,通常 < 1μs 减少 BPF Map 大小、避免复杂 L7 规则
Hubble 事件采样率 可观测性数据采集频率 默认 100% 降低采样率(如 10%)以减少 CPU 开销
调优黄金法则: 在 GitOps 流水线中集成性能测试,每次策略变更后自动运行 cilium connectivity test 和 hubble observe 对比基线,确保性能回归在可接受范围内。

2.9 本章小结

  • Cilium Agent 是数据面的核心,负责 eBPF 程序的生命周期管理。
  • Cilium Operator 处理集群级任务,如 IPAM 和 Cluster Mesh。
  • Hubble 提供基于 eBPF 的可观测性,是调试和性能分析的利器。
  • CNI 插件 作为轻量级桥梁,将 kubelet 请求转发给 Agent。
  • 数据路径 完全在内核态通过 eBPF 完成,实现了高性能的策略执行和转发。
  • 性能调优应聚焦于 XDP 启用、路由模式选择、BPF Map 大小调整和 Hubble 采样率控制。