为什么cilium-proxy比kube-proxy ipvs模式性能更优?
针对你提到的Cilium基准测试结果,核心原因可以从几个关键技术差异来解释,不用深究eBPF底层细节也能理解:
更少的用户态/内核态上下文切换
kube-proxy的IPVS模式虽然依赖内核态的IPVS模块处理转发,但kube-proxy本身是用户态进程:它需要监听K8s的服务、端点变化,再调用内核接口把规则同步到IPVS。这个过程中,规则更新、部分流量的辅助处理都要在用户态和内核态之间来回切换,每次切换都会带来额外的开销。
而Cilium的eBPF代理直接把大部分转发、负载均衡逻辑放在内核态运行,不需要频繁在用户态和内核态之间跳转,省掉了上下文切换的性能损耗。更短的数据包处理路径
传统IPVS的流量处理需要走完整的内核网络栈流程,数据包要经过TCP/IP协议栈的多个层级处理后才会被转发。
Cilium用eBPF可以在网络栈的更早阶段(比如网卡刚收到数据包的XDP阶段,或者流量控制TC阶段)就拦截并处理数据包,直接完成转发决策,跳过了很多内核网络栈的冗余步骤,大幅缩短了数据包的处理时间。内核态原生的负载均衡逻辑
IPVS的负载均衡算法是内核实现的,但如果要做一些自定义或更精细化的策略(比如基于实时延迟、连接数的动态调整),往往需要用户态进程配合收集数据再更新规则。
而Cilium的eBPF程序可以直接在内核态实现这些高级负载均衡逻辑,不需要用户态进程参与,数据收集和决策都在内核态完成,效率自然更高。更高效的规则同步机制
在大规模K8s集群中,服务和端点的变化很频繁,kube-proxy需要不断从K8s API拉取变化,再逐条更新内核的IPVS规则,这个过程不仅慢,还会带来额外的内核资源消耗。
Cilium通过eBPF在内核态缓存服务信息,规则更新可以批量或增量地直接写入内核,不需要用户态进程做中间处理,规则同步的开销比kube-proxy小很多,集群规模越大,这个优势越明显。
内容的提问来源于stack exchange,提问作者pandawithcat

