3、Cilium架构概览:Cilium Agent、Cilium Operator、Cilium CNI插件、Cilium Endpoint与Identity

Cilium 是一个基于 eBPF 的云原生网络、安全与可观测性项目。理解其核心组件架构,是掌握 Hubble 流量可视化和资源配额校准的前提。Cilium 的控制平面与数据平面分离设计,使其能够高效管理 Kubernetes 集群中的网络策略与负载均衡。

3.1 核心组件总览

Cilium 架构由多个协同工作的组件构成,每个组件承担特定职责。下表列出了最关键的四个组件及其功能定位:

组件名称 运行位置 核心职责 与 eBPF 的关系
Cilium Agent 每个 Kubernetes 节点(DaemonSet) 管理 eBPF 程序、端点、网络策略与可观测性数据 直接编译、加载并维护节点上的 eBPF 程序
Cilium Operator 集群中任意节点(Deployment) 处理集群级协调任务,如 IP 分配、Identity 管理 不直接操作 eBPF,但管理 eBPF 所需的状态
Cilium CNI 插件 每个节点(二进制文件) 实现 Kubernetes CNI 接口,配置 Pod 网络 触发 Agent 为 Pod 创建 eBPF 端点
Cilium Endpoint & Identity Agent 内部管理的数据模型 标识 Pod/容器及其安全身份 eBPF 程序依赖 Identity 执行策略决策
关键理解: Cilium Agent 是“执行者”,Operator 是“协调者”,CNI 插件是“入口”,Endpoint/Identity 是“数据模型”。四者缺一不可。

3.2 Cilium Agent:节点上的 eBPF 引擎

Cilium Agent 是运行在每个 Kubernetes 节点上的守护进程(DaemonSet),它是整个 Cilium 架构中最核心的组件。Agent 通过 gRPC 与 kube-apiserver 通信,监听 Pod、Service、NetworkPolicy 等资源的变化,并将这些变化转化为 eBPF 程序逻辑。

  • eBPF 程序管理: Agent 负责编译 C 语言编写的 eBPF 程序,并将其加载到网络接口和 cgroup 挂钩点。这些程序处理数据包的转发、封装、策略过滤和负载均衡。
  • 端点(Endpoint)管理: 每个 Pod 在 Agent 内部被抽象为一个 Endpoint 对象。Agent 维护 Endpoint 的生命周期,包括创建、更新和销毁。
  • 策略执行: Agent 将 Kubernetes NetworkPolicy 和 CiliumNetworkPolicy 翻译为 eBPF map 中的键值对,实现线速策略过滤。
  • 可观测性数据导出: Agent 通过 eBPF 收集网络流数据,并通过 Hubble 接口暴露给 Hubble Relay 和 UI。
实践要点: 在生产环境中,Cilium Agent 的资源配额(CPU/内存)直接影响 Pod 网络创建速度和策略生效延迟。建议为 Agent 预留 0.5-1 核 CPU 和 512MB-1GB 内存,具体取决于节点上 Pod 密度。

3.3 Cilium Operator:集群级协调者

Cilium Operator 是一个 Deployment 部署的组件,通常只运行一个或少数几个副本。它不参与数据平面的数据包处理,而是负责集群范围内的状态协调任务。

  • IP 地址管理(IPAM): Operator 负责从集群 IP 池中为节点分配 PodCIDR 范围,并处理 IP 地址的回收与再分配。
  • Identity 管理: 当新的安全身份(基于标签组合)出现时,Operator 负责分配全局唯一的 Identity ID,并同步到所有节点的 Agent。
  • KVStore 维护: 如果使用 etcd 作为状态存储,Operator 负责维护 KVStore 中的集群状态一致性。
  • 故障恢复: 监控 Agent 健康状态,并在节点故障时触发 IP 和 Identity 的清理与重新分配。
注意: Operator 的可用性直接影响集群的 IP 分配和 Identity 同步。建议至少部署 2 个副本,并配置 Pod 反亲和性,避免单点故障。

3.4 Cilium CNI 插件:Pod 网络的入口

Cilium CNI 插件是一个轻量级的二进制文件,放置在每个节点的 /opt/cni/bin/ 目录下。当 kubelet 需要为 Pod 配置网络时,会调用该插件。

