云原生时代的流量入口:Envoy Gateway( 二 )


  • Envoy 的 TPS 可以达到 12W 左右;
  • 基于 Java 的异步化 API 网关最高可到 2.8W 左右;
  • 基于 Nginx 的 Kong,TPS 可以到 5W 左右;
  • 基于 Nginx 并相较 Kong 有一定优化的 APISIX 可以到 9W 左右 。
可以看出:
  • 简单路由代理场景下,Envoy 性能优势已经比较明显;
  • 复杂路由与治理功能场景下,Envoy 原生 C++ 实现功能的性能较通过 Java Filter、OpenResty 等扩展相比,优势会更加明显 。
3. 动态管控能力强,具备数据面标准 xDS 协议Envoy 具备静态配置与动态 API 两种配置模式 。动态 API 方式灵活性更强,作为 Envoy 推荐的配置方式 。Envoy 以 xDS(x Discovery Service)作为动态 API 的标准协议,其中包括了多种维度资源的发现协议:
  • LDS(Listener Discovery Service)
  • RDS(Route Discovery Service)
  • CDS(Cluster Discovery Service)
  • EDS(Endpoint Discovery Service)
  • ADS(Aggregated Discovery Service)
xDS 的多种协议覆盖了包括监听器(Listener)、路由(Route)、后端集群(Cluster)、后端实例(Endpoint),可以通过协议对代理所需所有配置进行动态管控 。其中 ADS 不是一个实际意义上的 xDS,它提供了一个汇聚的功能,以实现需要多个同步 xDS 访问的时候可以在一个 stream 中完成的作用 。
由于 Envoy 已经以 CNCF 毕业项目的姿态成为了云原生数据面的事实标准组件,xDS 也相应成为云原生数据面事实动态 API 标准 。这里不对 xDS 协议进行深入的介绍,感兴趣的同学可以通过社区与博客深入了解 。
4. 天然亲和容器环境Envoy 作为云原生社区的数据面标准组件,其本身并没有直接与 Kubernetes 或容器耦合 。通过 xDS 协议的对接,Istio Pilot 等容器亲和的控制面组件可以将服务、实例、路由等配置信息推送至 Envoy 。即使是在容器环境,Envoy 也很快能实现服务发现,即实现容器环境服务的代理和治理 。所以,Envoy 天然亲和容器环境,可以作为容器环境 API 网关和 Ingress 的数据面选型 。
5. 多语言扩展沙箱——WASMWASM,即 WebAssembly,是由主流浏览器厂商组成的 W3C 社区团体制定的一个新的规范,首先看下来自 Mozilla 的官方定义:WebAssembly 是一种新的编码方式,可以在现代的网络浏览器中运行
它是一种低级的类汇编语言,具有紧凑的二进制格式,可以接近原生的性能运行,并为诸如 C/C ++ 等语言提供一个编译目标,以便它们可以在 Web 上运行 。它也被设计为可以与 JavaScript 共存,允许两者一起工作 。
使用 WebAssembly 扩展 Envoy 的好处是:
  • 避免修改 Envoy;
  • 避免网络远程调用(check & report);
  • 通过动态装载(重载)来避免重启 Envoy;
  • 隔离性;
  • 实时 A/B 测试;
WASM 为 Envoy 带来了使用多语言扩展数据面的能力,即可以不局限地通过 C++、Java、Lua、JS 等语言进行数据面扩展,这对于流量代理数据面将是一个巨大的彩蛋 。该特性已在 2020 年正式发布落地 。相信在不远的未来,开发者使用自己最为擅长的语言进行流量入口能力扩展不再是梦想!
Envoy Gateway 设计解析基于云原生时代的技术趋势以及 Envoy 的功能、性能的“双优”特性,网易轻舟云原生团队提出基于 Envoy 实现标准的流量入口设计,并基于此进行了大规模业务生产落地 。
逻辑架构逻辑架构设计如下图所示:
云原生时代的流量入口:Envoy Gateway

文章插图
 
整体架构主要包括数据面、控制面两部分,实现方面则是扩展了 Istio ingressgateway:
  • 数据面
以 Envoy 作为数据面组件,负责南北向数据流量的代理、路由、治理、遥测等;通过 filterchain 进行扩展,目前支持基于 Lua、C++ 语言编写插件,WASM 落地后支持多语言方式扩展;通过 xDS 与控制面组件进行配置下发等动态控制 。
  • 控制面
以 Istio Pilot 作为基本控制面组件,同时提供 API 层、控制台供用户或第三方平台接入 。
Istio Pilot 在这里主要包括如下作用:
1、作为 xDS Server 。与 Envoy 的 xDS Client 建立 GRPC 通信连接,是与 Envoy 交互的基础控制面 。可支持控制不同场景下 Envoy(ServiceMesh Sidecar & API 网关 Gateway & Ingress & 入口七层代理) 。2、对接注册中心(Discovery) 。支持对接 Kubernetes API Server(K8S 注册中心能力),具备扩展 Consul、Eureka 等其他注册中心能力 。支持同时对接多种注册中心,并将注册信息经过配置转换,下发至 Envoy 。3、配置处理(Config) 。对于要下发至 Envoy 的所有配置,均通过 Pilot 进行配置处理,再下发至 Envoy 。4、模型抽象与接口封装 (Mesh Configuration Protocol & Service Mesh Interface,简称 MCP & SMI) 。Pilot 对 Envoy 的基础模型进行了抽象,并进行基础接口的封装,使得其他平台对 Envoy 的控制可以更加清晰与优雅 。对外暴露的接口包括 GRPC 与 Kubernetes CRD 两种形式 。


推荐阅读