IstioCon 2022: Istio 数据平面使用 eBPF 而不是 iptables 加速
IstioCon 2022 简介
IstioCon 2022 是业内最受欢迎的服务网格的首届社区大会,由社区主导,展示了在生产环境中运行 Istio 的经验教训和实战体验,并邀请了 Istio 生态系统中的维护者参与。大会内容包括主题演讲、技术讲座、闪电演讲、工作坊和路线图会议,以及社交时段。
议程与动机
大会探讨了使用 eBPF 而不是 iptables 加速 Istio 数据平面的可能性。社区中存在一些关于使用 eBPF 的声音,目标是通过快速简便的方法使用 eBPF 代替 iptables,实现零 Istio 修饰。
方法与路线图
如何使用 eBPF 进行流量拦截
- 从应用程序容器发送流量(由 UID 识别)。
- 通过“连接”程序将原始目标地址更改为 127.0.0.1:15001。
- 使用
get_sockopt 函数返回原始目的地址。
如何缩短数据路径
- 在 eBPF 中两个地址相同的情况下,使用
bpf_msg_redirect_hash 函数处理套接字级别的策略。
- 分组将被重定向到从 sock 映射引用的目的地套接字。
如何解决四元组冲突
- 解决方案1:将
dip 从 127.0.0.1 修改为 127.128.x.y,在建立新连接时增加 x、y 以避免冲突。
- 解决方案2:将
sip 从 127.0.0.1 修改为 Pod IP。
- 解决方案3:引入 socket cookie 以识别每个连接。
如何在 eBPF 中获取当前的 Pod IP
- Merbridge 利用 CNI 插件的能力,在 Pod 创建时将 Pod 的 IP 写入一个 Map 中。
- 监控 Pod 的 Netns 中的一个特定端口,并将套接字的标记设置为 Pod IP 在 Map 中的键。
- 在
mb_connect 程序处理请求时,通过识别套件的标记获取当前 IP 地址,然后根据标记从映射中读取 IP 地址。
现场演示与路线图
- 现场演示如何使用 eBPF 进行流量拦截、缩短数据路径和解决四元组冲突。
- 下一步路线图包括使用 XDP 捕获入口流量和 IPv6 支持。
- Merbridge CNI 支持 Istio sidecar 注释,实现跨节点加速。
更多细节与加入方式
- 更多细节请参考相关链接。
- 加入 Istio 社区:
- Slack:https://merbridge.slack.com
- GitHub:https://github.com/merbridge
- Istio 官方博客:https://istio.io/latest/blog/2022/merbridge/
- Merbridge 官网:https://merbridge.io/