基于 APISIX 的服务网格方案 Amesh 积极开发中!

时间:2023-01-11 16:16:27

作者@lingsamuel,API7.ai 云原生技术专家,Apache APISIX Committer。

在云原生快速发展的前提下,服务网格领域也开始逐渐火热。目前阶段,大家所熟知的服务网格解决方案很多,每种产品又各有其优势。因此在面对不同的行业或者业务背景时,每个人的选型想法都各不相同。

Apache APISIX 是一个动态、实时、高性能的云原生 API 网关,提供负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。基于 APISIX 的扩展道路上,除了 APISIX Ingress 在云原生领域被各大厂商开始关注外,基于 APISIX 的服务网格方案也在积极迭代中。

基于 APISIX 的服务网格方案

AmeshApache APISIX 的服务网格库。它适配了 xDS 协议,可以从诸如 Istio 的控制平面中接收数据,并生成 APISIX 所需的数据结构,使得 APISIX 能够在服务网格领域作为数据面发挥作用。

依靠 Amesh,APISIX 可以工作在服务网格模式下,不使用传统的 etcd 作为数据中心,而是使用 shdict 与 Amesh 库直接进行数据交换,避免了额外的性能损耗,使得大规模部署成为可能。

通过使用 Amesh,可以在服务网格领域获得 APISIX 具备的高性能、丰富的流量管理功能、易扩展性等多种优势。

Amesh 的架构

Amesh 通过适配 xDS 协议,可以让 APISIX 替代 Istio 所使用的 envoy 组件来接管集群流量。在实际使用中,APISIX 将作为 Pod 的 Sidecar 接管网格内的所有流量。目前 Amesh 的架构如下图所示:

基于 APISIX 的服务网格方案 Amesh 积极开发中!

通过架构图可以看到,通过 xDS 协议,Amesh 可以将 Istio 作为控制面,从 Istio 侧获取配置信息,并将其转义为 APISIX 所需的配置。

而网格内部的所有流量都将由 APISIX 接管。其中,APISIX 的配置中心被设置为 Amesh,这使得 APISIX 脱离 etcd 的依赖。Amesh 为 APISIX 提供了一种从 xDS 协议中获取配置信息的方式。

此外,Amesh 在 v0.2 中提供了额外的可选控制面组件:amesh-controller。Amesh controller 增加了 Amesh 专用的 CRD,可以为 APISIX 配置一些 Istio 所不支持的额外功能。额外带有 amesh-controller 的架构如下图所示:

基于 APISIX 的服务网格方案 Amesh 积极开发中!

正如前文所提到的,Amesh controller 是可选组件。在未安装时,Amesh 也能正常使用 Istio 的原生能力提供服务。在安装了 amesh-controller 后,Amesh 能自动检测到控制面的加入,并动态地从中获取配置,而无需重启。

Amesh controller 为 Amesh 提供了 Istio 无法提供的 APISIX 特有功能。例如在安装 amesh-controller 后,用户能为服务配置 APISIX 原生具备的海量插件。

Amesh 发展状态

目前 Amesh 项目正在积极开发中。在最近发布的的 v0.2 版本中,Amesh 新增了可选的控制面 amesh-controller 组件,为 Amesh 提供了 APISIX 所支持的强大的插件系统,大大增强了 Amesh 的可扩展性。

扩展能力

在使用 Amesh 时,如果是常规的 Istio 部署,用户则可以通过 Lua 或 Wasm 来对 envoy 进行功能扩展。

与 Envoy 原生能力相比,APISIX 官方即支持插件扩展能力,维护了 80+ 的插件可供用户使用,许多功能已经原生集成。但由于在 Istio 中,不能对这些插件进行配置,无法直接使用这些插件所提供的能力。

为此,Amesh v2.0 版本新增了一个控制面组件,即前文提到的 amesh-controller。它为用户提供了配置 APISIX 插件的能力,使 APISIX 众多的插件在服务网格场景下也能开箱即用,而无需用户进行自定义的开发。

应用示例

在 Amesh v0.2 版本中,可以通过安装 amesh-controller 并使用提供的 AmeshPluginConfig CRD 来进行 APISIX 的插件配置。

例如,我们可以为请求的响应添加特定的 header,这里可以通过配置 APISIX 的 response-rewrite 插件实现。

假设我们需要添加的 header 为 X-Header,其值为 AddedHeader,我们可以配置如下的 AmeshPluginConfig,此时请求的响应中就会带上我们所需的 header。

apiVersion: apisix.apache.org/v1alpha1
kind: AmeshPluginConfig
metadata:
  name: ampc-sample
spec:
  plugins:
    - name: response-rewrite
      config: '{"headers": {"X-Header":"AddedHeader"}}'

总结

在本文中,我们简单介绍了 Amesh 的架构,以及在 v0.2 版本中提供的 amesh-controller 所带来的架构变更,可以更好地帮助用户理解 Amesh 的工作原理。

在当下技术发展趋势中,服务网格势必是未来的流行趋势。虽然现在各种方案都还不太完善,但整体都属于螺旋上升的状态。当然,基于 APISIX 的服务网格也正朝着大家心目中的理想型服务网格解决方案奋进,也欢迎各位对 APISIX 服务网格方案感兴趣的朋友们进行尝鲜。