知识卡片
iptables流量劫持的性能代价及eBPF与CNI两种优化方向
内容
边车代理注入后要真正”强制”接管流量,最经典通用的手段是[[Netfilter五个
钩子与iptables如何把底层回调抽象成高层规则]]描述的iptables转发。Istio
注入边车时会额外生成一个initContainer(istio-init),执行istio-iptables
脚本改写容器的iptables规则,让PREROUTING和OUTPUT链把进出Pod的流量
(除个别管理端口外)全部重定向到Envoy的入站/出站端口——这样应用程序
完全感知不到自己的流量被绕了一圈。但这个方案有明确的性能代价:iptables
重定向流量必须经过回环设备交换数据,意味着数据要多穿越一次网络协议栈,
在网络I/O不是瓶颈的系统里无伤大雅,但在网络敏感的高并发场景下会有明显
性能损失。业界目前探索两个优化方向:一是eBPF(Extended Berkeley Packet
Filter)技术,直接在Socket层面完成数据转发,不需要再往下穿过更底层的
TCP/IP协议栈处理,缩短数据在通信链路上的路径长度;二是让服务网格与
CNI插件配合接管流量(如Istio自研的CNI插件),装了这个插件后整个虚拟化
网络都由服务网格自己控制,不再依赖iptables,也就不需要istio-init容器
了——但这条路线要求实现一个功能全面、管理灵活、性能优秀的CNI插件,
连Kubernetes自己都想从网络插件的复杂度里脱身,可见门槛之高,目前使用
并不广泛。这提示一个规律:一项”透明”能力(对应用无感知)的实现代价,
往往要么摊在运行时性能上(iptables方案),要么摊在基础设施的实现复杂度
上(自研CNI方案),很难两头都占便宜。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第15章"服务网格"15.1.2节
"数据平面"(源文件:_epub-src对应OEBPS/Text/chapter171.xhtml)
- 结论依据:原文详述Istio用istio-iptables脚本改写PREROUTING/OUTPUT链
实现流量重定向、iptables方案需多穿越一次协议栈的性能代价,以及eBPF
在Socket层直接转发、Istio自研CNI插件绕开iptables两种优化方向及其
实现门槛,直接支撑本卡片结论。
- 原始内容:iptables重定向流量必须通过回环设备交换数据,即流量不得不
多穿越一次协议栈……使用eBPF技术,在Socket层面直接完成数据转发……让
服务网格与CNI插件配合来实现流量劫持……连Kubernetes自己都迫不及待想
从网络插件中脱坑,其麻烦程度可见一斑。