Envoy Proxy负载均衡介绍
负载均衡是 devops 工程师的常用术语。当大量流量进入您的系统时,您需要找到一种方法来扩展系统,以便它能够正确处理它。一种解决方案是提高正在运行的单个节点的性能。另一种解决方案是添加更多节点并在这些节点之间分配工作。拥有多个节点还有另一个附加优势是高可用性。负载均衡器用于在工作节点之间分配流量。 Envoy 代理是一种代理服务,用于被称为服务网格的最新趋势概念。我们将在这篇博文中看到 Envo
负载均衡是 devops 工程师的常用术语。当大量流量进入您的系统时,您需要找到一种方法来扩展系统,以便它能够正确处理它。一种解决方案是提高正在运行的单个节点的性能。另一种解决方案是添加更多节点并在这些节点之间分配工作。拥有多个节点还有另一个附加优势是高可用性。负载均衡器用于在工作节点之间分配流量。
Envoy 代理是一种代理服务,用于被称为服务网格的最新趋势概念。我们将在这篇博文中看到 Envoy 代理的负载平衡方面。
负载均衡器
[](https://res.cloudinary.com/practicaldev/image/fetch/s--JY7nyQig--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode .com/res/hashnode/image/upload/v156120701337/6m8S99wcO.jpeg)
负载均衡器是监听进入计算集群的请求的端点。当请求进入负载均衡器时,它会检查可用的工作节点并在工作节点之间分配请求。负载均衡器做以下事情。
-
服务发现:检查可用的工作节点
-
健康检查:定期检查工作节点的健康状况。
-
负载均衡:在工作节点之间分配请求。
代理
代理是存在于两个端点之间的中间组件。代理服务接受客户端请求并将其转发到目标服务器。有两种类型的代理。正向代理和反向代理。除了直接向端点发送请求,我们还可以通过代理发送它。这种类型的代理称为转发代理。转发代理通常用于绕过防火墙限制并访问被阻止的网站。
反向代理是一种代理服务,它接受传入的客户端请求并将其转发到可以满足它的服务器。结果将被路由回客户端。除此之外,代理还提供对客户端请求的更多控制。它还可以缓存请求并加快网络性能。反向代理用于
-
当网站不允许直接连接作为安全措施时启用间接访问。
-
向 Internet 用户流式传输内部内容。
-
允许服务器之间的负载平衡。
-
禁用对站点的访问。
负载均衡拓扑
代理位于客户端和后端端点之间。负载均衡根据代理服务放置的位置可以分为以下几种拓扑。
中间代理
[](https://res.cloudinary.com/practicaldev/image/fetch/s--FjUJpUgL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn. hashnode.com/res/hashnode/image/upload/v1561205086390/LSqMUbxzw.jpeg)
所有客户端请求都进入中间代理。中间代理路由请求进入工作节点。这种类型的负载均衡器简单明了。
嵌入式客户端库
[](https://res.cloudinary.com/practicaldev/image/fetch/s--PICvYFfo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode .com/res/hashnode/image/upload/v1561205823453/R5t8rUG_s.jpeg)
Middle Proxy 最大的问题是,单点故障。如果中间代理服务器宕机,则客户端服务无法访问后端服务。
在这种类型的代理中,不是中央负载均衡器,而是由客户端自己完成的负载均衡。这种系统可以通过使用 gRPC 库来实现。
日益复杂的复杂性成为此类负载平衡器的一个问题。此外,开发人员需要为每个服务安装负载平衡组件。
边车代理
[](https://res.cloudinary.com/practicaldev/image/fetch/s--u0h8sOTI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https:// cdn.hashnode.com/res/hashnode/image/upload/v156121903166/SeuzlneW7.jpeg)
Embedded Client Library 最大的问题是为每个服务构建通信组件的复杂性。随着最近使用容器技术的趋势,客户端库分离到容器中。因此,在开发去中心化负载均衡器时没有锁定编程语言。这被称为边车。这种类型的代理服务实现称为 Service Mesh。 Side Car 负责将客户端请求路由到适当的后端服务。
Envoy 是 Lyft 用 C++ 语言编写的高性能反向代理。 Envoy 用于互连 Service Mesh 中的服务。以下是 Envoy 代理使用的常用术语。
-
主机:能够进行网络通信的实体。
-
下游:向特使代理发送请求的主机。
-
上游:从特使代理接收请求的主机。
-
侦听器:命名的网络位置,可以通过下游连接到特使代理。
-
集群:集群是 Envoy 可以连接的一组逻辑上相同的上游主机。 Envoy 可以使用服务发现来发现集群。
前特使代理
来自 Side Car 代理的 Aport,Envoy 也可以配置为 Front envoy 代理。前端代理配置为来自公共 Internet 的请求的主要负载均衡器。这个代理也知道和边缘代理。 Service Mesh 的整体架构如下所示。
[](https://res.cloudinary.com/practicaldev/image/fetch/s--Lq34Qk0d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://cdn.hashnode .com/res/hashnode/image/upload/v1561216275915/eEMY3ilcZ.jpeg)
在这里,前端代理用作传入 Internet 流量的负载平衡器。这里也执行 TLS 终止。然后通过侧车代理请求路由到相关服务。服务网格可以通过服务发现来检测可用服务。它还提供电路制动功能来处理故障转移。总的来说,Envoy 提供了一大堆功能来实现服务网格。
Envoy 代理中的负载均衡器类型
当代理需要获取与上游集群中主机的连接时,集群管理器使用以下策略来路由流量。
- 循环赛
将负载路由到每个工作节点(上游主机)循环顺序。所有工作节点都认为是相同的,并且所有节点都获得相同的负载量。
- 随机
随机选择工作节点并路由流量。众所周知,这比 Round Robbin 策略执行得更好。
- 加权最小请求
此策略基于负载平衡时保持的连接数。假设有两个具有相同规格的工作节点。由于某种原因,第一个工作节点需要更长的时间来响应。因此,它还必须保持与第一个工作节点的连接比第二个节点更长。在这种情况下,负载均衡器可以将更多权重放在第二个工作节点上,而不是将流量发送到第一个节点。
- 原始目的地
当给定的连接需要连接到某个特定的上游主机时,使用这种类型的负载平衡器。通过读取客户端的元数据选择的主机。
除了负载均衡,Envoy 还提供了以下特性来实现 Service Mesh。
-
动态服务发现
-
TLS 终止
-
HTTP/2 和 gRPC 代理
-
断路器
-
健康检查
-
分阶段部署,基于百分比的流量拆分
-
故障注入
-
丰富的指标
我们将在下一篇文章中介绍这些功能中的每一个。这篇文章主要是给大家介绍一下 Envoy Proxy 以及它是如何做负载均衡的。在另一篇文章中见。干杯:)
参考
-
https://devform.netlify.com/introduction-to-envoy-proxy-load-balancing/
-
https://www.envoyproxy.io/docs/envoy/v1.5.0/intro/arch_overview/load_balancing
-
https://www.jscape.com/blog/load-balancing-algorithms
-
https://blog.envoyproxy.io/introduction-to-modern-network-load-balancing-and-proxying-a57f6ff80236