2. Cilium 架构解析:核心组件与交互流程

Cilium 基于 eBPF(extended Berkeley Packet Filter)实现,其架构由多个协同工作的组件构成。理解这些组件的功能与交互,是排查容器网络缓存命中故障、进行性能调优的基础。本章将深入解析 Cilium Agent、Cilium Operator、Cilium CNI 插件以及 Hubble 观测组件。

2.1 核心组件总览

Cilium 的架构采用控制面与数据面分离的设计。数据面运行在 Linux 内核中,通过 eBPF 程序实现网络策略、负载均衡与可观测性;控制面则由运行在用户空间的守护进程和控制器组成。

组件 运行位置 核心职责
Cilium Agent 每个 Kubernetes 节点(DaemonSet) 管理 eBPF 程序、同步网络策略、处理节点事件
Cilium Operator 集群级单实例(Deployment) 协调集群状态、管理 IPAM、处理节点故障
Cilium CNI 插件 每个节点上的二进制文件 响应 kubelet CNI 请求,配置 Pod 网络命名空间
Hubble 每个节点 + 集群级 UI/Server 提供网络流量的可观测性与监控
Cilium 核心组件架构图 Kubernetes 集群 Cilium Operator 集群级控制器 • IPAM 管理 • 节点故障协调 • 身份标识同步 • 网络策略聚合 Kubernetes 节点 1 Cilium Agent • eBPF 管理 • 策略执行 • 端点管理 Hubble Relay • 流量监控 • 指标采集 • 事件导出 Kubernetes 节点 2 Cilium Agent • eBPF 管理 • 策略执行 • 端点管理 Hubble Relay • 流量监控 • 指标采集 • 事件导出 Hubble UI / Server • 可视化仪表盘 • 服务拓扑图 • 流量查询

2.2 Cilium Agent:节点级核心引擎

Cilium Agent 是运行在每个 Kubernetes 节点上的守护进程,通过 DaemonSet 部署。它是整个 Cilium 数据面管理的核心,直接与 Linux 内核交互。

2.2.1 核心功能

  • eBPF 程序生命周期管理:Agent 负责将编译好的 eBPF 程序加载到内核的特定挂载点(如 XDP、TC、cgroup、套接字),并管理其生命周期。
  • 端点(Endpoint)管理:每个 Pod 在 Cilium 中被抽象为一个“端点”。Agent 维护端点的标识、标签、网络策略和状态。
  • 网络策略同步:监听 Kubernetes API Server 中的 NetworkPolicy 资源,将其转换为 eBPF map 中的高效查找表,实现数据面的策略执行。
  • 服务负载均衡:实现基于 eBPF 的 kube-proxy 替代方案,将 Service 流量直接转发到后端 Pod,避免 iptables 的性能瓶颈。
  • 节点事件处理:监听节点、Pod、Service 的创建、更新和删除事件,动态调整 eBPF 程序和数据路径。

2.2.2 关键数据流

Kubernetes API Server
        │
        ▼
Cilium Agent (用户空间)
        │
        ├── 监听事件 (Watch)
        ├── 解析策略 (Policy Engine)
        ├── 生成 eBPF Map 条目
        └── 加载/更新 eBPF 程序
                │
                ▼
Linux 内核 (eBPF 运行时)
        │
        ├── XDP/TC 程序 (网络数据面)
        ├── cgroup 程序 (套接字层)
        └── eBPF Maps (策略/状态存储)
性能调优要点: Agent 与 API Server 之间的 Watch 连接是事件驱动的核心。如果 Agent 因资源限制导致 Watch 超时或重连,会引发策略同步延迟,进而影响数据面的缓存命中率。建议为 Agent 设置充足的 CPU 和内存资源,并监控 cilium_agent_api_events_received 指标。

2.3 Cilium Operator:集群级协调器

Cilium Operator 是一个集群级的单实例控制器(通常以 Deployment 形式运行),负责处理全局性的协调任务,不直接参与数据面操作。

职责领域 具体任务 对缓存命中的影响
IPAM(IP 地址管理) 分配 Pod CIDR、管理 IP 池、处理 IP 冲突 IP 分配延迟会导致 Pod 启动时 CNI 插件等待,影响网络就绪时间
身份标识(Identity)管理 为安全策略分配全局唯一的 Security Identity 身份同步延迟会导致策略无法及时生效,数据包可能被错误丢弃
节点故障处理 检测节点失联,触发 IP 回收和端点清理 故障处理不及时可能导致连接跟踪表(conntrack)残留,影响新连接
KVStore 协调 在 etcd 或 CRD 模式下同步集群状态 KVStore 性能瓶颈会拖慢所有 Agent 的策略同步速度

