Envoy是一个用C++编写的云原生高性能边缘代理、中间代理和服务代理,作为专门为 微服务架构设计的通信总线 ,定位是作为Service Mesh的数据平面,接管微服务通信的全部流量,对应用程序屏蔽网络和通信的复杂性。
Envoy作为一个独立进程,设计与应用程序一起运行,所有的Envoy形成一个透明的通信网格,每个应用程序发送消息到本地Envoy代理或从本地Envoy代理接收消息,但不需要知道具体的网络拓扑。
Envoy的核心设计理念是网络应该对应用服务透明,职责划分上比较明确,当网络和应用程序出现故障时,可以很容易定位问题的具体根源。
架构上Envoy内部可以分为数据平面、控制平面和管理平面3个部分。其中,控制平面用于对流量路由和转发相关的策略与配置进行管理;控制平面通过标准API获取最新的流量配置信息;数据平面的流量转发就是基于控制平面下发的配置规则进行。
为了方便对Envoy运行状态进行监控和管理,Envoy内置一个HTTP Server,作为Envoy的管理平面,HTTP Server会注册一系列的Handler,对外暴露管理平面的API,用于外界查询当前Envoy各个维度的状态,比如外界可以通过管理平面API查询Envoy当前的集群和路由配置、当前的统计信息等。
Envoy接收到Downstream客户端发过来的请求时,一般先经过类似Iptables的透明拦截机制,然后将流量交给Envoy。Envoy获取请求对应的原目的地址,根据目的地址信息获取对应的网络过滤链配置信息,根据网络过滤链配置建立新的连接,并通过网络过滤链对应的协议对请求进行解码和路由,选择合适的Upstream节点,将请求发送出去,同时建立Downstream连接和Upstream连接的对应关系,将Upstream返回的响应消息发送给Downstream客户端。Envoy的数据流和控制流示意图如图3-3所示。
图3-3 Envoy的数据流和控制流
Envoy之所以在如此短的时间内,在Service Mesh数据平面中脱颖而出,是和它优雅的架构设计密切相关,主要体现在如下方面。
Envoy扩展性通过插件机制实现,Envoy内部当前已经支持众多扩展点,通过网络协议插件和HTTP处理扩展插件,分别从通信协议和链路治理两个层面进行扩展。Envoy插件机制是Service Mesh数据转发和数据处理的基石,基于插件扩展性机制进行扩展和定制开发非常方便,可以建立起强大的Service Mesh生态。
配置动态化是Envoy架构层面最优雅的设计。基于配置动态化设计,Envoy集群管理与流量转发相关的所有配置均可以通过XDS协议动态下发和生效,不仅减少了运维复杂度,同时借助动态配置化能力,方便通过一定机制发现Envoy运行时的风险并快速调整,提高了Envoy的整体稳定性。
Envoy支持如此众多特性的同时,仍然可以提供优秀的性能指标,得益于良好的架构设计,Envoy架构设计对性能的考虑随处可见。比如数据转发层面,Envoy采用异步事件驱动的方式,并且保证一个请求只会在一个线程内处理,减少了请求在线程间切换的开销;此外通过数据平面和控制平面分离,配置变更时,通过无锁机制保证数据转发的性能不受任何影响。
此外Envoy对Service Mesh的一大贡献是第一个提出了通用数据平面API的概念,通过通用数据平面API,建立了数据平面和控制平面之间交互的标准,实现了数据平面和控制平面通信的标准化。只要基于数据平面API实现,可以根据需要方便地对数据平面或控制平面进行替换,有利于Service Mesh生态体系的建设。
Istio是Google、IBM和Lyft联合推出的开源微服务Service Mesh框架,旨在解决大量微服务的发现、连接、管理、监控以及安全等问题,Istio综合了Google、IBM和Lyft在微服务领域的强大积累和经验,以Envoy为基础,将Envoy作为默认的数据平面,同时提供强大的控制平面能力。一经推出在Service Mesh领域就引起巨大的反响,当前已成为Service Mesh事实上的平台和标准。
Envoy已经可以很出色地完成流量路由和转发工作,Istio在Envoy的基础上,提供如下几方面的核心能力。
Istio通过提供通用的配置管理能力,保证不同平台、不同环境下的配置均能够通过一致的方式对Envoy进行配置和下发,对Envoy屏蔽了配置管理的复杂性。这个工作具体由Istio的Pilot组件负责完成。
Istio负责Envoy的生命周期管理,启动Envoy,然后监控Envoy的运行状态,如果运行有异常,Istio会尝试对Envoy进行重启,重启仍然不能成功时,Istio会将当前Envoy实例调度到其他节点上运行。这个工作具体由Istio的Pilot组件负责完成。
通信安全对于微服务来说是一个非常重要的基础能力,Istio通过托管身份验证、授权和服务之间通信的双向TLS加密,保障通信的安全性,这个工作具体由Istio的security组件负责完成。
对于一些核心资源,需要通过一定的策略,在不同消费服务以及服务的不同实例中进行分配,保证资源能够按照预期进行管理,这个工作具体由Istio的Mixer组件负责完成。
Envoy自身也能进行一些遥测统计相关的工作,但如果需要支持不同的遥测统计后端基础设施,可以将这部分工作移到控制平面上,保证Envoy自身架构的简洁性和稳定性,通过收集遥测统计相关的数据和指标,可以对服务进行全方位的监控。这个工作具体由Istio的Mixer组件完成。