深入探讨环境模式和Sidecar模式共存下的网络流量路径

深入探讨环境模式和Sidecar模式共存下的流量路径。

2023年9月18日 | 作者:Steve Zhang - 英特尔,John Howard - 谷歌,Yuxing Zeng - 阿里巴巴,Peter Jausovec - Solo.io

Istio 有两种部署模式:环境模式和 Sidecar 模式。前者仍在开发中,后者是经典模式。因此,环境模式和 Sidecar 模式共存应该是正常的部署形式,这也是本文可能对 Istio 用户有所帮助的原因。

背景

在现代微服务架构中,服务之间的通信和管理至关重要。为了应对这一挑战,Istio 作为一种服务网格技术应运而生。它通过利用 Sidecar 提供流量控制、安全性和卓越的观察能力。为了进一步提高 Istio 的适应性和灵活性,Istio 社区开始探索一种新的模式——环境模式。在这种模式下,Istio 不再依赖于显式的 Sidecar 注射,而是通过 ztunnel 和 Waypoint 代理实现服务之间的通信和网格管理。环境模式也带来了一系列改进,例如更低的资源消耗、更简单的部署和更灵活的配置选项。启用环境模式时,我们无需重新启动 Pod,这使得 Istio 能够在各种场景中发挥更好的作用。

有很多博客介绍和分析了环境模式,您可以在本文的参考资源部分找到这些博客,本文将分析 Istio 环境模式和 Sidecar 模式下的网络流量路径。

为了阐明网络流量路径并使其更容易理解,本文探讨了以下两种场景并配有相应的图表

关于分析的信息

分析基于 Istio 1.18.2,其中环境模式使用 iptables 进行重定向。

环境模式 sleep 到 Sidecar 模式 httpbin

第一个场景的部署和配置

根据以上描述,部署和网络流量路径如下所示

Ambient mode sleep to Sidecar mode httpbin
环境模式 sleep 到 Sidecar 模式 httpbin

如果启用了环境模式,ztunnel 将作为 DaemonSet 部署在 istio-system 命名空间中,而 istio-cni 和 ztunnel 将为 ztunnel Pod 和每个节点上的 Pod 生成 iptables 规则和路由。

所有进出启用环境模式的 Pod 的网络流量都将根据网络重定向逻辑通过 ztunnel。然后,ztunnel 将流量转发到正确的端点。

环境模式 sleep 到 Sidecar 模式 httpbin 的网络流量路径分析

根据上图,网络流量路径的详细信息如下所示

(1) (2) (3) sleep 服务的请求流量从 sleep Pod 的 veth 发送出去,它将被标记并通过遵循 iptables 规则和路由规则转发到节点上的 istioout 设备。节点 A 上的 istioout 设备是一个Geneve隧道,隧道的另一端是 pistioout,位于同一节点上的 ztunnel Pod 内部。

(4) (5) 当流量通过 pistioout 设备到达时,Pod 内部的 iptables 规则会拦截并将其通过 Pod 中的 eth0 接口重定向到端口 15001

(6) 根据原始请求信息,ztunnel 可以获取目标服务的端点列表。然后,它将处理将请求发送到端点,例如其中一个 httpbin Pod。最后,请求流量将通过容器网络进入 httpbin Pod。

(7) 到达 httpbin Pod 的请求流量将被其 iptables 规则拦截并重定向到 Sidecar 的端口 15006

(8) Sidecar 处理通过端口 15006 传入的入站请求流量,并将流量转发到同一 Pod 中的 httpbin 容器。

Sidecar 模式 sleep 到环境模式 httpbinhelloworld

第二个场景的部署和配置

根据以上描述,部署和网络流量路径如下所示

sleep to httpbin and helloworld
sleep 到 httpbin 和 helloworld

Sidecar 模式 sleep 到环境模式 httpbin 的网络流量路径分析

上图上半部分描述了从 sleep Pod(Sidecar 模式)到 httpbin Pod(环境模式)的请求的网络流量路径。

(1) (2) (3) (4) sleep 容器向 httpbin 发送请求。请求被 iptables 规则拦截并定向到 sleep Pod 中 Sidecar 上的端口 15001。然后,Sidecar 处理请求并根据从 Istiod(控制平面)接收到的配置路由流量,将流量转发到节点 B 上与 httpbin Pod 对应的 IP 地址。

(5) (6) 请求发送到设备对(veth httpbin <-> httpbin Pod 内部的 eth0)后,请求会被拦截并使用 iptables 和路由规则转发到节点 B 上的 istioin 设备(httpbin Pod 正在运行的节点),遵循其 iptables 和路由规则。节点 B 上的 istioin 设备和同一节点上 ztunnel Pod 内部的 pistion 设备通过Geneve隧道连接。

(7) (8) 请求进入 ztunnel Pod 的 pistioin 设备后,ztunnel Pod 中的 iptables 规则会拦截并重定向流量,通过 Pod 内运行的 ztunnel 代理上的端口 15008 进行重定向。

(9) 进入端口 15008 的流量将被视为入站请求,然后 ztunnel 会将请求转发到同一节点 B 上的 httpbin Pod。

通过 Waypoint 代理,Sidecar 模式 sleep 到环境模式 httpbin 的网络流量路径分析

与图的上半部分相比,下半部分在 sleep、ztunnel 和 httpbin Pod 之间的路径中插入了一个 Waypoint 代理。Istio 控制平面拥有服务网格的所有服务信息和配置。当 helloworld Pod 与 Waypoint 代理一起部署时,sleep Pod Sidecar 收到的 helloworld 服务的 EDS 配置将更改为 envoy_internal_address 类型。这会导致通过 Sidecar 的请求流量通过基于 HTTP 的覆盖网络 (HBONE)协议转发到节点 C 上 Waypoint 代理的端口 15008。

Waypoint 代理是 Envoy 代理的一个实例,它根据从控制平面接收到的路由配置将请求转发到 helloworld Pod。一旦流量到达节点 D 上的 veth,它将遵循与上一个场景相同的路径。

总结

Sidecar 模式是使 Istio 成为优秀服务网格的原因。但是,Sidecar 模式也可能导致问题,因为它要求应用程序和 Sidecar 容器在同一 Pod 中运行。Istio 环境模式通过集中式代理(ztunnel 和 Waypoint)实现服务之间的通信。环境模式提供了更大的灵活性和可扩展性,减少了资源消耗(因为它不需要为网格中的每个 Pod 都配备一个 Sidecar),并允许更精确的配置。因此,毫无疑问,环境模式是 Istio 的下一个发展方向。很明显,虽然环境模式仍处于 Alpha 阶段,Sidecar 模式仍然是 Istio 的推荐模式,但 Sidecar 和环境模式的共存可能会持续很长时间,随着环境模式走向 Beta 阶段和未来的版本,它将为用户提供一种更轻量级的运行和采用 Istio 服务网格的选项。

参考资源

分享此文章