如何在 Istio 中支持 Dubbo、Thrift、Redis 以及任何七层协议? (3)

如何在 Istio 中支持 Dubbo、Thrift、Redis 以及任何七层协议?

首先,我们需要创建一个图中左边所示的 EnvoyFilter 来处理客户端的出向流量,该 EnvoyFilter 的 Match 条件选中了 $(thrift-sample-server-vip)_9090 这个 Outbound Listener 中 的 tcp_proxy,在 Patch 部分将其替换为一个 thrift_proxy。在该 thrift_proxy 中,我们按照 Traffic Splitting 的要求为其配置了相应的路由:将 30% 的流量路由到 Server v1版本,70% 的流量路由到 Server v2 版本。我们也需要为 Thrift Server 端创建一个如图右上所示的 EnvoyFilter 来处理服务器端的入向流量。相比客户端的 EnvoyFilter 而言,服务器端的 EnvoyFilter 配置要简单一些,因此我们不需要在服务器端配置任何路由规则,只需要将 tcp_proxy 替换为 thrift_proxy 即可。这个 thrift_proxy 虽然没有路由规则,但提供了大量七层的服务通信和治理能力,包括请求层面的负载均衡、产生请求层面的 Metrics 数据等。

从上面的介绍和示例可以看到, EnvoyFilter CRD 好比是 Istio 中的一把瑞士军刀,可以对 Pilot 生成的 Envoy 配置进行非常灵活的定制,以达到对七层协议进行管理的目的。但是 EnvoyFilter 也带来了一些难以处理的问题:

EnvoyFilter 将 Envoy 的底层实现细节直接暴露给了运维人员:运维人员必须非常了解 Envoy 的配置细节,而这些配置细节往往和 Envoy Filter 内部的实现机制紧密相关,例如 Filter 的名称和 Filter 内部的配置格式等。这导致创建 EnvoyFilter 成为了一种和代码细节高度耦合的工作,难以直接交付给运维人员。更为合理的方式则应该是采用一种面向用户的高级配置语言来屏蔽这些实现细节,例如 Istio 中的 VirtualService 和 DestinationRule。

EnvoyFilter 中的匹配条件依赖于 Pilot 生成的 Envoy 配置中的结构组成和元素命名,例如 Listener 的名称,FilterChain 的构成等。而这些结构和命名在不同的 Istio 版本之间可能发生变化,导致原本能够正常工作的 EnvoyFilter 在新版本中出现问题。

EnvoyFilter 中的匹配条件还依赖于一些和特定 K8s 集群相关的内容,例如 Service Cluster IP,这意味着一个 EnvoyFilter 不能用于多个不同集群中的相同服务。当 Service 被重建时,由于 Cluster IP 会发生变化,相应的 EnvoyFilter 也必须进行改动,修改 Match 条件中的 Cluster IP。

我们需要为每个 Service 创建相应的 EnvoyFilter,当 Mesh 中管理的服务较多时,手动创建成百上千的 EnvoyFilter 的工作是非常繁琐而且及易出错的。

对 Istio 而言,EnvoyFilter 中的 Patch 部分基本上是一个黑盒,因此 Istio 只能对 EnvoyFilter 的正确性进行非常有限的验证。这导致 EnvoyFilter 的调试非常困难,当 Envoy 未能按照你的设想工作时,你很难知道到底是 EnvoyFilter 的什么地方出现了问题。

由于上述的种种问题,我们可以看到,虽然可以使用 EnvoyFilter 来在 Istio 中实现七层协议的管理,但是在一个生产系统,特别是一个中大型的 Service Mesh 中管理和维护这些 EnvoyFilter 是非常困难的。

Aeraki:在 Istio 中管理任何七层协议

由于难以手动对 EnvoyFilter 进行管理和维护 ,我们创建了Aeraki (发音:[Air-rah-ki])项目来自动化这个流程。Aeraki 是希腊语中“微风”的意思,我们希望 Aeraki 这股微风能帮助 Istio 在云原生的旅程中航行得更远。

Aeraki 的基本工作原理如下图所示:Aeraki 从 Istio 中拉取服务数据,根据 ServiceEntry 和 Aeraki 流量规则生成 Envoy 配置,并采用 EnvoyFilter 将生成的配置推送到 Istio 中。简而言之,你可以把 Aeraki 看做 Istio 中管理的七层协议的 Operator 。

如何在 Istio 中支持 Dubbo、Thrift、Redis 以及任何七层协议?

相比于直接修改 Istio 代码和采用 EnvoyFilter 这两种扩展 Istio 流量管理能力的方式,采用 Aeraki 为我们带来了以下的好处:

不需要修改 Istio 代码,因此节省了单独维护一个 Istio 的私有代码分支的额外工作量,可以快速跟随 Istio 的版本迭代进行升级。

Aeraki 作为一个独立组件部署在 Mesh 的控制面,可以很方便地作为一个插件和 Istio 进行集成,对 Istio 的流量管理能力进行扩展。

协议相关的缺省配置由 Aeraki 自动生成,并且这些配置可以根据 Istio 版本和 K8s 集群相关信息自动进行调整。节约了大量 EnvoyFilter 的手动创建和维护工作。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzgwd.html