vlambda博客
学习文章列表

开干,开源 k8s 负载均衡器大比拼



原文链接:https://ewhisper.cn/posts/29610/

🧠 译者声明:

  1. 请注意文章发布时间,时间比较久远,部分观点可能已经过时。
  2. 原文作者为 PureLB 的利益相关者,所以本文可能不尽客观。

词汇表

英文 中文 备注
LoadBalancer 负载均衡器 本文指 Kubernetes LoadBalancer
Allocator (controller) 分配器(控制器) MetalLB/PureLB 专有词汇
speaker 发言人 MetalLB 专有词汇
post failure 陈旧 MetalLB 专有词汇
Service Groups 服务组 PureLB 专有词汇

比较开源的 k8s 负载均衡器(LoadBalancer)

在这篇文章中,我们讨论了三个开源的负载平衡器控制器,它们可以与任何 Kubernetes 的发行版一起使用。

  • MetalLB. [1] 流行的和最知名的 LoabBalancer Controller
  • PureLB. [2] 最新加入的。(完全公开,我参与了 PureLB 的开发)
  • OpenELB [3](之前叫:Porter). 一个相对较近的新增项目,最初只关注路由的问题

添加一个实现服务类型 LoadBalancer 功能的控制器是简单、可扩展的集群操作所必需的关键网络组件。

  • 启用对集群服务 / 应用的受控外部访问
  • 外部资源是预先配置的
  • 易于与自动化工作流程(CI/CD)整合

第一点是显而易见的,但是后两点在为你的集群设计负载均衡器解决方案时同样关键。根据部署模式的不同,负责确保集群可靠网络的团队与运行集群的团队不同是很常见的。预配置允许网络团队帮助完成设置,并将操作留给集群团队。这有利于与 CI/CD 的轻松集成,因为使用负载平衡器资源现在是标准的 k8s " 应用 " 定义和工作流程的一部分。

这些独立的负载均衡器可以在任何 k8s 环境中运行,而不像公有云中使用的集成负载均衡器或 K3s 中的 Klipper 等特定实施捆绑解决方案。


MetalLB PureLB OpenELB(Porter)
IPAM 内置的 内置的 & 外部的 内置的
使用 Linux 网络子系统 no yes no
本地地址 yes yes 未完成
路由地址 yes yes yes
支持的协议 BGP any (BGP,OSPF,ISIS,RIP) 部分 BGP
IPv4 & IPv6 no yes no
与路由类的 CNI 整合 困难 容易 有可能
使用 CRD 配置 no yes yes
冗余和故障转移

分配地址

一般来说,有两种主要的操作类型。

向本地接口添加地址

将地址添加到路由器上进行分配

服务流量策略

开放源码

所有这些负载均衡器控制器都是开源的,因此文档覆盖面也不一样。在许多情况下,要了解详细的操作,阅读源代码是必要的。

MetalLB

第一个被广泛部署的 LoadBalancer 是作为 Google 的一个 10% 的项目开始的,直到最近都是寻求开源软件的负载平衡解决方案的团队的唯一选择。它以两种不同的模式运行,即 L2 模式和 BGP 模式。

MetalLB 是通过 configmap 来配置的。

该控制器由两个部分组成。

  • 控制器。分配 IP 地址。每个集群有一个
  • 发言人 (speaker)。配置节点网络。在所有节点上运行,提供对 IP 地址的访问

分配器(控制器)

控制器的行为是一致的,发言人实现了两种操作模式。在 MetalLB 中,这些模式在 configmap 池中被配置为 “协议”。

L2 Mode

我使用了回答这个词,因为在 "L2 " 中,发言人进程实现了 ARP 和 ND。Kube-proxy 已经添加了必要的配置,将流量转发到目标 POD,ARP/ND 响应仍然是启动通信的必要条件。

在 L2 模式下,MetalLB 不使用 Linux 网络来回答 ARP/ND,处理是在发言人的 POD 可执行文件中实现的。因此它的 ARP/ND 处理对 Linux 及其网络工具来说是不可见的。识别哪个节点在回答 ARP/ND 请求,需要在其他网络主机上使用 APR/ND 工具,或者检查发言人 POD 的日志。

BGP Mode

MetalLB 也在 BGP 模式下运行。BGP 提供了一种机制,将前缀(addr/mask)公布给邻近的路由器。使用路由的机制是利用 Linux 的第三层转发与路由协议相结合来提供目的地信息。

configmap 配置了 BGP 自治系统信息、对等体信息和池,由协议 bgp 标识。

发言人在每个节点上作为 daemonset 运行,从每个节点到配置的对等路由器建立 BGP 对等连接。AS 号码标识对等体为外部或内部。

MetalLB 有自己的 BGP 实现。这很重要,原因有三。

  1. MetalLB 使用节点的 IP 地址,是一个路由器。这意味着在默认网络命名空间中运行的另一个进程,如软件路由器,不能使用该主机地址与同一路由器对等。在较大的网络中,这可能导致非常复杂的 BGP 配置。
  2. BGP 功能没有办法与 Linux 路由表整合,只能用于宣传 MetalLB 创建的前缀。
  3. BGP 功能受限于 MetalLB 的支持水平,其他软件路由器中的功能需要专门为 MetalLB 开发。MetalLB 有一些额外的 BGP 功能,如聚合和社区支持,但没有被认为在标准路由器中必须的功能。

这两种模式都可以同时使用,每种模式都需要特定的配置。

流量策略

MetalLB 支持这种设置,但是在 L2 模式下将 externalTrafficPolicy 设置为 local 可能会导致丢包,不应使用。在 BGP 模式下,只有有 POD 的节点才会被公布。流量将在运行 POD 的节点之间平均分配,但每个节点都将收到相同的份额,而不考虑该节点上的 pod 数量。

