如何在Kubernetes中使用Envoy作为负载均衡器

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Kubernetes中使用Envoy作为负载均衡器相关的知识,希望对你有一定的参考价值。

参考技术A 在如今高度分布式的世界中,单主机架构越来越多地被多个更小的微服务架构所取代(无论好坏),代理和负载均衡技术似乎有了复兴。除之前经典技术了之外,近年来还出现了几种新的代理技术,这些技术以各种技术实现,通过不同的功能推广自己,例如轻松集成到某些云提供商(“云原生”),高性能和低内存占用,或动态配置。
可以说两种最流行的“经典”代理技术是 nginx (C)和 HAProxy (C),而其中包含的一些新生力量是 Zuul (Java), Linkerd (Rust), Traefik (Go), Caddy (Go)和 Envoy (C ++)。
所有这些技术都具有不同的功能集,并且针对某些特定方案或托管环境(例如,Linkerd经过微调以便在Kubernetes中使用)。
在这篇文章中,我不打算对这些进行比较,而只关注一个特定的场景:如何使用Envoy作为Kubernetes中运行的服务的负载均衡器。
Envoy 是一个“高性能C ++分布式代理”,最初在Lyft实现,但从那时起就获得了广泛采用。它性能高,资源占用少,支持“控制平面”API管理的动态配置,并提供一些高级功能,如各种负载平衡算法,速率限制,熔断和镜像。
出于多种原因,我选择Envoy作为负载均衡器代理。

在开始使用Envoy之前,我通过service类型的对象访问Kubernetes中的服务LoadBalancer,这是从Kubernetes外部访问服务的一种非常典型的方式。负载均衡器服务的确切工作方式取决于托管环境。 如果它首先支持它。我使用的是Google Kubernetes Engine,其中每个负载均衡器服务都映射到TCP级别的Google Cloud负载均衡器,该负载均衡器仅支持 轮询round_robin 算法。

在Kubernetes中有一种称为 Headless Service 的特定服务,恰好与Envoy的 STRICT_DNS 服务发现模式一起使用非常方便。

Headless Service不提供单个IP和负载平衡到底层pod,而是它只有DNS配置,它为我们提供A记录,其中包含与标签选择器匹配的所有pod的pod的IP地址。
此服务类型旨在用于我们希望实现负载平衡以及自己维护与上游pod的连接的场景,这正是我们可以使用Envoy执行的操作。
我们可以通过设置 .spec.clusterIP 字段来创建Headless Service "None" 。因此,假设我们的应用程序pod具有app标签myapp,我们可以使用以下yaml创建Headless Service。

myapp运行情况

现在,如果我们检查Kubernetes集群内的服务的DNS记录,我们将看到具有IP地址的单独A记录。如果我们有3个pod,我们会看到类似于此的DNS摘要。

Envoy的 STRICT_DNS 的服务发现工作原理是,它维护的DNS服务器返回的所有A记录的IP地址,并每两秒钟刷新组IP地址。

在不提供动态API形式的控制平面的情况下使用Envoy的最简单方法是将硬编码配置添加到静态yaml文件中。
以下是对域名 myapp 给出的IP地址进行负载均衡的基本配置。

应用此yaml后,Envoy代理应该可以运行,您可以通过将请求发送到Envoy服务的主端口来访问底层服务。

在此示例中,我仅添加了ClusterIP类型的服务,但如果要从群集外部访问代理,还可以使用LoadBalancer服务或Ingress对象。

在Envoy配置文件中,您可以看到 admin 部分,它配置Envoy的管理端点。这可用于检查有关代理的各种诊断信息。
一些有用的节点:

参考文档:
https://jimmysong.io/posts/envoy-archiecture-and-terminology/
https://blog.markvincze.com/how-to-use-envoy-as-a-load-balancer-in-kubernetes/
https://kubernetes.io/docs/concepts/services-networking/ingress/

ASP.NET Core 搭载 Envoy 实现微服务的负载均衡


如果说,我们一定要找出一个词来形容这纷繁复杂的世界,我希望它会是熵。有人说,熵增定律是宇宙中最绝望的定律, 所谓熵,即是指事物混乱或者无序的程度。在一个孤立系统下,熵是不断在增加的,当熵达到最大值时,系统就会出现严重混乱,直至最终走向死亡。从某种意义上来讲,它揭示了事物结构衰退的必然性,甚至于我们的人生,本来就是一场对抗熵增的旅程。熵增的不可逆性,正如时光无法倒流一般,古人说,“覆水难收”正是这个道理。同样地,当我们开始讨论微服务的划分/编写/治理的时候,当我们使用服务网格来定义微服务架构的时候……我们是否有意或者无意的增加了系统中的熵呢?**一个孤立的系统尚且会因为熵增而最终走向死亡,更何况是相互影响和制约的复杂系统呢?**现代互联网企业都在追求4个9(即99.99%)的高可用,这意味着年平均停机时长只有52.56分钟。在此之前。我们介绍过重试和熔断这两种故障转移的策略,而今天我们来介绍一种更朴素的策略:负载均衡。

什么是负载均衡

负载均衡,即Load Banlancing,是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其它资源中分配负载,以达

以上是关于如何在Kubernetes中使用Envoy作为负载均衡器的主要内容,如果未能解决你的问题,请参考以下文章

Envoy如何打败Linkerd成为L7负载平衡器的最佳选择?

使用Istio和Envoy实践服务网格gRPC度量

使用 istio 后如何获取客户端真实 IP

Envoy的负载均衡与限流设计

【K8s 精选】CKA - 管理高可用性 Kubernetes 集群

ASP.NET Core 搭载 Envoy 实现微服务的负载均衡