Cilium 架构核心组件解析

Cilium 基于 eBPF(extended Berkeley Packet Filter)技术构建,其架构由多个协同工作的组件组成。理解这些组件及其交互流程,是掌握 Cilium 网络策略与性能调优的基础。本章将深入解析 Cilium Agent、Cilium Operator、Cilium CLI 以及 Hubble 观测平台的核心职责与协作机制。

组件总览与职责划分

Cilium 的架构遵循“控制面-数据面-观测面”分离的设计原则。下表总结了各核心组件的定位与关键职责:

组件 部署形态 核心职责 关键能力
Cilium Agent DaemonSet(每节点一个) 数据面策略执行、eBPF 程序管理 端点管理、网络策略下发、Service 负载均衡
Cilium Operator Deployment(通常 1-2 副本) 集群级控制面协调 身份管理、IPAM、KVStore 同步、CRD 状态维护
Cilium CLI 客户端二进制 运维调试与策略验证 策略预览、连通性测试、eBPF 状态查询
Hubble DaemonSet + Deployment 可观测性与安全监控 流量捕获、L3/L4/L7 可见性、策略审计
架构要点:Cilium Agent 是唯一直接操作 eBPF 的组件,Operator 负责集群级状态协调,Hubble 作为观测层独立运行,三者通过 gRPC 和 CRD 进行通信。

Cilium Agent:数据面的执行引擎

Cilium Agent 以 DaemonSet 方式运行在每个 Kubernetes 节点上,是 Cilium 数据面的核心。它负责将用户定义的网络策略和安全规则编译为 eBPF 程序,并挂载到网络设备上。

  • 端点管理:Agent 通过监听 Kubernetes API Server 获取 Pod 变化,为每个 Pod 创建对应的 CiliumEndpoint 对象,并分配安全身份标识(Security Identity)。
  • 策略编译:将 CiliumNetworkPolicy 和 CiliumClusterwideNetworkPolicy 转换为 eBPF map 中的键值对,实现 O(1) 复杂度的策略匹配。
  • Service 处理:利用 eBPF 实现 kube-proxy 替代,支持 DSR(Direct Server Return)和 Maglev 一致性哈希,提升负载均衡性能。
  • 健康检查:定期通过 eBPF 程序检测节点和端点的连通性,更新 ClusterMesh 状态。

Cilium Operator:集群控制面的协调者

Operator 负责处理全局性的控制面任务,减轻 Agent 的负担,避免每个 Agent 都去竞争 API Server 资源。

  • 身份管理:为每个安全身份(Security Identity)分配全局唯一的数字 ID,并维护身份与标签的映射关系。
  • IPAM(IP 地址管理):根据集群配置(如 CRD-backed、ENI、Azure IPAM)分配 Pod CIDR,回收已释放的 IP。
  • KVStore 同步:当使用 etcd 作为状态存储时,Operator 负责将集群状态写入 KVStore,供跨节点 Agent 同步。
  • CRD 状态更新:监控 CiliumEndpoint、CiliumNode 等 CRD 的状态变化,触发相应的协调逻辑。
注意:在 Cilium 1.14+ 版本中,Operator 的职责进一步精简,部分功能(如端点垃圾回收)已迁移至 Agent 的 Leader Election 机制中。

Cilium CLI:运维与调试利器

Cilium CLI 是管理员最常用的命令行工具,它直接与 Cilium Agent 的本地 API 通信,提供实时状态查询和策略验证能力。

命令 功能说明 典型场景
cilium status 查看 Agent 健康状态、KVStore 连接、eBPF 资源使用 快速诊断节点级问题
cilium endpoint list 列出本节点所有端点及其安全身份、策略状态 验证 Pod 是否被正确纳管
cilium bpf policy get 查看指定端口的 eBPF 策略 map 内容 调试策略是否按预期生效
cilium connectivity test 执行端到端连通性测试,验证网络策略 集群部署后的冒烟测试

Hubble:可观测性与安全审计