2.4 Cilium CNI 插件:Pod 网络入口

Cilium CNI 插件是一个轻量级的二进制文件,安装在每个节点的 CNI 配置目录中(通常为 /opt/cni/bin/)。当 kubelet 需要创建 Pod 网络时,会调用该插件。

2.4.1 工作流程

  1. CNI ADD 调用:kubelet 通过 gRPC 或二进制调用 Cilium CNI 插件,传入 Pod 的命名空间、名称、网络命名空间等信息。
  2. 接口创建:CNI 插件在宿主机上创建 veth pair,一端放入 Pod 的网络命名空间,另一端留在宿主机。
  3. IP 分配:CNI 插件向 Cilium Agent 请求 IP 地址分配(通过本地 Unix Socket 通信)。
  4. 端点注册:Agent 将新 Pod 注册为端点,分配 Security Identity,并加载对应的 eBPF 程序。
  5. 路由配置:CNI 插件在 Pod 网络命名空间内配置默认路由和 IP 地址。
  6. 返回结果:CNI 插件将接口信息、IP 地址、DNS 配置等返回给 kubelet。
缓存命中关键点: CNI 插件与 Agent 之间的通信延迟直接影响 Pod 启动速度。如果 Agent 因负载过高无法及时响应 CNI 请求,会导致 Pod 长时间处于 ContainerCreating 状态。排查时关注 cilium_cni_duration_seconds 指标。

2.5 Hubble:可观测性层

Hubble 是 Cilium 的可观测性组件,提供网络流量的实时监控、分析和可视化能力。它由三个主要部分组成:

  • Hubble Agent(节点级):运行在每个节点上,作为 Cilium Agent 的 sidecar 或内嵌模块,从 eBPF 数据路径采集流量事件。
  • Hubble Relay(集群级):聚合所有节点 Hubble Agent 的数据,提供统一的查询接口。
  • Hubble UI / CLI:提供图形化界面和命令行工具,用于查看服务拓扑、流量日志和指标。

2.5.1 数据采集与缓存

Hubble 通过 eBPF 的 perf_event 环形缓冲区或 BPF map 从内核空间采集数据。这些数据包括:

// Hubble 采集的核心事件类型
- 网络流 (Flow):五元组、方向、Verdict (ALLOW/DROP)
- DNS 请求/响应:域名、IP、返回码
- HTTP 请求/响应:方法、路径、状态码、延迟
- TCP 状态:SYN、FIN、RST、窗口大小
- 策略命中:匹配的策略 ID、动作
缓存故障排查价值: 当出现网络缓存命中故障时,Hubble 可以快速定位问题范围:
  • 使用 hubble observe --verdict DROP 查看被策略丢弃的包。
  • 使用 hubble observe --type trace:to-endpoint 跟踪数据包路径。
  • 通过 Hubble UI 的服务拓扑图,直观判断流量是否经过预期的路径。

2.6 组件交互流程总结

以下是一个 Pod 创建并开始通信的完整交互流程,展示了各组件如何协同工作:

  1. Pod 创建:kubelet 调用 Cilium CNI 插件。
  2. CNI 请求:CNI 插件通过 Unix Socket 向本地 Cilium Agent 请求 IP 和端点注册。
  3. Agent 处理:Agent 分配 IP,创建端点,加载初始 eBPF 程序。
  4. 策略同步:Agent 从 API Server 获取 Pod 相关的 NetworkPolicy,更新 eBPF map。
  5. Operator 协调:Operator 确保全局身份标识一致,处理 IPAM 池状态。
  6. 数据通信:Pod 发送数据包,eBPF 程序在内核中执行策略检查、负载均衡和封装/解封装。
  7. Hubble 采集:eBPF 程序将流量事件推送到 Hubble Agent,Hubble Relay 聚合后供 UI 查询。
常见故障模式:
  • Agent 与 API Server 断连:导致策略无法更新,数据面使用过期缓存。
  • Operator 单点故障:IPAM 分配停滞,新 Pod 无法获取 IP。
  • CNI 插件超时:Agent 负载过高,Pod 启动缓慢。
  • Hubble 环形缓冲区溢出:导致流量事件丢失,影响故障排查。