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 插件是一个轻量级二进制文件,其核心流程如下:

  1. ADD 操作:kubelet 调用 CNI 插件,传入 Pod 的命名空间、名称、容器 ID 等信息。
  2. 请求转发:CNI 插件通过 Unix Socket 将请求转发给本节点的 Cilium Agent。
  3. 接口创建:Agent 创建一对 veth 设备,一端放入 Pod 网络命名空间,另一端连接到主机的 ciliun_net 网桥或直接附加 eBPF 程序。
  4. IP 分配:Agent 从本地 IPAM 池中分配 IP 地址,并配置到 Pod 的 veth 接口。
  5. 路由与策略:Agent 更新 eBPF map,添加该 Pod 的路由和策略规则。
  6. 返回结果:CNI 插件将接口信息、IP 地址、路由等返回给 kubelet。
性能注意: CNI 插件本身不执行任何繁重操作,所有复杂逻辑(策略、转发)都在 Agent 和 eBPF 中完成。这使得 ADD/DELETE 操作非常快速,通常在毫秒级完成。

2.5 eBPF 数据路径:高性能内核网络

eBPF 数据路径是 Cilium 性能优势的根本来源。它允许用户在不修改内核源代码或加载内核模块的情况下,安全高效地扩展内核功能。

下图展示了 Cilium 在节点上的 eBPF 数据路径架构:

Cilium eBPF 数据路径架构 Cilium eBPF 数据路径架构 用户空间 (User Space) Cilium Agent Hubble Server CNI 插件 内核空间 (Kernel Space - eBPF) 网络入口 (XDP/TC) 策略执行 (L3/L4/L7 过滤) 负载均衡 连接跟踪 (Conntrack) 加密 (IPsec/WireGuard) 网络出口 (TC) 说明:数据包从网卡进入,经过 XDP/TC 钩子,依次执行策略检查、负载均衡、连接跟踪,最后从 TC 出口发出。

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 在集群中的部署架构及其数据流:

Hubble 部署架构与数据流 Hubble 部署架构与数据流 K8s 节点 1 Cilium Agent Hubble Agent K8s 节点 2 Cilium Agent Hubble Agent K8s 节点 3 Cilium Agent Hubble Agent Hubble Relay (集群聚合层) Hubble UI / CLI 说明:Hubble Agent 从 Cilium Agent 获取 eBPF 事件,Hubble Relay 聚合所有 Agent 数据,Hubble UI/CLI 提供查询接口。

2.7 组件交互流程

以下是一个 Pod 创建过程中,各组件协同工作的典型流程:

  1. kubelet 调用 CNI 插件,传入 Pod 信息。
  2. CNI 插件 通过 Unix Socket 将请求转发给本节点的 Cilium Agent。
  3. Cilium Agent 向 Cilium Operator 请求分配 Security Identity。
  4. Cilium Operator 返回全局唯一的 Identity。
  5. Cilium Agent 创建 veth 对,分配 IP,并将 Identity 和网络配置写入 eBPF map。
  6. Cilium Agent 加载或更新 eBPF 程序,确保新 Pod 的网络策略和转发规则生效。
  7. Hubble Agent 感知到新端点创建,开始捕获该 Pod 的网络事件。
  8. CNI 插件 将成功结果返回给 kubelet,Pod 进入 Running 状态。
灰度发布影响: 在灰度发布场景中,新版本的 Pod 会获得与旧版本不同的标签或 Identity。Cilium 策略可以基于这些标签进行精细化控制,例如只允许 10% 的流量进入新版本 Pod,而 Hubble 可以实时展示这 10% 流量的健康状态。