正如我之前所说的,在如此短的时间内,Envoy 带来的兴奋既神奇又震撼人心。我经常问自己:envoy 的哪些方面导致了我们所看到的异常的社区增长?虽然 Envoy 具有很多引人注目的特征,但最终我认为有三个主要特征在共同推动:
有代理具备超高性能。也有代理具备高度的可扩展性和动态可配置性。在我看来,性能、可扩展性和动态可配置性的结合 才使得 Envoy 如此的引人注目。
在这篇文章中,我将概述 Envoy 动态配置 API 背后的历史和动机,讨论从 v1 到 v2 的演变,最后,鼓励更多的负载均衡,代理和控制平面社区来考虑在其产品中支持这些API。
Envoy 最初的设计目标之一是实现最终一致的服务发现系统。为此,我们开发了一个非常简单的发现服务和 Service Discovery Service (SDS) REST API,用来返回上游集群成员。该 API 克服了基于 DNS 的服务发现的一些限制(记录限制、缺少额外元数据等),并使我们能够快速实现高可靠性。
Envoy 开源初期,我们收到了很多关于支持其他服务发现系统的要求,如 Consul、Kubernetes、Marathon、DNS SRV等。我担心我们对这些系统直接支持的缺失会限制 Envoy 的使用范围而不被人所接纳。添加新的发现适配器的代码编写并不困难,我希望有关方面能够实施新的适配器。而过去一年实际发生是什么? 没有一个新的适配器被贡献到代码中,但我们看到了令人难以置信的接受度。为什么?
事实证明,几乎每个人都以自己的方式来实现 SDS API。API 本身是微不足道的,但我不认为这是人们实现它的唯一原因。另一个原因是,离数据平面越远,事情自然就会开始变得更牢固。Envoy 的消费者通常希望最终服务发现能够集成到特定的工作流程中。API 的简单性使得其可以轻松集成到几乎任何控制平面系统中。甚至像 Consul 系统的用户(参见示例 Nelson)也发现中间 API 可以对成员和命名做更智能的处理。因此,即使在如此早期的阶段,我们也看到了对通用数据平面 API 的渴望:一个简单的 API,从控制平面中抽象出数据平面。
在过去的一年中,Envoy 添加了多个 v1/REST 管理 API。他们包括:
当控制平面实现 SDS/CDS/RDS/LDS 时,几乎 Envoy 的所有方面都可以在运行时动态配置。Istio 和 Nelson 都是控制平面的例子,他们在 V1 API 上构建,具备极其丰富的功能。通过使用相对简单的 REST API,Envoy 可以快速迭代性能和数据平面功能,同时仍支持各种不同的控制平面方案。此时,通用数据平面概念正成为现实。
v1 API 仅使用 JSON/REST,本质上是轮询。这有几个缺点:
在过去几个月与 Google 的紧密合作中,我们一直在努力研究一组我们称之为 v2 的新 API。v2 API 具有以下属性:
译者注:envoy-api 仓库在 Envoy 加入CNCF 后改为 envoyproxy/data-plane-api 仓库,问题后面有提到。
v2 API 是 v1 的演进,而不是革命,它是 v1 功能的超集。v1 用户会发现 v2 非常接近他们已经在使用的 API。实际上,我们一直以可以继续永久支持 v1(尽管是最终被冻结的功能集)的方式在 Envoy 中实现 v2。
不透明的元数据已被添加到各种 API 响应中,这将极大的增强可扩展性。例如,HTTP 路由中的元数据,附加到上游端点和自定义负载均衡器的元数据,以用来构建站点特有的基于标签的路由。我们的目标是可以在默认的OSS发行版之上轻松插入丰富的功能。未来将有更强大的关于编写 Envoy 扩展的文档。
对于使用 v2 gRPC(vs. JSON/REST)的 API 消费者,双向流会有一些有趣的增强,我将在下面进行更多讨论。
v2 API 由以下部分组成:
译者注:目前 xds 中没有 kds 的定义,但是有一个Secret Discovery Service,应该是这个 kds 的改名。以上 API 请参考 https://github.com/envoyproxy/data-plane-api/tree/master/envoy/api/v2
总的来说,我们称所有上述 API 为 xDS
。 从 JSON/REST 到 proto3 API 的过渡非常令人兴奋,良好类型的 proto3 API 可以更容易使用,我认为这将进一步提高 API 本身以及 Envoy 的接受度。
服务网格/负载均衡领域现在非常活跃。代理包括 Envoy、Linkerd、NGINX、HAProxy、Traefik,来自所有主要云提供商的软件负载均衡器,以及传统硬件供应商(如 F5 和思科)的物理设备。随着众多解决方案的出现,如 Istio、Nelson,集成云解决方案以及许多供应商即将推出的产品等,控制平面领域也在不断升温。
特别讨论一下 Istio,Linkerd 已经宣布对它的支持,这意味着至少在某种程度上它已经实现了 v1 Envoy API。其他人可能会跟随。 在这个数据平面和控制平面快速发展的新世界中,我们将看到组件的混合和匹配;数据平面将与许多控制平面一起工作,反之亦然。我们是否可以让业界受益于一种通用 API,让这种混合和匹配更容易实现? 这会有什么帮助?
在我看来,在接下来的几年中,数据平面本身将大部分商品化。大部分创新(和商业机会扩展)实际上将成为控制平面的一部分。使用 v2 Envoy API,控制平面功能的范围可以会从使用 N² 健康检查的扁平端点命名空间扩展到一个非常丰富的全局负载均衡系统,该系统可进行自动构造子集、负载装卸和均衡、分布式局部健康检查、区域感知路由、基于百分比的自动部署和回滚等。供应商将在提供无缝的微服务运维环境方面展开竞争,而对路由的自动化控制将是其竞争中的主要部分。
在这个新的世界中,数据平台可以用来与控制平面进行通讯的通用API对每个参与者都是一个胜利。控制平面提供商可以将它们的服务提供给实现该API的任何数据平面。数据平面可以在功能,性能,规模和健壮性方面展开竞争。此外,解耦允许控制平面提供商提供 SaaS 解决方案,而不需要同时拥有数据平面部署,这是一个主要的痛点。
虽然很难知道未来几年会发生什么,但我们对 Envoy 及其相关 API 的采用感到非常兴奋。我们看到了通用的数据平面 API 的价值所在:可以桥接不同系统。根据这些原则,我们邀请更大的数据平面和控制平面供应商以及用户与我们在 envoy-api 存储仓库中进行协作(请注意,当Envoy 进入 CNCF 并转换到专用的 envoyproxy GitHub 组织时,我们将重命名该存储仓库为 data-plane-api)。我们不保证我们将添加所有可能的功能,但我们希望看到其他系统使用这些 API 并帮助我们改进它们以满足他们自己的需求。我们的观点是,数据平面的商品化将为最终用户带来巨大收益,这有助于控制平面领域提高迭代和竞争速度,未来几年大部分创新将会发生在控制平面。
英文原文发布于2017年9月6日,本文发出时 Envoy 已经进入了 CNCF,成为了官方项目,Envoy 原来的代码都已经被重构和迁移,本文中提到的很多链接都已过时,请大家参考 Envoy 官网 https://www.envoyproxy.io/,也可以查看 Envoy 官方文档中文版 https://servicemesher.github.io/envoy/。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章