负载均衡是 devops 工程师的常用术语。当大量流量进入您的系统时,您需要找到一种方法来扩展系统,以便它能够正确处理它。一种解决方案是提高正在运行的单个节点的性能。另一种解决方案是添加更多节点并在这些节点之间分配工作。拥有多个节点还有另一个附加优势是高可用性。负载均衡器用于在工作节点之间分配流量。

Envoy 代理是一种代理服务,用于被称为服务网格的最新趋势概念。我们将在这篇博文中看到 Envoy 代理的负载平衡方面。

负载均衡器

[loadbalancer.jpg](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 用户流式传输内部内容。

  • 允许服务器之间的负载平衡。

  • 禁用对站点的访问。

负载均衡拓扑

代理位于客户端和后端端点之间。负载均衡根据代理服务放置的位置可以分为以下几种拓扑。

中间代理

[中间proxy.jpg](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)

所有客户端请求都进入中间代理。中间代理路由请求进入工作节点。这种类型的负载均衡器简单明了。

嵌入式客户端库

[embeddedlibrary.jpg](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 库来实现。

日益复杂的复杂性成为此类负载平衡器的一个问题。此外,开发人员需要为每个服务安装负载平衡组件。

边车代理

[嵌入式库 (1).jpg](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 的整体架构如下所示。

[proxymesh.jpg](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