3. Cilium核心架构:Cilium组件(Agent、Operator、CNI)、eBPF数据路径、与kube-proxy的关系

理解Cilium的核心架构是进行网络性能调优的前提。Cilium并非一个简单的CNI插件,而是一个由多个协同组件构成的、基于eBPF的完整网络、安全与可观测性平台。本章将深入剖析其三大核心组件(Agent、Operator、CNI)、eBPF数据路径的工作原理,以及它如何替代传统的kube-proxy,实现高性能的服务负载均衡。

3.1 Cilium核心组件架构

Cilium采用去中心化的控制平面与分布式数据平面相结合的设计。其核心组件包括运行在每个节点上的Cilium Agent、管理集群级任务的Cilium Operator,以及符合CNI规范的cilium-cni插件。

架构核心思想: Cilium Agent负责将用户意图(如网络策略、服务定义)通过eBPF程序直接注入Linux内核,实现高性能的数据包处理,无需对数据包进行昂贵的用户态-内核态切换。

3.1.1 组件功能对比

组件 部署模式 核心职责 关键交互对象
Cilium Agent (cilium-agent) DaemonSet,每个节点一个 管理eBPF程序、本地端点、网络策略、服务映射;与Kubernetes API Server通信 Kubernetes API Server、本地节点内核、cilium-cni
Cilium Operator (cilium-operator) Deployment,集群级 处理集群范围任务:IP地址管理(IPAM)、多集群网络、节点间身份同步 Kubernetes API Server、Cilium Agent
cilium-cni 插件 二进制文件,由kubelet调用 实现CNI接口,将Pod网络命名空间接入Cilium管理的网络 kubelet、Cilium Agent(通过Unix Socket)

3.1.2 组件工作流程

  1. Pod创建触发: kubelet调用cilium-cni插件。
  2. CNI插件转发: cilium-cni将请求通过本地Unix Socket转发给本节点的Cilium Agent。
  3. Agent配置网络: Cilium Agent为Pod分配IP地址(从本地IP池或CRI-RM),创建网络接口(veth pair),并将接口一端放入Pod网络命名空间。
  4. eBPF程序挂载: Cilium Agent在宿主机侧的网络接口上挂载eBPF程序,用于处理该Pod的入站和出站流量。
  5. 策略与身份下发: Cilium Agent根据集群范围的网络策略和服务定义,更新本地eBPF Map,确保数据路径能够正确执行转发和策略决策。
Cilium 核心组件交互架构 Cilium 核心组件交互架构 Kubernetes API Server Cilium Operator Cilium Agent cilium-cni 插件 kubelet Pod 网络命名空间 Watch / 同步 Watch / 协调 身份同步 调用CNI ADD Unix Socket 请求 配置网络 / 挂载eBPF 说明:Agent 是核心执行者,Operator 负责集群级协调,CNI 插件是 kubelet 与 Agent 之间的桥梁。

3.2 eBPF数据路径

eBPF数据路径是Cilium性能优势的根本来源。与传统基于iptables或IPVS的转发路径不同,Cilium将eBPF程序直接附着在Linux内核的网络栈关键钩子点(如XDP、TC、cgroup),实现对数据包的极速处理。

3.2.1 关键钩子点与功能

钩子点 附着位置 在Cilium中的主要用途 性能优势
XDP 网卡驱动层(最早) DDoS防御、早期包过滤、负载均衡(DSR模式) 极低延迟,无需分配sk_buff
TC (ingress/egress) 内核网络栈 Pod间通信、网络策略执行、封装/解封装(VXLAN/Geneve) 灵活,可访问完整网络栈上下文
cgroup/cgroup2 控制组层级 套接字级策略(如禁止特定端口出站)、DNS策略 细粒度,与Pod生命周期强关联