配置

MetalLB 是使用 configmaps 来配置的。在最初开发时,这是用于配置的主要机制,现在许多控制器仍然使用。configmaps 的问题是,在应用 POD 读取配置之前,没有办法验证它。因此,不正确的配置会导致 POD 失败或不正确的操作," 失败后 " 只能通过查看个别 POD 的日志来调试 。

MetalLB 的文档很充分,但很稀少。要了解它的运作方式,有必要阅读源代码。

IPv6

MetalLB 总结

MetalLB 不使用原生的 Linux 网络,因此很难使用标准的 Linux 工具进行故障排除。它有自己独特的 BGP 实现,缺乏用于管理大规模 BGP 基础设施的功能。增加这些功能需要 BGP 协议的开发,虽然有可能,但要使 BGP 实现的功能齐全需要大量的开发工作。因为它是一个 BGP 路由器,使用 BGP for CNI 的节点不能同时将 BGP for CNI 和 BGP 从 MetalLB 对接到同一个上游路由器。有一些拓扑结构的解决办法,但它们给路由基础设施增加了很大的复杂性。

PureLB

PureLB 是使用自定义资源(CRD)配置的。

该控制器由两部分组成。

  • 分配器。分配 IP 地址。每个集群有一个
  • lbnodeagent . 配置节点网络。在所有节点上运行,提供对 IP 地址的访问。

分配器

本地网络地址

虚拟网络地址

路由协议

当 CNI 没有被配置为使用隧道和 POD 网络跨越多个子网时,就需要路由协议。在某些情况下,CNI 的包括路由功能作为其操作的一部分。在这些情况下,PureLB 可以避免因试图在同一节点上运行两个路由实例而引起的问题。CNI 的路由过程只是重新分配来自虚拟接口的路由,并应用任何必要的路由策略,创造一个更简单、更自然的路由拓扑结构。

流量策略

配置

随着 PureLB 的运行,它向提供负载平衡服务的服务添加注释,以及更新服务事件日志,因此可以从服务中提取关键服务信息和状态,而不需要检查 POD 日志。

IPv6

总结

这款新产品通过提供外部 IPAM、IPv6,更重要的是利用 Linux 网络,使自己与众不同。PureLB 没有试图重新发明网络和路由协议,而是能够使用所有的 Linux 和路由功能。在复杂的基础设施中,PureLB 更容易实现,因为在这些基础设施中,路由需要其他方面的可达性,如 CNI、存储或管理网络,并且已经在集群中存在。检查代码可以看出 PureLB 与分叉出来的 MetalLB 版本有多大区别,其简单性表现在它的代码行数只有一半左右。

OpenELB(Porter)

Porter 是使用自定义资源配置的。

该控制器由两部分组成。

  • porter-manager。分配地址和配置网络功能。
  • porter-agent。收集节点的具体信息,由 porter-manager 用来配置网络。

分配器

Porter 把网络配置集中在 porter-manager 中,porter-agent 只是收集事件,添加节点的具体信息,并把这些信息返回给 porter-manager。

L2

最后,继续运行取决于 porter-manager,porter-manager 使用标准的 k8s POD 故障检测机制,因此 porter-manager 可能需要大量的时间来重新启动,影响到新的和现有的服务,因为它们将没有 ARP 响应。

BGP

Porter 使用 gobgp 实现了 BGP,但是它实现了 gobgp 功能的一个非常小的子集。Porter BGP 的实现只具有与本地网段的路由器对等的必要功能。

Porter 从 porter-manager 节点为集群建立单个 BGP 对等体。BGP 对等体必须是在本地网段上,因为不可能配置 BGP 多跳。

另外,Porter 声称支持 AddPath,这是一个为单一路由添加多个并发路径的机制。这个功能的使用似乎有些混乱,从 MetalLB 的一个帖子开始,建议这可能是一种机制,以更好地平衡流量分配到有多个 POD 的节点上。这不是 addpath 的目的,它被用来提供路由表的稳定性,在这种情况下,多个路径通常会被汇总。如果他们的实施方案使用 addpath 来为同一个节点增加更多的 ECMP 下一跳,这可能是某一特定厂商的行为。不管怎么说,大多数 BGP 实现都会显示 addpath 计数,我们没有看到 porter-manager 在上游路由器上更新这些计数以反映节点上的 POD 数量。

BGP 进程作为 porter-manager 的一部分运行,因此 porter manager 的故障会导致上游路由器的对等体宕机,软件路由器将撤回它从 porter 学到的所有路由。

流量策略

配置

在讨论配置问题时,Porter 的文档非常有限。它可以从文档中安装和配置,然而,如果你的评估需要你弄清楚它是如何工作的,请准备阅读 golang 代码。

IPv6

Porter 没有对 IPv6 的支持。扫描代码时没有发现有任何 IPv6 支持。

总结

构建这些负载平衡器协调器并不容易!K8s 网络与主机和路由协议的结合需要大量的知识和技能。因此,我赞扬开发者的工作。

引用链接

[1]

MetalLB.: https://metallb.universe.tf/

[2]

PureLB.: https://purelb.gitlab.io/docs/

[3]

OpenELB: https://github.com/kubesphere/openelb

开干,开源 k8s 负载均衡器大比拼

开干,开源 k8s 负载均衡器大比拼

你可能还喜欢

深入理解 netfilter 和 iptables!

开干,开源 k8s 负载均衡器大比拼

云原生是一种信仰 🤘

后台回复◉k8s◉获取史上最方便快捷的 Kubernetes 高可用部署工具,只需一条命令,连 ssh 都不需要!



开干,开源 k8s 负载均衡器大比拼

点击 "阅读原文" 获取更好的阅读体验!