写在前面的话:
本篇文章,主要希望讲清楚,下面几个问题:
1.Envoy是什么,长什么样子?
2.Envoy解决了什么问题?
3.使用它的好处在哪里?
简介:
Envoy是一款由 Lyft 开源的高性能数据和服务代理软件,使用现代 C++ 语言(C++11 以及 C++14)开发,提供四层和七层网络代理能力。
尽管在设计之初 Envoy没有将性能作为最终的目标,而是更加强调模块化、易测试、易开发等特性,可它仍旧拥有足可媲美 Nginx 等经典代理软件的超高性能。在保证性能的同时,Envoy也提供了强大的流量治理能力和可观察性。其独创的 xDS 协议则成为了构建 Service Mesh通用数据面 API(UDPA)的基石。
在 Envoy中,数据请求的入口方向被称之为下游(Downstream),而数据请求的出口方向则称之为上游(Upstream)。
监听器、集群、路由和筛选器构成了Envoy最为核心的骨架。
一、 什么是Envoy,架构是什么样子?
Envoy 是 Istio Service Mesh中默认的Sidecar,Istio 在 Envoy 的基础上按照Envoy的 xDS 协议扩展了其控制平面。
Envoy 里的基本术语,如下所示:
Downstream(下游):下游主机连接到 Envoy,发送请求并接收响应,即发送请求的主机。
Upstream(上游):上游主机接收来自 Envoy 的连接和请求,并返回响应,即接受请求的主机。
Listener(监听器):监听器是命名网地址(例如,端口、unix domain socket 等),下游客户端可以连接这些监听器。Envoy 暴露一个或者多个监听器给下游主机连接。
Cluster(集群):集群是指 Envoy 连接的一组逻辑相同的上游主机。Envoy 通过服务发现来发现集群的成员。可以选择通过主动健康检查来确定集群成员的健康状态。Envoy 通过负载均衡策略决定将请求路由到集群的哪个成员。
二、用来解决什么问题?
Envoy最常扮演的是两种角色,一种是作为集群流量入口的 API 网关(Gateway),管理南北向流量;另一种是作为服务Sidecar,拦截并治理服务网格中东西向流量。
1. 在 Istio中,数据平面主要负责执行如下任务:
1)服务发现:探测所有可用的上游或后端服务实例
2)健康检测:探测上游或后端服务实例是否健康,是否准备好接收网络流量
3)流量路由:将网络请求路由到正确的上游或后端服务
4)负载均衡:在对上游或后端服务进行请求时,选择合适的服务实例接收请求,同时负责处理超时、断路、重试等情况
备注:个人理解这里的数据是已经分配到本pod上面的数据流量,这里的导流量是导向上游机器里的pod,而导流量的做法应该是通过注册服务器方式,进行服务发现找到需要交互的那一部分服务机器,然后根据这个业务特性设置好的路由规则,进行负载均衡。
5)身份验证和授权:在 istio-agent 与 istiod 配合下,对网络请求进行身份验证、权限验证,以决定是否响应以及如何响应,使用 mTLS 或其他机制对链路进行加密等
6)链路追踪:对于每个请求,生成详细的统计信息、日志记录和分布式追踪数据,以便操作人员能够理解调用路径并在出现问题时进行调试。
概括起来,数据平面的工作就是负责有条件地转换、转发以及观察进出服务实例的每个网络包。
2. 现在常见的数据平面实现有:
1)Envoy:Istio 默认使用的数据平面实现方案,使用C++开发,性能较高。
2)MOSN:阿里巴巴公司开源,设计类似 Envoy,使用 Go 语言开发,优化过多协议支持。
3)Linkerd:一个提供弹性云端原生应用服务网格的开源项目,也是面向微服务的开源 RPC 代理,使用 Scala 开发。它的核心是一个透明代理。因此也可作为典型的数据平面的实现。
三、使用它的好处在哪里?
个人理解最闪亮的地方就是网络服务与业务解耦,让业务不需要关注网络的问题,并且单独部署,能够有效的减少发布服务时候,替换所有服务的情况。同时还可以根据这些网络信息作流控等操作。
Envoy的优势主要体现在下面几方面:
1.高性能:
C++ 语言实现,基于 Libevent 事件机制以及非阻塞异步 IO,保障性能;
2.易扩展:
利用其 L3/L4/L7 筛选器机制,Envoy 可以在各个层次进行功能扩展。
包括但不限于:额外代理协议支持、HTTP 流量治理功能扩展等等。
且由于其良好的封装和现代 C++ 对各种操作的简化,其开发过程非常友好;
此外,Envoy 也提供了基于 WASM 的扩展支持以及基于 Lua 脚本的简单功能扩展;
3.多协议支持:
原生支持代理 HTTP、Kafka、Dubbo、Redis 等多种协议;
4.动态化配置:
基于 xDS 协议实现配置的完全动态化,简化配置更新操作,实现监听端口、路由规则、后端服务发现等全运行时动态下发及更新;
5.可观察性:
内置日志,指标,追踪三个模块用于实现全方位、多维度流量和事件观察;
6.HTTP筛选器:
社区原生提供了大量的功能强大的 HTTP 筛选器如限流、认证鉴权、缓存、压缩、GRPC 协议转换等等,开箱即用;
7.社区开放活跃:
Envoy完全开源,不存在对应的商业版本,保证了它的发展不会受限于商业化;
而且 Envoy 社区非常活跃,不断向前推动 Envoy 的演进和发展。
参考资料:
云原生社区:https://cloudnative.to/
servicemesher社区: https://www.servicemesher.com/
Iistio中文网:https://istio.io/latest/zh/
listio官网:https://istio.io/
Istio Handbook书籍:https://www.servicemesher.com/istio-handbook/
envoy英文文档:https://www.envoyproxy.io/docs
envoy中文文档:https://www.servicemesher.com/envoy/
开源代码:
Istio: https://github.com/istio/istio
mosn: https://github.com/mosn/mosn
envoy: https://github.com/envoyproxy/envoy