2. Cilium 架构概览:数据面、控制面与 Kubernetes 集成

在容量规划视角下,理解 Cilium 的架构分层是优化网络接口配置的前提。Cilium 的核心设计遵循“控制面-数据面”分离原则,并通过 eBPF 技术将网络策略、负载均衡与可观测性下沉到内核层执行。本章从数据面、控制面及与 Kubernetes 的集成关系三个维度展开,为后续接口配置优化建立架构基础。

2.1 数据面:eBPF 驱动的内核转发引擎

Cilium 的数据面完全基于 eBPF(extended Berkeley Packet Filter)实现,不依赖传统的 iptables 或 IPVS。eBPF 程序被挂载到网络协议栈的关键钩子点(如 XDP、TC、套接字),在数据包到达用户态之前完成转发、过滤与封装决策。

容量规划要点: eBPF 数据面消除了 iptables 规则链的线性遍历开销,在 Pod 密度超过 500/节点时,CPU 消耗比传统方案降低 60%-80%。但 eBPF 程序本身的指令复杂度与 map 大小会直接影响吞吐,需在配置阶段评估。

数据面核心组件

组件 挂载点 功能 容量影响
cilium_net TC ingress/egress Pod 间 L3/L4 策略执行 策略规则数 → map 内存占用
cilium_host TC ingress 主机与 Pod 通信转发 主机路由表规模
lxc_health XDP / TC 节点健康探测代理 探测频率 × 节点数
cilium_vxlan (隧道模式) TC egress VXLAN 封装/解封装 MTU 调整 + 隧道头部开销
配置建议: 在原生路由模式下,cilium_host 接口的 MTU 应设置为“底层网络 MTU - 50(Geneve 头部)”;隧道模式下需额外减去 50 字节。错误 MTU 会导致分片重传,直接影响 PPS 上限。
Cilium 数据面 eBPF 钩子与接口关系 Cilium 数据面 eBPF 钩子与接口关系 Pod A (veth) Pod B (veth) cilium_net TC ingress/egress eBPF Map 策略 / 端点 / 路由 cilium_vxlan VXLAN 封装 说明: 数据包从 Pod veth 进入 cilium_net,eBPF 程序查询 map 执行策略决策; 隧道模式下经 cilium_vxlan 封装后出节点;原生路由模式直接通过主机路由转发。

2.2 控制面:Agent 与 Operator 的分工

Cilium 的控制面由两个主要组件构成:Cilium Agent(DaemonSet,每节点运行)和 Cilium Operator(Deployment,集群级运行)。它们共同负责策略下发、端点管理、身份分配与集群协调。

2.2.1 Cilium Agent — 节点级控制引擎

  • 端点管理: 监听 Kubernetes API,维护本地 Pod 与主机的端点映射,写入 eBPF map。
  • 策略编译: 将 CiliumNetworkPolicy / CiliumClusterwideNetworkPolicy 编译为 eBPF 指令集。
  • 接口配置: 创建/删除 cilium_net、cilium_host、lxc_health 等虚拟接口,设置 MTU、MAC、路由。
  • 健康探测: 通过 cilium-health 子进程定期检测节点与 Pod 连通性。
容量风险: Agent 的 eBPF map 大小由 --bpf-map-dynamic-size-ratio 控制。在 Pod 密度 > 1000/节点时,默认 ratio 可能导致 map 溢出,引发策略丢失。建议按“预期端点数 × 1.5”预留 map 容量。

2.2.2 Cilium Operator — 集群级协调器

职责 实现机制 容量规划关注点
身份(Identity)分配 基于安全标签的全局 ID 池 ID 池大小(默认 65535),超限后策略降级
节点间隧道端点同步 KVStore(etcd / CRD) 节点数 > 500 时 etcd watch 压力
CNI 插件协调 为每个新 Pod 分配 IP 并通知 Agent IP 池耗尽速度与回收延迟
ClusterMesh 跨集群 跨集群身份与服务同步 跨集群带宽与延迟对同步的影响

2.3 与 Kubernetes 的集成关系

Cilium 通过 CNI 接口与 kubelet 集成,并利用 CRD(Custom Resource Definition)扩展 Kubernetes 网络策略模型。集成链路直接影响接口配置的生效路径与性能开销。

集成流程(Pod 创建场景)

  1. kubelet 调用 Cilium CNI 二进制(cilium-cni)。
  2. CNI 插件 通过 gRPC 请求本地 Agent 分配 IP 与端点 ID。
  3. Agent 创建 veth pair,一端放入 Pod 网络命名空间,另一端挂载到 cilium_net 桥接。
  4. Agent 编译该 Pod 的安全策略,写入 eBPF map,设置 TC 钩子。
  5. Operator 更新全局身份映射,通知其他节点更新策略。
延迟敏感场景: 步骤 3-4 中,Agent 需要为每个新 Pod 编译策略。当集群每秒创建 Pod 数 > 50 时,建议启用 --bpf-policy-map-max=32768 并预编译常用策略模板,避免编译队列积压。
Cilium 控制面与 Kubernetes 集成流程 Cilium 控制面与 Kubernetes 集成流程 kubelet cilium-cni Cilium Agent Cilium Operator eBPF Map 集成链路: kubelet → CNI 插件 → Agent(分配 IP + 编译策略)→ eBPF Map 生效;Operator 异步同步全局身份。 容量瓶颈点:Agent 策略编译速度、Operator 身份池大小、eBPF map 内存上限。

2.4 架构视角的容量规划要点

基于上述架构分析,在 Cilium 网络接口配置优化前,需建立以下容量基线:

  • eBPF map 内存: 每个端点约占用 2-4 KB map 内存,1000 端点节点需预留 4-8 MB;策略规则数每增加 1000 条,额外消耗 1-2 MB。
  • Agent CPU 预算: 策略编译为 CPU 密集型操作,建议为 Agent 预留 0.5-1 核(高密度节点 2 核)。
  • Operator 协调延迟: 节点数 > 300 时,Operator 与 etcd 之间的 watch 延迟可能超过 5s,需调整 --operator-pprof 与 etcd 心跳间隔。
  • 接口 MTU 链: 从 Pod veth → cilium_net → 主机 eth0,每一跳 MTU 必须一致或递减,否则触发内核分片。
关键指标速查:
· 最大 Pod 密度/节点:建议 ≤ 750(原生路由)/ ≤ 500(隧道模式)
· 最大策略规则数/节点:≤ 5000(超出后建议启用 --bpf-policy-map-max 扩容)
· 最小 MTU 配置:eth0 MTU - 50(隧道模式)/ eth0 MTU - 0(原生路由)