数据平面Envoy部分一:Envoy基础
一、Envoy是什么
Envoy 是一个为云原生应用设计的开源边缘与服务代理,是一个 L7 代理和通信总线,专为大型现代面向服务的架构而设计,网络对应用程序来说应该是透明的。当网络和应用程序出现问题时,应该很容易确定问题的根源,而envoy做到了这一点
二、Envoy的高级功能
进程外架构:Envoy 是一个独立进程,设计为伴随每个应用程序服务运行。所有的 Envoy 形成一个透明的通信网格,每个应用程序发送消息到本地主机或从本地主机接收消息,但不知道网络拓扑。在服务间通信的场景下,进程外架构与传统的代码库方式相比,具有两大优点:
-
Envoy 可以使用任何应用程序语言。Envoy 部署可以在 Java、C++、Go、PHP、Python 等之间形成一个网格。面向服务架构使用多个应用程序框架和语言的趋势越来越普遍。Envoy 透明地弥合了它们之间的差异。
-
Envoy可以透明地在整个基础架构上快速部署和升级。
现代 C++11 代码库:Envoy 是用 C++11 编写的。Envoy 这样的基础架构组件应该尽可能避让(资源争用)。由于在共享云环境中部署以及使用了非常有生产力但不是特别高效的语言(如 PHP、Python、Ruby、Scala 等),现代应用程序开发人员已经难以找出延迟的原因。原生代码通常提供了优秀的延迟属性,不会对已混乱的系统增加额外负担。,C++11 具有出色的开发生产力和性能。
L3/L4 filter 架构:Envoy 的核心是一个 L3/L4 网络代理。可插入 filter 链机制允许开发人员编写 filter 来执行不同的 TCP 代理任务并将其插入到主体服务中。现在已有很多用来支持各种任务的 filter,如原始 TCP 代理、HTTP 代理、TLS 客户端证书认证等。
HTTP L7 filter 架构: HTTP 是现代应用程序体系结构的关键组件,Envoy 支持额外的 HTTP L7 filter 层。可以将 HTTP filter 插入执行不同任务的 HTTP 连接管理子系统,例如缓存,速率限制,路由/转发,嗅探 Amazon 的 DynamoDB 等等。
顶级 HTTP/2 支持: 当以 HTTP 模式运行时,Envoy 同时支持 HTTP/1.1 和 HTTP/2。Envoy 可以作为 HTTP/1.1 和 HTTP/2 之间的双向透明代理。这意味着它可以桥接 HTTP/1.1 和 HTTP/2 客户端以及目标服务器的任意组合。建议配置所有服务之间的 Envoy 使用 HTTP/2 来创建持久连接的网格,以便可以复用请求和响应。随着协议的逐步淘汰,Envoy 将不支持 SPDY。
HTTP L7 路由:当以 HTTP 模式运行时,Envoy 支持一种路由子系统,能够根据路径、权限、内容类型、运行时及参数值等对请求进行路由和重定向。这项功能在将 Envoy 用作前端/边缘代理时非常有用,同时,在构建服务网格时也会使用此功能。
gRPC支持:gRPC 是一个来自 Google 的 RPC 框架,它使用 HTTP/2 作为底层多路复用传输协议。Envoy 支持被 gRPC 请求和响应的作为路由和负载均衡底层的所有 HTTP/2 功能。这两个系统是非常互补的。
MongoDB L7 支持:MongoDB 是一种用于现代 Web 应用程序的流行数据库。Envoy 支持对 MongoDB 连接进行 L7 嗅探、统计和日志记录。
服务发现和动态配置: Envoy 可以选择使用动态配置 API 的分层集合实现集中管理。这些层为Envoy 提供了以下内容的动态更新:后端集群内的主机、后端集群本身、HTTP 路由、监听套接字和加密材料。对于更简单的部署,可以通过DNS 解析(甚至完全跳过)发现后端主机,静态配置文件将替代更深的层。
健康检查:推荐使用将服务发现视为最终一致的过程的方式来建立 Envoy 网格。Envoy 包含了一个健康检查子系统,可以选择对上游服务集群执行主动健康检查。然后,Envoy 联合使用服务发现和健康检查信息来确定健康的负载均衡目标。Envoy 还通过异常检测子系统支持被动健康检查。
高级负载均衡:负载均衡是分布式系统中不同组件之间的一个复杂问题。由于 Envoy 是一个独立代理而不是库,因此可以独立实现高级负载均衡以供任何应用程序访问。目前,Envoy 支持自动重试 、熔断、通过外部速率限制服务的全局速率限制、请求映射和异常点检测。未来还计划支持请求竞争。
前端/边缘代理支持:尽管 Envoy 主要设计用来作为一个服务间的通信系统,但在系统边缘使用相同的软件也是大有好处的(可观察性、管理、相同的服务发现和负载均衡算法等)。Envoy 包含足够多的功能,使其可作为大多数现代 Web 应用程序的边缘代理。这包括 TLS 终止、HTTP/1.1 和 HTTP/2 支持,以及 HTTP L7 路由。
最佳的可观察性: 如上所述,Envoy 的主要目标是使网络透明。但是,问题在网络层面和应用层面都可能会出现。Envoy 包含对所有子系统强大的统计功能支持。目前支持 statsd(和兼容的提供程序)作为统计信息接收器,但是插入不同的接收器并不困难。统计信息也可以通过管理端口查看。Envoy 还通过第三方提供商支持分布式追踪。
envoy的特性:
1)性能、可扩展及动态配置 性能:除了大量功外, Envoy 还提供极高的 吞吐量和低尾延迟差异,同时消耗相对较少CPU和 RAM; 可扩展性:Envoy在L4 和L7 上提供丰富的可插拔过滤器功能,允许用户轻松添加新; API可配置性: Envoy提供了一组可由控制平面服务实现的管理 API,也称为 xDS API 若控制平面实现了这所有的 API ,则可以使用通引导配置在整个基础架构中运行 Envoy 所有进一步的配置更改都可通过管理服务器无缝地行动态传递,使得Envoy永远不需要重新启动 于是,这使得Envoy成为一个通用数据平面,当与足够复杂的控制相结合时可大降低整体操作性 2)Envoy xDS API 存在 v1 、v2 和v3 三个版本 v1 API 仅使用 JSON/RESTJSON,本质上是轮询 v2 API 是 v1 的演进,而不是 革命它v1 功能的 超集,新API模式使用 proto3指定,并同时以 gRPC和 REST + JSON/YAML 端点实现 2021 年第 1季度结束支持 v3 API:当前支持 的版本,start_tls、拒绝传入的 tcp 连接、 4096位的 tls 密钥、 SkyWalking和WASM等 3) Envoy 业已 成为现代服务网格和边缘关的 “ 通用数据平面 API ” ,Istio 、Ambassador和 Gloo 等项目均是为此数据平面代理提供 的控制平面 ;
三、envoy的架构与组件
1、envoy的结构
envoy data path
envoy的架构
envoy的基础组件
2、envoy的术语
主机( Host ):一个具有网络通信能力的端点,例如服务器、移动智设备等(能够进行网络通信的实体(手机、服务器等上的应用程序)。在envoy中,主机是逻辑网络应用程序。一个物理硬件可能有多个主机在其上运行,只要每个主机都可以独立寻址。)
集群( Cluster ):集群是 Envoy 连接到的一组逻辑上相似端点;在 v2 中, RDS通过路由指向集群, CDS CDS提供集群 配置,而 Envoy 通过 EDS 发现集群成员,即端点;
下游( Downstream ):下游主机连接到 Envoy ,发送请求并接收响应它们是 Envoy 的客户端;
上游( Upstream ):上游主机接收来自 Envoy 的连接和请求并返回响应,它们是 Envoy 代理的后端服务器;
端点( Endpoint ):端点即上游主机,是一个或多集群的成员可通过 EDS 发现;
侦听器( Listener ):侦听器是能够由下游客户端连接的命名网络位置,例如口或 unix 域套接字等;
位置( Locality):上游端点运行的区域拓扑,包括地、和子等;
管理服务器( Management Server):实现 v2 API的服务器,它支持复制和分片并且能够在不同物理机上实 现针对不同 xDS API的API服务;
地域( Region ):区域所属地理位置;
区域( Zone ): AWS AWS中的可用区( AZ )或 GCP 中的区域等;
子区域: Envoy 实例或端点运行的区域内位置,用于支持多个负载均衡目标;
xDS:CDS、EDS、HDS、LDS、RLS(Rate Limit)、RDS、SDS、VHDS和RTDS等API统称
Mesh和Envoy MeshEnvoy:一组主机,它们协调以提供一致的网络拓扑。在本文档中,“Envoy 网格”是一组 Envoy 代理,它们为由许多不同服务和应用程序平台组成的分布式系统形成消息传递基础。)
运行时配置:与 Envoy 一起部署的带外实时配置系统。可以更改配置设置以影响操作,而无需重新启动 Envoy 或更改主要配置。
3、envoy部署类型
Envoy 通常用于以 容器编排系统为底层环境的服务网格中,并sidecar 的形式与主程 序容器运行为单个 Pod ;非编排系统环境中测试时,可以将主程序与Envoy 运行于同 一容器,或手动组织主程序与 Envoy容器共享同一个网络名称空间。
仅服务到服务
(1)service to service egress listener
1、这是应用程序用来与基础设施中的其他服务进行通信的端口。
3、Envoy根据配置中的细节处理服务发现、负载平衡、速率限制等。
4、 服务只需要了解本地Envoy,不需要关心网络拓扑、它们是在开发中运行还是在生产中运行等等
(2)service to service ingress listener
1、通过远程访问envoy的ip+port来访问envoy后端的服务
根据应用或负载均衡的需要,可能涉及多个应用端口(例如,如果服务同时需要一个HTTP端口和一个gRPC端口)。
2、本地envoy根据需要执行缓冲、断路等。
服务到服务+前端代理
上图显示了用作HTTP L7边缘反向代理的Envoy集群背后的服务到服务配置。
支持HTTP / 1.1和HTTP / 2;
HTTP L7路由;
通过Front-Envoy的入口接入请求,并结合发现服务与service - to - service的特使网格进行通信;
envoy主机的工作与任何其他envoy主机相同,除了它们不与另一个服务并列运行之外。
服务到服务、前端代理和双代理
双代理的目标是尽可能接近用户地终止 TLS 和客户端连接会更高效