作者:Spiros Psarris
Curiefense[1]集成了Envoy Proxy[2],这是一个著名的开源代理和云原生应用服务代理。Envoy 最初由Lyft[3]开发,现在是云原生计算基金会(Cloud Native Computing Foundation)的一部分,旨在创建一个透明的网络,使故障排除更容易。
Envoy 为现代微服务架构提供了许多好处。在本文中,我们将讨论它的开发动机,简要概述它的特性,一些最流行的用例,最后,Curiefense 为它添加了什么。
背景和动机
Envoy 是Matt Klein 在 2016 年首次宣布[4]:“一个独立的进程,旨在与每个应用服务器一起运行。所有的 Envoy 都形成了一个透明的通信网络,每个应用程序在其中向本地主机发送和接收消息,而不知道网络拓扑。”作为代理,Envoy 代表网络中的应用程序(通常是服务),该应用程序不再直接参与该网络;所有通信都是通过代理完成的。
这将开发人员从必须在他们的应用程序中实现大量与网络相关的特性中解放出来,因为代理内置了这些功能。
Envoy 的驱动原则是可观察性。正如 Matt Klein 指出的,“这个项目诞生于这样的信念:网络应该对应用程序透明。当网络和应用程序出现问题时,应该很容易确定问题的来源。”
Envoy 的特性
为云原生应用程序创建透明网络并促进故障排除并非易事。这是一个具有挑战性的目标,Envoy 通过一系列强有力的特性来实现:
- 进程外架构:Envoy 是一个自包含的可执行文件,它与实际的应用程序并行运行,使其更易于部署,并使其能够与任何编程语言一起工作。
- L3/L4 过滤器:Envoy 是一个 L3/L4 网络代理,具有可插拔的过滤器链,实现各种 TCP/UDP 代理任务。
- HTTP L7 过滤器:Envoy 也支持 HTTP L7 过滤器,因为 HTTP 是云原生应用程序的关键组件。
- gRPC 支持:Envoy 支持路由和负载均衡 gRPC 的请求和响应。
- 动态配置:在集群启动和运行时,Envoy 本身的配置由 API 管理,并使用动态更新。
- 负载均衡:Envoy 支持先进的负载均衡方式,如自动重试、断路、限速等。
- 边缘代理支持:可以在边缘使用 Envoy,支持 TLS 终止,HTTP/1.1、HTTP/2 和 HTTP/3。
这些特性让你可以使用 Envoy 为现代的本地云应用程序创建网络解决方案,我们将在下面介绍其中的一些功能。
特色用例
负载平衡
对于现代的 web 应用程序和服务,网络负载均衡是必须的。它有多种形式;也许最熟悉的拓扑是中间代理,如图 1 所示。客户端连接到负载均衡器,负载均衡器将结果负载分配到后端。
图 1:负载均衡器(来源:Envoy 代理博客[5])
负载均衡器必须执行几个关键任务,如服务发现(发现后端服务可用来处理负载)、健康检查(监控服务实例看到健康和有能力),并把请求分发(决定如何分配输入负载到可用的服务)。
你可以使用 Envoy 为 TCP 和 UDP 连接 L4 负载均衡和 L7 负载均衡的 HTTP 连接。此外,Envoy 还支持 HTTP/1、HTTP/2、gRPC、Redis、MongoDB、MySQL、Kafka、DynamoDB 等 L7 协议解析和路由。可以将 Envoy 实现为类似图 1 的中间代理,也可以实现为 sidecar 代理:
图 2:使用 sidecars 的负载均衡(来源:Envoy Proxy 博客[6])
在这个角色中,Envoy 可以提供比负载平衡更多的功能。当所有服务都使用 Envoy sidecar 代理时,这将创建一个服务网格。
服务网格
服务网格已经成为云原生世界中广泛使用的架构。它是微服务之间的通信层,所有的请求都经过服务网格,使得分布式应用程序之间的通信更加安全可靠。服务之间不再直接通信;相反,每个服务只与它的 Envoy 代理通信,并且代理之间通信。
图 3:Envoy 作为一个服务网格(来源:Envoy 项目作者[7])
上面图 3 中所示的四个服务已经使用 Envoy sidecar 代理进行了部署。服务之间的所有网络流量,包括 HTTP、gRPC、TCP 和 UDP,都要经过代理。换句话说,服务实例是从网络堆栈中抽象出来的,这种抽象使得开发和部署分布式应用程序变得更容易。由于这个和其他原因,服务网格在行业中有很高的采用率。
一个服务网格设置可以在逻辑上分为两个部分:一个数据平面和一个控制平面。在数据平面中,实际的请求通过以下任务来处理:
- 后端服务的服务发现
- 后端服务的健康检查
- 通过端点路由到特定服务
- 带有超时、断路和重试机制的负载平衡
- 身份验证和授权
为了运行数据平面的操作,需要一个控制平面来提供服务网格中所有组件的配置和策略。Envoy 交付数据平面的所有特性;对于控制平面,Istio[8]是一个普遍的选择。
图 4:Istio 架构(来源:Istio 作者[9])
根据CNCF 最近的一项调查[10],近 50%的生产级服务网格都使用了 Istio。因此,如果你计划使用 Envoy 作为你的服务网的一部分,那么值得查看 Istio[11]并熟悉它的附加功能。
API 网关/代理
API 网关是一个管理层,用于组织和分发请求到微服务。随着微服务和云部署的兴起,越来越多的应用程序使用 API 网关作为用户和客户端应用程序的入口点。
你可以将 Envoy 用作带有前端代理特性的 API 网关,这样它就可以管理入站流量并将请求定向到集群中的服务。例如,使用以下设置,所有到端口 8080、8443 和 8001 的传入请求都由 Envoy 管理。对端点/service/1 和/service/2 的请求分别被发送到 Envoy 的 sidecar 代理。
图 5:前端代理部署(来源:Envoy 项目作者[12])
定制 Envoy 扩展
Envoy 具有丰富的功能集,但有时会出现不受支持的用例。因此,它支持新的扩展并为此目的提供钩子。Envoy 的架构[13]由用作扩展点的多个过滤器和侦听器堆栈组成。
由于 Envoy 仍处于开发阶段,因此没有编写自定义扩展的高级文档。然而,有许多现有的扩展[14]可以研究。要开始构建自定义扩展,请查看示例网络过滤器[15]。
推荐阅读
由于其强大的功能集,Envoy 是云原生微服务的杰出代理和网络解决方案。在本文中,我们简要介绍了 Envoy。这里有一些推荐的资源来了解更多:
- Matt Klein 的首次宣布 Envoy[16]
- 服务网格数据平面 vs.控制平面[17]
- Envoy 的文档[18]
- 示例仓库[19]中各种用例的初始配置
Curiefense 和 Envoy
Envoy 通常部署在所有发送到特定目的地(例如,微服务、API 端点,甚至整个网络)的流量都要经过它的情况。这意味着它是一个添加流量过滤的自然点。通过与 Envoy 的集成,Curiefense 为这个流行的代理带来了内置的网络安全。在任何可以使用 Envoy 的地方,Curiefense 可以过滤流量和阻塞敌意请求。
参考资料
[1]Curiefense: https://www.curiefense.io/
[2]Envoy Proxy: https://www.envoyproxy.io/
[3]Lyft: https://www.lyft.com/
[4]Matt Klein 在 2016 年首次宣布: https://eng.lyft.com/announcing-envoy-c-l7-proxy-and-communication-bus-92520b6c8191
[5]Envoy 代理博客: https://blog.envoyproxy.io/introduction-to-modern-network-load-balancing-and-proxying-a57f6ff80236
[6]Envoy Proxy 博客: https://blog.envoyproxy.io/introduction-to-modern-network-load-balancing-and-proxying-a57f6ff80236
[7]Envoy 项目作者: https://www.envoyproxy.io/docs/envoy/latest/intro/life_of_a_request#network-topology
[8]Istio: https://istio.io/
[9]Istio 作者: https://istio.io/latest/docs/ops/deployment/architecture/
[10]CNCF 最近的一项调查: https://www.cncf.io/wp-content/uploads/2020/11/CNCF_Survey_Report_2020.pdf
[11]查看 Istio: https://istio.io/latest/about/service-mesh/
[12]Envoy 项目作者: https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/front_proxy
[13]Envoy 的架构: https://www.envoyproxy.io/docs/envoy/latest/intro/arch_overview/arch_overview
[14]现有的扩展: https://github.com/envoyproxy/envoy/tree/main/source/extensions
[15]示例网络过滤器: https://github.com/envoyproxy/envoy-filter-example
[16]Matt Klein 的首次宣布 Envoy: https://eng.lyft.com/announcing-envoy-c-l7-proxy-and-communication-bus-92520b6c8191
[17]服务网格数据平面 vs.控制平面: https://blog.envoyproxy.io/service-mesh-data-plane-vs-control-plane-2774e720f7fc
[18]Envoy 的文档: https://www.envoyproxy.io/docs/envoy/latest/
[19]示例仓库: https://github.com/envoyproxy/envoy/tree/main/examples