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 执行策略决策 |
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。
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 的清理与重新分配。
3.4 Cilium CNI 插件:Pod 网络的入口
Cilium CNI 插件是一个轻量级的二进制文件,放置在每个节点的 /opt/cni/bin/ 目录下。当 kubelet 需要为 Pod 配置网络时,会调用该插件。
CNI 插件的工作流程非常简洁:
- ADD 操作: kubelet 调用 CNI 插件,传入 Pod 的命名空间、名称和容器 ID。
- IPC 通信: CNI 插件通过 Unix Socket 或 gRPC 将请求转发给本节点的 Cilium Agent。
- Agent 处理: Agent 创建 veth 对,将一端放入 Pod 网络命名空间,另一端挂载到主机。同时,Agent 为 Pod 创建 Endpoint 对象,并加载对应的 eBPF 程序。
- 返回结果: Agent 将 Pod 的 IP 地址、MAC 地址和路由信息返回给 CNI 插件,CNI 插件再返回给 kubelet。
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 中的策略条目也会自动更新。
3.6 组件交互流程示意图
下图展示了 Cilium 核心组件之间的交互关系,以及数据包在数据平面中的流转路径:
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 数量线性增长 |