Cilium 基础架构:核心组件与数据路径
Cilium 并非单一二进制,而是一组协同工作的组件集合,它们共同构成了基于 eBPF 的容器网络、安全与可观测性平台。理解每个组件的职责及其交互方式,是构建多租户隔离集群的基础。本章将深入剖析 Cilium Agent、Operator、CNI 插件、eBPF 数据路径以及 Hubble 可观测性组件。
2.1 组件总览与职责划分
下表列出了 Cilium 的核心组件及其在集群中的主要职责:
| 组件 | 部署形态 | 核心职责 | 关键特性 |
|---|---|---|---|
| Cilium Agent | DaemonSet (每个节点一个) | 管理节点级 eBPF 程序、策略执行、网络配置 | 直接与 kube-apiserver 和 Linux 内核交互 |
| Cilium Operator | Deployment (通常 1-2 个副本) | 集群级控制面任务、资源协调、状态管理 | 处理无需节点级感知的全局逻辑 |
| CNI 插件 | 二进制文件 (由 kubelet 调用) | Pod 网络接口创建与 IP 分配 | 作为 kubelet 与 Cilium Agent 之间的桥梁 |
| eBPF 数据路径 | 内核内 (由 Agent 加载) | 数据包处理、转发、策略过滤、负载均衡 | 高性能、可编程的内核级网络层 |
| Hubble | DaemonSet + Deployment | 网络可观测性、流日志、服务依赖图 | 基于 eBPF 的零侵扰数据采集 |
2.2 Cilium Agent:节点级控制引擎
Cilium Agent 是运行在每个 Kubernetes 节点上的守护进程,是 Cilium 最核心的执行单元。它通过 Unix Socket 与 CNI 插件通信,并通过 gRPC 与 Hubble 交互。
- eBPF 程序管理:Agent 负责将编译后的 eBPF 程序(如网络策略、负载均衡、转发逻辑)加载到内核中,并附加到特定的钩子点(如
tc、XDP、cgroup)。 - 策略同步:监听 Kubernetes API Server 中的 CiliumNetworkPolicy 和 CiliumClusterwideNetworkPolicy 资源,实时转换为 eBPF map 中的键值对,实现策略的即时生效。
- 端点管理:维护本节点上所有 Pod 的“端点”信息,包括 IP 地址、安全标识、标签等,并写入 eBPF map 供数据路径查询。
- 服务负载均衡:实现 Kubernetes Service 的转发逻辑,包括 ClusterIP、NodePort、ExternalIP 等模式,完全在 eBPF 中完成,无需 iptables。
关键设计: Agent 通过 Identity (安全标识) 而非 IP 地址来标识 Pod。这使得策略在 Pod 重启或迁移后依然有效,是实现多租户隔离的核心抽象。
2.3 Cilium Operator:集群级控制面
Operator 负责处理那些不需要在每个节点上执行,但需要全局视角的任务。它通常以 Deployment 形式运行,具有高可用性。
- 身份管理:为集群中的每个端点分配全局唯一的数字标识(Security Identity),并管理标识的生命周期。
- IPAM (IP 地址管理):在集群范围内管理 PodCIDR 分配,支持多种 IPAM 模式(如 Cluster Pool、Kuberenetes Host Scope、AWS ENI、Azure IPAM)。
- KVStore 维护:当使用 etcd 作为状态存储时,Operator 负责维护集群状态的一致性。
- 资源清理:清理不再使用的 CiliumEndpoint 资源,确保集群状态不残留过期数据。
2.4 CNI 插件:Pod 网络接入点
当 kubelet 需要创建 Pod 网络时,会调用 CNI 插件。Cilium 的 CNI 插件是一个轻量级二进制文件,其核心流程如下:
- ADD 操作:kubelet 调用 CNI 插件,传入 Pod 的命名空间、名称、容器 ID 等信息。
- 请求转发:CNI 插件通过 Unix Socket 将请求转发给本节点的 Cilium Agent。
- 接口创建:Agent 创建一对 veth 设备,一端放入 Pod 网络命名空间,另一端连接到主机的 ciliun_net 网桥或直接附加 eBPF 程序。
- IP 分配:Agent 从本地 IPAM 池中分配 IP 地址,并配置到 Pod 的 veth 接口。
- 路由与策略:Agent 更新 eBPF map,添加该 Pod 的路由和策略规则。
- 返回结果:CNI 插件将接口信息、IP 地址、路由等返回给 kubelet。
性能注意: CNI 插件本身不执行任何繁重操作,所有复杂逻辑(策略、转发)都在 Agent 和 eBPF 中完成。这使得 ADD/DELETE 操作非常快速,通常在毫秒级完成。
2.5 eBPF 数据路径:高性能内核网络
eBPF 数据路径是 Cilium 性能优势的根本来源。它允许用户在不修改内核源代码或加载内核模块的情况下,安全高效地扩展内核功能。
下图展示了 Cilium 在节点上的 eBPF 数据路径架构:
2.6 Hubble:可观测性组件
Hubble 是构建在 Cilium 和 eBPF 之上的分布式网络可观测性平台。它能够以零侵扰的方式捕获集群内的网络流量、策略命中情况以及服务依赖关系。
- Hubble Agent (DaemonSet):运行在每个节点上,通过 gRPC 从 Cilium Agent 获取 eBPF 事件流,并进行聚合、过滤和缓存。
- Hubble Server (Deployment):提供统一的查询 API,支持基于时间、标签、IP、端口等维度的流日志检索。
- Hubble UI:提供图形化界面,展示实时流量、服务拓扑图以及策略审计日志。
- Hubble Relay:作为集群内多个 Hubble Agent 的聚合层,提供全局视图。
多租户场景价值: Hubble 可以按命名空间、标签或安全标识过滤流量。在灰度发布过程中,运维人员可以通过 Hubble 实时观察新版本 Pod 的流量模式、连接状态以及是否被策略拒绝,从而快速定位问题。
下图展示了 Hubble 在集群中的部署架构及其数据流:
2.7 组件交互流程
以下是一个 Pod 创建过程中,各组件协同工作的典型流程:
- kubelet 调用 CNI 插件,传入 Pod 信息。
- CNI 插件 通过 Unix Socket 将请求转发给本节点的 Cilium Agent。
- Cilium Agent 向 Cilium Operator 请求分配 Security Identity。
- Cilium Operator 返回全局唯一的 Identity。
- Cilium Agent 创建 veth 对,分配 IP,并将 Identity 和网络配置写入 eBPF map。
- Cilium Agent 加载或更新 eBPF 程序,确保新 Pod 的网络策略和转发规则生效。
- Hubble Agent 感知到新端点创建,开始捕获该 Pod 的网络事件。
- CNI 插件 将成功结果返回给 kubelet,Pod 进入 Running 状态。
灰度发布影响: 在灰度发布场景中,新版本的 Pod 会获得与旧版本不同的标签或 Identity。Cilium 策略可以基于这些标签进行精细化控制,例如只允许 10% 的流量进入新版本 Pod,而 Hubble 可以实时展示这 10% 流量的健康状态。