3.3.1 Envoy代理

Envoy最初是由Lyft开发的,用于解决构建分布式系统时出现的一些复杂的网络问题。它于2016年9月作为开源项目提供,一年后加入了云原生计算基金会(CNCF)。Envoy是用C++语言实现的,具有很高的性能,更重要的是,它在高负载运行时也非常稳定和可靠。网络对应用程序来说应该是透明的,当网络和应用程序出现问题时,应该很容易确定问题的根源。正是基于这样的一种设计理念,将Envoy设计为一个面向服务架构的七层代理和通信总线。

为了更好地理解Envoy,我们需要先搞清楚相关的几个基本术语:

·进程外(Out of Process)架构:Envoy是一个独立进程,Envoy之间形成一个透明的通信网格,每个应用程序发送消息到本地主机或从本地主机接收消息,但无需关心网络拓扑。

·单进程多线程模型:Envoy使用了单进程多线程的架构模型。一个主线程管理各种琐碎的任务,而一些工作子线程则负责执行监听、过滤和转发功能。

·下游(Downstream):连接到Envoy并发送请求、接收响应的主机叫下游主机,也就是说下游主机代表的是发送请求的主机。

·上游(Upstream):与下游相对,接收请求的主机叫上游主机。

·监听器(Listener):监听器是命名网络地址,包括端口、unix domain socket等,可以被下游主机连接。Envoy暴露一个或者多个监听器给下游主机连接。每个监听器都独立配置一些网络级别(即三层或四层)的过滤器。当监听器接收到新连接时,配置好的本地过滤器将被实例化,并开始处理后续事件。一般来说监听器架构用于执行绝大多数不同的代理任务,例如限速、TLS客户端认证、HTTP连接管理、MongoDB sniff ing、原始TCP代理等。

·集群(Cluster):集群是指Envoy连接的一组逻辑相同的上游主机。

·xDS协议:在Envoy中xDS协议代表的是多个发现服务协议,包括集群发现服务(CDS,Cluster Discovery Service)、监听器发现服务(LDS,Listener Discovery Service)、路由发现服务(RDS,Route Discovery Service)、端点发现服务(EDS,Endpoint Discovery Service),以及密钥发现服务(SDS,Secret Discovery Service)。

从图3-5可以看到上述其中几个术语与Envoy代理的关系。Envoy代理有许多功能可用于服务间通信,例如,暴露一个或者多个监听器给下游主机连接,通过端口暴露给外部的应用程序;通过定义路由规则处理监听器中传输的流量,并将该流量定向到目标集群,等等。后续章节会进一步分析这几个发现服务在Istio中的角色和作用。

图3-5 Envoy代理

在了解了Envoy的术语之后,你可能想尽快知道Envoy到底起到了什么作用?

首先,Envoy是一种代理,在网络体系架构中扮演着中介的角色,可以为网络中的流量管理添加额外的功能,包括提供安全性、隐私保护或策略等。在服务间调用的场景中,代理可以为客户端隐藏服务后端的拓扑细节,简化交互的复杂性,并保护后端服务不会过载。例如,后端服务实际上是运行的一组相同实例,每个实例能够处理一定量的负载。

其次,Envoy中的集群(Cluster)本质上是指Envoy连接到的逻辑上相同的一组上游主机。那么客户端如何知道在与后端服务交互时要使用哪个实例或IP地址?Envoy作为代理起到了路由选择的作用,通过服务发现(SDS,Service Discovery Service),Envoy代理发现集群中的所有成员,然后通过主动健康检查来确定集群成员的健康状态,并根据健康状态,通过负载均衡策略决定将请求路由到哪个集群成员。而在Envoy代理处理跨服务实例的负载均衡过程中,客户端不需要知道实际部署的任何细节。