Aeraki 在 Envoy 配置之上进行了抽象,提供了一层面向用户的配置 CRD 来对这些七层协议进行管理。这些高级 CRD 隐藏了 Envoy 的配置细节,屏蔽了不同 Istio 版本生成的缺省 Envoy 配置的差异,对于运维非常友好。对于 Thrift 和 Dubbo 这样的 RPC 协议,由于其语义和 HTTP 类似,Aeraki 直接采用了 Istio VirtualService 和 DestinationRule;对于非 RPC 协议,Aeraki 则定义了一些新的 CRD 来进行管理,例如 RedisService 和 RedisDestination。我们后面将进一步介绍如何使用这些配置 CRD 来定制规则,例如实现 Traffic Splitting。
和 Istio 类似,Aeraki 也采用了端口名称来识别协议类型。端口取名需要遵循 “tcp-七层协议名-xxx” 的命名规则。例如,一个 Thrift 服务应取名为 “tcp-thrift-service”。需要注意的是,我们必须保留端口名中的“tcp-”前缀,因为对于 Istio 而言,这是一个 TCP 协议的服务。Aeraki 则会根据端口名中的七层协议来生成相应的 Envoy 配置,并替换 Istio 缺省生成的 tcp_proxy。
我们来看看如何采用 Aeraki 来实现上面 Thrift 服务的 Traffic Splitting 用例。首先我们需要在 Thrift Service 定义的 Port 命名中声明该 Service 的七层协议类型:“tcp-thrift-hello-server”,然后创建一个 VirtualService 将 Thrift 请求按照指定比例路由到不同的服务版本中。Aeraki 将根据服务定义和 VirtualService 生成所需的 Envoy 配置,并通过 EnvoyFilter 发送给 Istio。
可以看到,相对于手动创建 EnvoyFilter,采用 Aeraki 来管理 Thrift 要简单得多。如果不需要特殊的流量规则,则会更简单,只需要按照命名规范在 Port 名称中声明 Thrift 协议即可,Aeraki 会生成所需的 Envoy 配置,无需任何额外的工作。
想自己试试 Aeraki 的 Thrift、Dubbo、Redis 服务管理能力?非常简单,只需在一个连接到 K8s 集群的命令行终端上运行下面两行代码,就可以安装一个带有 Aeraki 插件的 Istio 集群以及相应的 Demo 程序,欢迎大家尝试!
`git clone https:``//github``.com``/aeraki-framework/aeraki``.git``aeraki``/demo/install-demo``.sh`也可以访问 Aeraki 的在线 Demo,查看从 Thrift、Dubbo、Redis 等服务收集到的监控指标面板::3000/d/pgz7wp-Gz/aeraki-demo?orgId=1&refresh=10s&kiosk
使用 Aeraki 增强 Service Mesh下面我们来看一下使用 Aeraki 的七层协议管理能力来增强 Service Mesh 的一些案例。
屏蔽开发/生产环境的差异我们在开发、测试和生产环境中通常需要访问不同的后端资源,例如需要连接到不同的 Redis 缓存或者不同的 mySQL 数据库。一般来说,我们需要修改随应用程序发布的配置文件中的后端资源地址,以达到在不同环境中切换后端资源的目的。通过 Aeraki 的帮助,我们可以用 Service Mesh 来屏蔽不同后端资源的配置差异,使得应用程序可以用相同的方式访问不同环境中的后端资源。
如下图所示,我们在 Dev、Staging 和 Prod 三个环境中都需要访问 Redis 服务,这三个 Redis 服务有不同的 IP 地址和访问密码,部署方式也可能不同:在开发环境中,为了节约资源和简化部署,我们可能使用单个 Redis 实例;在测试和生产环境中,我们会使用 Redis 集群来保证 Redis 服务的高可用和扩展性,我们也可能直接使用云服务商提供的 Redis 托管服务。当在这三个环境中进行切换时,我们需要配置不同的 IP 地址和访问密码,如果 Redis 部署的方式不同,我们甚至可能需要修改客户端代码来切换 Redis 单实例模式和集群模式,这极大影响了我们开发、测试和上线的效率。
通过 Aeraki 提供的 RedisService 和 RedisDestination CRD,我们可以屏蔽这些不同 Redis 服务提供者之间的差异,允许客户端以统一的方式访问后端的 Redis 服务。
在采用 Aeraki 之前,我们在不同的环境中需要配置不同的 IP 地址和 Redis 访问密码。采用 Aeraki 之后,在客户端可以采用相同的代码和配置,通过修改 Aeraki CRD 来切换不同环境中的 Redis 配置,大大减少在不同环境之间进行切换的成本。即使 Redis 从单实例改为了 Redis 集群,客户端也可以采用相同的方式进行访问。