3.2.2 数据包处理流程(以Pod间通信为例)

  1. 源Pod发包: 数据包从Pod的veth接口进入宿主机网络命名空间。
  2. TC ingress 处理: 宿主机侧veth接口上的TC ingress eBPF程序被触发。程序查询eBPF Map,确定目标Pod是否在同一节点。
  3. 策略检查: 根据源Pod的安全身份和目标Pod的标签,查询网络策略Map。如果策略不允许,数据包被直接丢弃(TC_ACT_SHOT)。
  4. 转发决策:
    • 同节点: 直接通过veth pair将数据包转发到目标Pod。
    • 跨节点: 查询路由表或隧道Map,进行封装(如VXLAN)后,通过物理网卡发送。
  5. 目标Pod接收: 目标Pod侧veth接口上的TC egress程序(或对端ingress)接收数据包,完成最终交付。
性能关键点: 整个数据路径完全在内核态完成,没有上下文切换,没有用户态代理参与。eBPF Map作为高效的键值存储,用于查找端点、策略和服务信息,其查找速度远快于iptables规则遍历。
Cilium eBPF 数据路径流程图 Cilium eBPF 数据路径(Pod间通信) 源 Pod veth pair TC ingress (eBPF 程序) eBPF Maps 策略决策 转发 / 封装 目标 Pod 说明:数据包从源Pod出发,经过veth pair进入宿主机网络栈。TC ingress eBPF程序查询eBPF Maps进行策略和转发决策。 若策略允许,数据包被直接转发到目标Pod(同节点)或经过封装后跨节点发送。整个过程无用户态切换。

3.3 Cilium与kube-proxy的关系

在Kubernetes集群中,kube-proxy负责实现Service的负载均衡。Cilium可以完全替代kube-proxy,提供更高效、更灵活的服务转发能力。

3.3.1 替代模式:kube-proxy replacement

Cilium通过其kube-proxy replacement功能,在eBPF层面直接实现Service的ClusterIP、NodePort、LoadBalancer和ExternalIP的转发。当启用此模式时,集群中不应再运行kube-proxy。

3.3.2 性能对比:Cilium eBPF vs. kube-proxy (iptables/IPVS)

特性 kube-proxy (iptables) kube-proxy (IPVS) Cilium eBPF (kube-proxy replacement)
数据路径 内核Netfilter钩子,规则链遍历 内核IPVS哈希表 eBPF Map + 内核钩子
扩展性(Service数) 差(规则数随Pod数平方增长) 好(哈希查找,O(1)) 极好(eBPF Map,O(1))
延迟 高(规则遍历) 中等 极低(直接内核态决策)
NodePort 性能 需要SNAT,回程路径长 需要SNAT 支持DSR(直接服务器返回),回程不经过节点
外部流量策略 仅支持 local 或 cluster 仅支持 local 或 cluster 支持 local、cluster 及更精细的控制
可观测性 低(依赖conntrack) 低 高(通过eBPF导出L3/L4/L7指标)

3.3.3 启用kube-proxy replacement的配置

在Cilium的ConfigMap中,通过以下关键配置启用该功能:

# cilium-config ConfigMap 关键配置
kube-proxy-replacement: strict   # 可选: "strict", "probe", "partial"
# 当设置为 "strict" 时,Cilium会完全接管所有Service功能,并检查集群中是否还有kube-proxy运行。
# 推荐生产环境使用 "strict" 模式,以获得最佳性能和一致性。
重要提示: 在启用 kube-proxy-replacement: strict 之前,必须确保集群中所有节点的kube-proxy已被移除或停止。否则,Cilium Agent会启动失败,并报告冲突。建议在部署Cilium时,通过Helm参数 --set kubeProxyReplacement=true 进行配置。

3.3.4 蓝绿发布场景下的优势

在蓝绿发布中,Service的流量切换是关键操作。Cilium的kube-proxy replacement提供了以下优势:

  • 瞬时切换: 通过更新eBPF Map中的后端端点,实现毫秒级的流量切换,无需重建连接或重启服务。
  • 精细化流量控制: 可以基于L7协议(如HTTP Header)或源IP进行流量分发,实现金丝雀发布与蓝绿发布的结合。
  • 减少抖动: 由于eBPF程序直接在内核态更新,避免了kube-proxy更新iptables规则时可能引起的连接中断(conntrack问题)。