Hubble 构建在 Cilium 的数据面之上,利用 eBPF 的观测能力提供细粒度的流量可视化和策略审计功能。

  • Hubble Relay:作为集群内的 gRPC 代理,聚合所有 Hubble Agent 的数据,提供统一的查询接口。
  • Hubble UI:基于 Relay 数据的 Web 界面,展示服务依赖图、流量拓扑和策略拒绝事件。
  • Hubble CLI:提供 hubble observe 命令,支持按 Pod、标签、IP、协议等维度过滤实时流量。
  • 指标暴露:将 eBPF 捕获的流量指标(如每秒包数、延迟分布)以 Prometheus 格式暴露,便于集成到监控系统。

组件交互流程与数据流

下图展示了 Cilium 各组件之间的核心交互流程,从策略创建到 eBPF 程序生效的完整链路:

Cilium 组件交互流程 用户 / 管理员 kubectl / cilium CLI kubectl / Cilium CLI 创建/更新策略 Kubernetes API Server Watch CRD 变化 Cilium Operator 身份分配 / IPAM 同步 Cilium Agent 编译并加载 eBPF 程序 eBPF 数据面 Hubble Agent eBPF map / perf event Hubble Relay Hubble UI / CLI 流程说明:策略通过 kubectl 写入 API Server → Operator 协调身份与 IP → Agent 编译 eBPF 程序 → Hubble 从 eBPF 捕获流量并聚合展示

关键交互流程详解

以下步骤描述了从用户创建网络策略到 eBPF 程序生效的完整链路:

  1. 策略提交:用户通过 kubectl apply -f policy.yaml 将 CiliumNetworkPolicy 提交到 Kubernetes API Server。
  2. CRD 存储:API Server 将策略存储为 CRD 对象,并触发 Watch 通知。
  3. Operator 协调:Cilium Operator 监听到策略变化,为涉及的端点分配或更新安全身份(Security Identity),并将身份信息写入 CiliumEndpoint 状态。
  4. Agent 拉取:每个节点上的 Cilium Agent 通过 Watch 机制或 Operator 的推送,获取本节点相关的策略和身份信息。
  5. eBPF 编译:Agent 将策略规则(L3/L4/L7)编译为 eBPF 指令,并更新 eBPF map(如 cilium_policy、cilium_ct)。
  6. 数据面生效:eBPF 程序挂载到网络设备(如 lxc、eth0),对进出流量执行策略匹配和转发。
  7. Hubble 捕获:Hubble Agent 通过读取 eBPF map 和 perf event 环形缓冲区,获取流量元数据(源/目的 IP、端口、Verdict)。
  8. 观测聚合:Hubble Relay 聚合集群内所有 Hubble Agent 的数据,通过 gRPC 暴露给 Hubble UI 或 CLI。
性能关键点:整个流程中,只有步骤 5(eBPF 编译)涉及 CPU 密集型操作,且仅在策略变更时触发。数据面的策略匹配完全在 eBPF 中完成,不经过用户态,因此延迟通常在微秒级。

组件通信方式总结

下表总结了各组件之间的通信协议与数据流向:

源组件 目标组件 通信协议 数据内容
Cilium CLI Cilium Agent gRPC (Unix Socket) 状态查询、策略调试、eBPF map 读取
Cilium Agent Kubernetes API Server HTTPS (REST) Watch Pod/Policy/Endpoint 变化
Cilium Operator Kubernetes API Server HTTPS (REST) CRD 状态更新、身份分配
Cilium Agent Cilium Operator gRPC (可选) 身份分配请求、IPAM 租约
Hubble Agent Cilium Agent 共享内存 / eBPF map 流量事件、策略 Verdict
Hubble Relay Hubble Agent gRPC (TCP) 聚合后的流量流(Flow)数据

架构设计要点总结

  • 去中心化数据面:每个节点上的 Agent 独立管理本地的 eBPF 程序,不依赖中心化控制器进行数据包处理,避免单点瓶颈。
  • 控制面分层:Operator 处理全局状态(身份、IP),Agent 处理本地状态(端点、策略),降低 API Server 压力。
  • 观测面解耦:Hubble 作为独立组件,即使 Hubble 集群故障,Cilium 的数据面转发和策略执行不受影响。
  • eBPF 作为统一底座:无论是网络策略、负载均衡还是可观测性,都基于 eBPF 的 map 和程序实现,避免了多套内核模块的维护成本。