Tetrate 工程师暨 Envoy 资深维护员周礼赞在 2019 年 KubeCon 巴塞罗那的讲台上,向听众讲解了 Envoy 的基本概念 和 深入谈讨了它的可扩展性。 服务网格解决了在大型分布式系统中与可观察性和网络相关的诸多操作问题,而它的可扩展性正好能应用在多种使用场景上。 Tetrate 的 GetEnvoy 为企业提供了经认证与测试的 Envoy 代理配置,并将在下周发布。
为了迎合商业需要,越来越多大型企业组织开始采用微服务架构, 可是这个转变往往都很棘手。
问题何在
如果你正在使用一个大型、分布式的架构,那么在管控系统、维护系统安全和监控系统时,你可能已经遇到过一些实际的操作问题。这些问题总是发生在不同组件上。
在这个高阶层面上,Envoy 的创始人 Matt Klein 将带你逐步看看 Envoy 的基础使用技巧和它的强大治理能力。
你很有可能正在使用多种语言和框架,而你的网络在调用服务时,可能是按照个别语言库去处理的。 你可能正在使用多种协议、数据库和缓存层,不同种类的物理和虚拟架构,还有多种负载均衡器。 那么你的可观察性输出就会不一致, 而且更新数据库也会相当棘手。 要在如此拥肿的系统中进行认证、授权和实现的最佳实践,比如重试、断路和限速等的操作,并且保持一致的标准,实在并非易事。 如此一来,开发者将对这网络失去信任。 此外,要是你无法第一手掌握系统内发生的情况,那么调试工作也将成为一场灾难。
解决办法就在网格
Envoy 最主要的目的,就是把复杂的应用监控和管理工作移到应用之外,从而大大简化各个应用内的复杂性。 Envoy 原来是架设于 Lyft 的,现在则是一个 C++ 分布式代理,它和每个应用同时运行,并将网络分隔开,提供了共同且适用于不同平台的功能。 Envoy 亦是特别为大型服务网格架构而设计的数据平面。 部署到你的应用或作为边缘代理的 Envoy Sidecar 代理,可以使用 Istio 或其他控制平面来控制。 一旦所有服务流量都必须通过 Envoy 网格,要一致地控制和观察你的网络中的情况就变得十分简单。 开发者可以随心选择适用的语言和技术,快速并持续地提供服务,重新聚焦在应用的业务逻辑上。 Envoy Sidecar 代理透过控制平面来进行配置,就能处理大部分的网络功能——包括服务发现、日志记录、监控、追踪、认证和授权。
Envoy 的知名度远远超越了它短暂的历史。 仅仅花了几年,从 2015 年的创立,到 2018 年时从 CNCF 毕业,它已经成长为一个充满活力的开源社区,并被一系列的科技巨头——包括云提供商、大型网络提供商和初创企业——广为采用并以它为基础建立业务。
Envoy 的高阶特点
进程外的架构︰ Envoy 并不是数据库。 它的设计意念为一个独立自足的服务代理(或 Sidecar),可与各个应用服务器并行。 应用和 localhost 交换消息时,不会对网络拓扑有所感知。 它适用于任何的应用语言。 在服务通信上,有别于数据库的系统,Envoy 能透明地进行部署和升级。
高效能、低延迟的代码基础︰ Envoy 是以 C++14 写成的,也代表它拥有非常高的效能,同时有特别低的尾延迟。
L3/L4 过滤器架构︰ Envoy 是一个 L3/L4 (或面向字节位)的网络代理,配有可插拔的过滤器机制,使它能支持例如 TLS 客户凭证、认证、RBAC 以及 API 管理等的工作。 它也能用于 HTTP、TCP、Mongo MySQL、Redis 和 Dubbo 等场景。
HTTP L7 路由和过滤器架构︰ 在 HTTP 模式中,Envoy 支持路由子系统,它能够按照路径、权限、内容种类、运行时值和其他参数来路由和重定向请求。在服务网格的领域里,这是一个特别强大的工具。 Envoy 还支持额外的 HTTP L7 过滤器层,用来支持特别繁复的工作任务,包括缓冲、限速,以及路由/转发等。
一流的 HTTP/2 支持︰ Envoy 是先以 HTTP/2 建立的,所以它同时支持 HTTP/1.1 和 HTTP/2,亦可连接任何组合的 HTTP 客户和目标服务器。 使用 HTTP/2 并非单纯为了支持 Edge 浏览器, 它同时可提升服务间的调用效率。 Envoy 同时支持上游与下游的 gRPC ,也支持 MongoDB 和 DynamoDB。
服务发现和健康检查︰ Envoy 拥有丰富的服务发现功能(你的后台主机是什么?)和健康检查功能(这些主机健康吗?)。 进行统一控管时,它能选择消费某组层化的 API 动态配置,但在更简单的部署上,后台主机发现只需以 DNS 解析和静态配置文档来完成。 Envoy 支持一致的服务发现以及主被动健康检查,也可使用服务发现和健康检查数据来决定负载均衡的指标。
进阶使用负载均衡︰ Envoy 具备进程外架构,让进阶负载均衡技术可单独用于任何应用。 这些技术包括重试、限速、重现请求、异常点检测,还有断路等等。
可观察性︰ Envoy 的主要目标,就是把网络变得透明、提供丰富的统计输出、日志记录及追踪。 Envoy 为所有的子系统一致提供统计支持。 此外,Envoy 还支持由第三方提供的分布式追踪。 Tetrate 推荐使用 SkyWalking,因为它是特别为服务网格订造的。 只要在架构内全面运行 Envoy,你就能获得更有意义、更可比的数据。
认证和授权︰ TLS 双向认证是服务间调用的基本认证。 Envoy 同时支持 RBAC 和 JWT 认证。
前端/边缘的代理支持︰有了像 TLS 终止、H1/H2 支持和 L7 路由的这些功能,Envoy 就可在大多数网页应用场景上用作边缘代理。
配置
作为通用的数据平面,Envoy 的配置是由它的控制平面所管理的。 它通过 filesystem 和询问一个或多个管理服务器来发现它的动态资源。 这些发现服务和它们相应的配置 API 被称为 xDS。 每个 xDS API 都与某种特定资源相关联,包括︰
监听器(LDS)、集群(CDS)、路由(RDS)、端点(EDS)和秘钥 TLS 认证(SDS)。
Envoy 支持 gRPC 引流和 proto3 规范的 JSON/YAML REST。 中央管理系统让用户能掌控一整支 Envoy 舰队,省去逐一配置代理的麻烦。 每个 Envoy 都用上了一个全局通用、标准化的 boostrap config 配置,其余的工作就由管理服务器来打理。 控制平面可以给每个 Envoy 推送新的配置。
Envoy 的扩展系统
可扩展性是 Envoy 的一项重点功能。 如上图所示,从 worker 线程开始,每个请求都会经过一些过滤器,包括监听器、连接过滤器链、L3 及 L4 过滤器,以至 HTTP 过滤器(假如是协议的话,Envoy 可作为 L7 层),最终到达路由器和后台服务。 针对从后台服务而来的响应,同一条链也是通过同样方式经过这些过滤器、监听器,以至最终到达下游客户端。 这些过滤器既强大,又是高度可配置的。 它们能够修改在 L4 层的数据,插入 HTTP header、检查和引导流量、调用授权服务,或者进行协议间转码。 通过数据平面 API 可增加自定义过滤器,而 Envoy 有专为可观察性输出而设的插件式架构。
Envoy 设有多个扩展点︰L4/L7 过滤器、访问日志记录器、追踪器、健康检查器、传输接口、重试政策、资源监控,以及统计接收器。
Envoy 的 扩展仓库 资源十分丰富,而且常常更新。 TAP 是最新推出的扩展功能,具备端口捕获功能,让你在 L4 或 L7 层进行捕获及调试;你可以打开请求来查看符合一定条件的流量,并从 admin 端点处获得该流量的样本。 MySQL、Kafka 和 Dubbo 是今年最新推出的 L4 过滤器,为那些协议提供了支持。
自定义扩展功能
你可以通过 C++ 来编写你所需要的扩展功能, 编程分为两个部分︰分别是配置和实际执行。 Envoy 的配置解析进程用作告诉 Envoy 名称所属的扩展功能, 它跟配置部分是密不可分的。 Envoy 会根据配置来启动你的扩展功能及执行部分,通常会在协议缓冲区(protobuf)完成。 Envoy 会根据配置来启动你的扩展功能及执行部分,通常会在协议缓冲区(protobuf)完成。 Envoy 现阶段并不提供高级扩展功能的开发者文档,但提供了 范例, 演示如何添加网络过滤器、组织仓库以及建立依赖关系。 在范例中,build 文件引入了新的 Envoy 静态二进目标,因此 Envoy 懂得如何启动新的过滤器。
上述简单的例子中,Gzip 过滤器会压缩 Envoy 从下游后台服务所获得的响应。 Config 配置是通过 protobuf 所创建的,而过滤器的重要部分 encodeData 当中的逻辑是这样的︰
它向压缩器输出缓冲区。 数据会由压缩器修改并发回下游。 基于这些 Boolean 筛选条件,如果请求没有 Accept-Encoding Header,压缩过程会被略过。
其他扩展方法
现在 Lua 过滤器 只在 HTTP 上运作。 你可以在 Envoy config 配置中编写和嵌入 Lua 脚本,然后 Lua 过滤器就会允许你进行 header 和数据修改。 WebAssembly 同时也在另一个 WASM 仓库上运行。 如果想进一步了解这项工作,可以观看来自 Tetrate 的 Dhi Aurrahman 在 2019 KubeCon(巴塞罗那)所演讲的 Envoy+WASM 讲座 。 另外,目前也有建议利用 gRPC 来进行进程外扩展——但我们仍然在研究它的可行性。
GetEnvoy
Tetrate 是企业级服务网格提供商,由服务网格专家团队组成,为希望使用 Envoy 代理的机构提供 GetEnvoy 安装支持,当中包含经测试及认证的程序包、二进制文件及图片。