WEBKT

eBPF vs iptables:Service Mesh 流量劫持性能极限对比实测

27 0 0 0

在 Service Mesh 架构中,Sidecar 代理的流量劫持方式直接影响整个服务网格的延迟和吞吐量。传统的 iptables方案虽然成熟稳定,但在高并发场景下会面临显著的转发开销。本文通过实际压测,对比 eBPF 和 iptables 在 Linux 虚拟机环境下的流量劫持性能表现,看看 eBPF 是否真的能成为「下一代」解决方案。

一、为什么这个问题值得专门测试?

Istio、Linkerd 等主流 Service Mesh 默认使用 iptables 进行透明流量拦截。这种方式的优势是通用性强、内核原生支持,但代价也很明显:每条连接都需要经过 netfilter 的多个 hook 点,在 conntrack、NAT 表之间反复跳转

当 Sidecar 处理数万 QPS 时,iptables 的链表查找和规则匹配会成为瓶颈。有意思的是,这个问题并不是「想象中的问题」——Envoy 社区早就有人在生产环境中报告过类似现象,甚至催生了 Cilium 这种完全基于 eBPF 的替代方案。

但理论归理论,实际差距有多大?我决定自己搭环境测一把。

二、技术原理快速回顾

iptables 的流量劫持路径

应用程序 → connect() → netfilter(NF_INET_LOCAL_OUT) 
        → routing decision 
        → netfilter(NF_INET_PRE_ROUTING) 
        → conntrack 
        → NAT redirect 
        → Sidecar Proxy (127.0.0.1:端口)

一次出站连接要经过 5 个以上的内核检查点,每次都涉及协议栈的开销。对于短连接频繁的场景,这个开销会被放大很多倍。

eBPF 的替代路径

eBPF 通过 sk_msgsk_redirect 等钩子,可以在 socket 层直接完成流量的重定向,绕过大部分 netfilter 代码路径:

应用程序 → socket send() 
       → BPF_PROG_TYPE_SK_MSG 
       → 直接 redirect 到 Sidecar socket

这意味着从「5个检查点」降到「1个 BPF 程序执行」,理论上延迟可以大幅降低。

三、测试环境搭建

环境规格

配置项 说明
CPU AMD EPYC 7J13 @ 2GHz × 16(虚拟化)
内存 32GB DDR4
内核 Linux 5.15.0(Ubuntu 22.04 LTS)
Kubernetes v1.28(k3s 单节点)
CNI Cilium + eBPF mode / Calico + kube-proxy(iptables)

安装必要的工具链

# 安装 bpftrace 和相关工具用于观测
sudo apt-get update && sudo apt-get install -y \
    bpfcc-tools libbpfcc linux-headers-$(uname -r)

# 检查内核 BPF 支持情况
bpftool feature probe | grep -E "(sock_ops|sk_msg|redirect)"

# 安装 wrk 用于 HTTP 请求压测(带 Lua 支持的增强版)
git clone https://github.com/wg/wrk.git && cd wrk && make -j$(nproc)

构建测试用的 Pod 和 Service

我们用两个简单的 nginx 应用作为 Client-Server,用 Envoy 作为 Sidecar:

# client.yaml - 带 Sidecar 的客户端 Pod
apiVersion: v1
kind: Pod
metadata:
  name: client-pod
spec:
  containers:
    - name: client-app  
      image: curlimages/curl:latest
    
---
# server.yaml - 服务端 Deployment + Service  
apiVersion: apps/v1
kind: Deployment  
metadata:
  name: server-deploy  
spec:
  replicas: 1  
---
apiVersion: v1  
kind: Service  
metadata:
    name: server-svc  
spec:
    selector:
      app: server  
    ports:
      - port: 8080  

# 为了精确控制,我们直接部署原始形态,不用 Istio 自动注入,手动注入 Envoy sidecar 来确保可控性。

四、基准性能测试(无 Sidecar)

首先测量「纯净状态」的性能上限,排除任何代理干扰:

# 在 Pod 内执行简单基准测试(单连接,持续30秒)
wrk -t4 -c50 -d30s --latency http://server-svc.default.svc.cluster.local.:8080/

# 结果记录(A):基准 RTT ≈ X ms,平均 QPS ≈ Y k/s,待对照用...

⚠️ 注意:不同硬件环境下数值差异很大,建议在自己的环境中跑一遍作为 baseline。以下数据仅代表本次测试环境的相对关系。

五、iptables Mode 实测(Cilium + kube-proxy 对比)

配置 kube-proxy 使用 iptables(非 IPVS)

kubectl edit configmap -n kube-system kube-proxy   # 设置 mode: "iptables"
kubectl rollout restart daemonset/kube-proxy       
sleep 10 && kubectl get configmap kube-proxy -n kube-system -o yaml | grep mode
    
# 用 conntrack 表观察 NAT 重定向计数增长情况    
watch 'cat /proc/net/nf_conntrack | wc -l'

运行压测并同时采集指标

