知识卡片

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自己都迫不及待想 从网络插件中脱坑,其麻烦程度可见一斑。