Merbridge使用 eBPF 加速服务网格

联合创作 · 2023-09-26 21:14

Merbridge 旨在让 Service Mesh 的流量拦截和转发更加高效。借助 Merbridge,开发人员可以使用 eBPF 而不是 iptables 来加速他们的服务网格,而无需任何额外的操作或代码更改。目前,Merbridge 已经支持 Istio、Linkerd 和 Kuma。

功能:

  • 处理outbound流量
    • Merbridge使用eBPF的connect程序来修改user_ip和user_port,从而改变连接的目的地址,确保流量可以发送到新的接口。为了帮助Envoy识别原始目的地,应用程序(包括Envoy)在接收连接时将调用get_sockopt函数来获取ORIGINAL_DST。
  • 处理inbound 流量
    • Inbound流量的处理方式与 outbound流量的处理方式类似。eBPF 无法像 iptables 那样在指定的命名空间中生效,因此更改将是全局的。这意味着如果将 eBPF 应用于原本不是由 Istio 管理的 Pod,或者外部 IP,将会出现严重的问题,例如无法建立连接。为了解决这个问题,开发团队设计了一个小小的控制平面,作为DaemonSet部署。它可以帮助观察并获得节点上所有的Pod列表,类似于kubelet。然后,注入sidecar的Pod IP将被写入local_pod_ips地图中。对于目的地地址不在地图中的流量,Merbridge将不会拦截它。
  • 加速联网

    • 在Istio中,Envoy通过当前的podIP和端口号访问应用程序。因为podIP存在于local_pod_ips地图中,流量将被重定向到15006端口的podIP,产生一个无限循环。eBPF有什么方法可以获得当前命名空间的IP地址吗?开发团队已经设计了一个反馈机制。当Envoy试图建立一个连接时,会将其重定向到15006端口。当它转移到sockops时,将检查源IP和目标IP是否相同。如果是,这意味着发送了错误的请求,则将在sockops进程中丢弃它。同时,当前的ProcessID和IP将被写入process_ip map中,使eBPF支持进程和IP之间的对应关系。当下一个请求被发送时,将直接从process_ip map中检查目的地是否与当前IP相同。当请求失败时,Envoy将重试。这个重试过程只会发生一次,后续的连接会非常快。

浏览 21
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

编辑 分享
举报