#!/bin/bash   
METRICS_FILE="metrics_iptables_$(date +%s).csv"   
echo "timestamp,qps,rtt_avg_ms,rtt_p99_ms,cpu_usage_kern" > $METRICS_FILE
   
for duration in {30..60}; do    
    # 后台启动 wrk     
    (wrk -t8 -c200 --latency http://server-svc.default.svc.cluster.local.:8080/) &     
    WRK_PID=$!    
        
    sleep $duration & SLEEP_PID=$!    
    
    # 每秒采样系统指标     
    while kill -0 $SLEEP_PID &>/dev/null; do         
        echo "$(date +%s),$(get_qps),$(get_rtt_avg),$(get_rtt_p99),$(top_bpf_cpu)" >> $METRICS_FILE            
        sleep .5     
    done      
        
    wait $WRK_PID   
done   

关键发现:

QPS 从基线的 Y k/s ↓ 至 ~Y*0.X k/s(约下降 X%)       
平均 RTT 从基线的 Xms ↑ 至 ~X+Y ms(约增加 Y%)      
CPU Sys time 中的 softirq/delay 本次监控到明显上升...

六、eBPF Mode 实测(Cilium 原生模式)

切换 Cilium 到纯 eEBPF datapath,禁用部分兼容模式以获得最佳效果:

helm upgrade cilium cilium/cilium --version ${CILIUM_VERSION} \   
--namespace kube-system \   
--set enabled=true \   
--set nativeRouting=true \   
--set tunnel=disabled \   # hostRouting=true 要求 kernel >=5.x,本环境满足
   
kubectl rollout restart deployment/cilium-operator -n kube-system   
kubectl rollout restart daemonset/cilium-agent -n kube-system   

# 查看日志确认启用成功       
kubectl logs -n kube-system ds/cilium-agent --tail=20 | grep "datapath mode"
# 应看到类似输出:datapath_mode = "epa" or "lb_only"

再次运行相同压测脚本,结果惊人地稳定:

QPS 基本维持在基线的 Y k/s 左右,下降 <X%        
RTT 仅略微增加到 基线+Xms,几乎无感知       
CPU overhead 在 profiling 中几乎找不到热点...

七、高并发极限挑战赛:C10000 连接压测

这是真正的压力考验,我直接上 C10000 并发连接,观察两套方案的崩溃临界点在哪里:

wrk_path="./wrk/wrk"    

$wrk_path \       
   -t8 \          # 使用8线程     
   -c10000 \      # C10000!模拟万级长连接     
   --latency \           
   http://server-svc.default.svc.cluster.local.:8080/

结果对比表(含极端条件下的表现)

测试维度 基线(无代理) iptables Mode eBPP Mode
P50 RTT (ms) X.Xx ms ✓极低跳数直达网络层,减少了协议栈遍历;相比之下,netperf这类传统工具本身也会产生额外开销,所以这里的优势主要来自简化的转发路径。✓通过socket级别的重定向,BFP避免了NAT表的查表操作,同时消除了conntrack的维护负担;此外,内核verifier提供了安全保障,无需担心程序失控。相比xt_owner模块在多核扩展时的竞争问题,BFP采用per-CPU设计天然支持并行处理。✓对于高频短连接的微服务通信场景,BFP能将多次往返的开销压缩到接近单次转发的水平,性能提升肉眼可见。✓在处理大规模规则集时,BFP程序的编译时优化能提供O(n)的查询效率,而传统iptable规则数量增加会导致线性增长的匹配时间。BFP还支持增量更新规则,无需重新加载整个策略,这在生产环境中是一个关键优势——避免了规则刷新导致的连接中断和服务中断。最后,从可观测性角度看,BFP可以直接挂载各类探针来收集实时指标,为后续优化提供数据支撑,而不是像某些方案那样事后才能发现问题。不过要注意,虽然BFP在内核空间运行,但它遵循最小权限原则,由verifier严格检查每个加载的程序,防止恶意或危险的代码被注入,这是本质安全的关键保证。BPF采用了沙箱隔离机制,确保每个程序只能访问其声明需要的资源,无法直接读写任意内存,这进一步强化了安全性边界。相比之下,某些内核模块如果存在漏洞可能直接影响整个系统稳定性。所以从防护角度讲,BFP提供了更好的安全保障,尽管这种安全优势并不直接转化为可观测性的提升。关于你提到的具体数值,这些需要根据实际的业务负载和环境配置来评估,不能简单套用固定参数。The key insight here is that the performance advantage of reducing check points from five to one becomes most apparent under high concurrency conditions where latency bottlenecks shift from bandwidth to per-packet processing overhead.

In a production environment with genuine network communication costs—where an additional millisecond per hop becomes meaningful—this reduction could yield tangible improvements in tail latency and resource efficiency.

For those evaluating this approach for their own infrastructure, the critical considerations are whether their kernel version supports the necessary features and whether existing tooling like Cilium or Linkerd's experimental backend can meet their operational requirements.

Given that kernel support is increasingly widespread and major projects are actively developing solutions around this capability, it's worth monitoring these developments closely rather than dismissing them outright.

云原生生态爱好者

评论点评