CNI 插件的工作流程非常简洁:

  1. ADD 操作: kubelet 调用 CNI 插件,传入 Pod 的命名空间、名称和容器 ID。
  2. IPC 通信: CNI 插件通过 Unix Socket 或 gRPC 将请求转发给本节点的 Cilium Agent。
  3. Agent 处理: Agent 创建 veth 对,将一端放入 Pod 网络命名空间,另一端挂载到主机。同时,Agent 为 Pod 创建 Endpoint 对象,并加载对应的 eBPF 程序。
  4. 返回结果: Agent 将 Pod 的 IP 地址、MAC 地址和路由信息返回给 CNI 插件,CNI 插件再返回给 kubelet。
性能优势: 由于 CNI 插件本身只做简单的 IPC 转发,实际的网络配置工作由 Agent 中的 eBPF 程序完成,因此 Pod 创建速度极快,通常在毫秒级别。

3.5 Cilium Endpoint 与 Identity:数据平面的身份模型

Endpoint 和 Identity 是 Cilium 数据平面中两个紧密关联的概念,它们共同构成了基于身份的安全模型基础。

3.5.1 Endpoint(端点)

Endpoint 是 Cilium 对网络命名空间中网络接口的抽象。每个 Pod 或容器对应一个 Endpoint。Agent 为每个 Endpoint 维护以下信息:

  • 网络信息: IP 地址、MAC 地址、veth 对索引。
  • 安全身份: 指向一个 Identity 对象。
  • 策略状态: 当前应用的入站和出站策略规则。
  • eBPF map 引用: 该 Endpoint 专用的 eBPF map 文件描述符。

3.5.2 Identity(身份)

Identity 是 Cilium 实现安全策略的核心创新。它不是基于 IP 地址,而是基于 Kubernetes 标签组合。例如,一个带有 app=frontend 和 env=prod 标签的 Pod 会被分配一个全局唯一的 24 位 Identity ID。

  • 标签到 ID 的映射: Operator 负责将标签组合哈希为 Identity ID,并同步到所有节点。
  • 策略匹配: eBPF 程序在数据包处理时,直接从数据包中提取源端点和目的端点的 Identity ID,然后在 eBPF map 中查找策略规则,无需进行 IP 地址匹配。
  • 动态更新: 当 Pod 的标签发生变化时,Identity 会重新计算,eBPF map 中的策略条目也会自动更新。
架构优势: 基于 Identity 的策略模型使得 Cilium 能够支持大规模集群(数千节点、数万 Pod),因为 eBPF map 中的策略条目数量与 Pod 数量无关,只与标签组合数量相关。这大大降低了控制平面的压力。

3.6 组件交互流程示意图

下图展示了 Cilium 核心组件之间的交互关系,以及数据包在数据平面中的流转路径:

Cilium 核心组件交互架构 kube-apiserver 集群状态来源 Kubernetes 节点 1 Cilium Agent eBPF 程序管理 CNI 插件 Endpoints Pod A: 10.0.1.2 Pod B: 10.0.1.3 Pod C: 10.0.1.4 ... eBPF Maps(策略 / 转发 / 可观测性) 内核态数据平面 Kubernetes 节点 2 Cilium Agent eBPF 程序管理 CNI 插件 Endpoints Pod D: 10.0.2.2 Pod E: 10.0.2.3 ... eBPF Maps(策略 / 转发 / 可观测性) 内核态数据平面 Cilium Operator IPAM / Identity 管理 eBPF 隧道/路由 Cilium Agent CNI 插件 Endpoints eBPF Maps Operator

3.7 组件职责对比总结

为了帮助快速区分各组件职责,下表从多个维度进行了对比:

维度 Cilium Agent Cilium Operator CNI 插件 Endpoint / Identity
部署方式 DaemonSet(每节点) Deployment(集群级) 二进制文件(每节点) Agent 内部数据模型
数据平面参与 是(管理 eBPF) 否 否(仅触发配置) 是(eBPF 使用 Identity)
状态存储 本地 eBPF map + 缓存 KVStore / k8s API 无状态 Agent 内存 + eBPF map
故障影响范围 仅影响本节点 影响集群 IP/Identity 分配 仅影响本节点 Pod 创建 仅影响关联 Pod
资源消耗特征 CPU 密集(eBPF 编译) 内存密集(状态缓存) 极低(IPC 转发) 随 Pod 数量线性增长