第 23 章 使用 MetalLB 进行负载平衡
23.1. 关于 MetalLB 和 MetalLB Operator
作为集群管理员,您可以在集群中添加 MetalLB Operator,以便在集群中添加类型为 LoadBalancer
的服务时,MetalLB 可以为该服务添加容错外部 IP 地址。外部 IP 地址添加到集群的主机网络中。
23.1.1. 何时使用 MetalLB
当您有裸机集群或类似裸机的基础架构时,使用 MetalLB 有价值,并且您希望通过外部 IP 地址对应用程序进行容错访问。
您必须配置网络基础架构,以确保外部 IP 地址的网络流量从客户端路由到集群的主机网络。
使用 MetalLB Operator 部署 MetalLB 后,当添加类型为 LoadBalancer
的服务时,MetalLB 提供了一个平台原生负载均衡器。
23.1.2. MetalLB Operator 自定义资源
MetalLB Operator 监控其自己的命名空间以获取两个自定义资源:
MetalLB
-
当您在集群中添加
MetalLB
自定义资源时,MetalLB Operator 会在集群中部署 MetalLB。Operator 只支持单个自定义资源实例。如果删除了实例,Operator 会从集群中删除 MetalLB。 AddressPool
-
MetalLB 需要一个或多个 IP 地址池,您可以在添加类型为
LoadBalancer
的服务时分配给服务。当您在集群中添加AddressPool
自定义资源时,MetalLB Operator 会配置 MetalLB,以便它能够从池中分配 IP 地址。地址池包含 IP 地址列表。列表可以是使用范围设置的单个 IP 地址,如 1.1.1.1-1.1.1.1、以 CIDR 表示法指定的范围、指定为起始和结束地址的范围,或者以连字符分隔的、两者的组合。地址池需要名称。文档使用doc-example
、doc-example-reserved
和doc-example-ipv6
等名称。地址池指定 MetalLB 是否可以自动从池中分配 IP 地址,或者是否为按名称显式指定池的服务保留 IP 地址。
将 MetalLB
自定义资源添加到集群后,Operator 将部署 MetalLB、MetalLB 软件组件、controller
和 speaker
。
23.1.3. MetalLB 软件组件
安装 MetalLB Operator 时,metallb-operator-controller-manager
部署会启动一个 pod。pod 是 Operator 的实施。pod 监控 MetalLB
自定义资源和 AddressPool
自定义资源的更改。
当 Operator 启动 MetalLB 实例时,它会启动一个 controller
部署和一个 speaker
守护进程集。
controller
Operator 会启动部署和单个 pod。当您添加类型为
LoadBalancer
的服务时,Kubernetes 使用controller
从地址池中分配 IP 地址。如果服务失败,请验证controller
pod 日志中有以下条目:输出示例
"event":"ipAllocated","ip":"172.22.0.201","msg":"IP address assigned by controller
speaker
Operator 会为集群中的每个节点启动一个带有一个
speaker
pod 的守护进程集。如果controller
为服务分配了 IP 地址,并且服务仍不可用,请阅读speaker
pod 日志。如果speaker
pod 不可用,请运行oc describe pod -n
命令。对于第 2 层模式,在
controller
为服务分配 IP 地址后,每个speaker
Pod 决定它是否与服务的端点位于同一个节点上。涉及对节点名称和服务名称进行哈希的算法用于选择一个speaker
Pod 来宣布负载均衡器 IP 地址。speaker
使用地址解析协议 (ARP) 来宣布 IPv4 地址和邻居发现协议 (NDP) 来宣布 IPv6 地址。对负载均衡器 IP 地址的请求会路由到具有声明 IP 地址的
speaker
的节点。节点接收数据包后,服务代理会将数据包路由到该服务的端点。在最佳情况下,端点可以位于同一节点上,也可以位于另一节点上。每次建立连接时,服务代理都会选择一个端点。
23.1.4. 第 2 层模式的 MetalLB 概念
在第 2 层模式中,一个节点上的 speaker
pod 向主机网络宣布服务的外部 IP 地址。从网络的角度来看,节点似乎有多个 IP 地址分配给网络接口。
由于第 2 层模式依赖于 ARP 和 NDP,客户端必须位于没有中断服务的节点所在的同一子网,以便 MetalLB 正常工作。另外,分配给该服务的 IP 地址必须在客户端用来访问该服务的网络所在的同一子网中。
speaker
pod 响应 IPv4 服务和 IPv6 的 NDP 请求。
在第 2 层模式中,服务 IP 地址的所有流量都通过一个节点进行路由。在流量进入节点后,CNI 网络供应商的服务代理会将流量分发到该服务的所有 pod。
由于服务的所有流量都通过第 2 层模式中的单一节点进入,所以严格意义上,MetalLB 不会为第 2 层实施负载平衡器。相反,MetalLB 为第 2 层实施故障转移机制,以便在 speaker
pod 不可用时,不同节点上的 speaker
pod 可以宣布服务 IP 地址。
当节点不可用时,自动故障转移。其他节点上的 speaker
pod 检测到节点不可用,新的 speaker
pod 和节点从故障节点上拥有服务 IP 地址的所有权。
上图显示了与 MetalLB 相关的以下概念:
-
应用程序可以通过在
172.130.0.0/16
子网上具有集群 IP 的服务获取。该 IP 地址可以从集群内部访问。服务也有一个外部 IP 地址,用于分配给服务的 MetalLB,即192.168.100.200
。 - 节点 1 和 3 具有应用程序的 pod。
-
speaker
守护进程集在每个节点上运行一个 pod。MetalLB Operator 启动这些 pod。 -
每个
speaker
pod 都是主机网络的 pod。容器集的 IP 地址与主机网络上节点的 IP 地址相同。 -
节点 1 上的
speaker
pod 使用 ARP 声明服务的外部 IP 地址192.168.100.200
。声明外部 IP 地址的speaker
pod 必须与服务的端点位于同一个节点上,端点必须为Ready
条件。 -
客户端流量路由到主机网络,并连接到
192.168.100.200
IP 地址。在流量进入节点后,服务代理会根据您为服务设置的外部流量策略,将流量发送到同一节点上的应用 pod 或其他节点。 -
如果节点 1 不可用,则外部 IP 地址将故障转移到另一节点。在具有应用 pod 和服务端点实例的另一个节点上,
speaker
Pod 开始宣布外部 IP 地址192.168.100.200
,新节点接收客户端流量。在图中,唯一的候选项是节点 3。
23.1.4.1. 第 2 层和外部流量策略
使用第 2 层模式时,集群中的一个节点会接收服务 IP 地址的所有流量。集群在进入节点后如何处理流量受外部流量策略的影响。
cluster
这是
spec.externalTrafficPolicy
的默认值。使用
cluster
流量策略时,节点接收流量后,服务代理会将流量分发到服务中的所有容器集。此策略在 pod 之间提供统一流量分布,但它会模糊客户端 IP 地址,并可能会在 pod 中显示流量源自节点而不是客户端的应用。local
采用
local
流量策略时,节点接收流量后,服务代理仅将流量发送到同一节点上的 pod。例如,如果节点上的speaker
pod 宣布外部服务 IP,则所有流量都发送到节点 A。流量进入节点 A 后,服务代理仅将流量发送到节点 A 上的服务的 pod。位于其他节点上的服务的 Pod 不会从节点 A 接收任何流量。在需要故障转移时,其他节点上的服务的 Pod 充当副本。此策略不会影响客户端 IP 地址。应用容器集可以确定来自传入连接的客户端 IP 地址。
23.1.5. 限制和限制
23.1.5.1. 只支持第 2 层
当您使用 MetalLB Operator 在 OpenShift Container Platform 4.9 上安装并配置 MetalLB 时,支持仅限于第 2 层模式。相比之下,开源 MetalLB 项目提供第 2 层模式的负载平衡,以及使用边框网关协议 (BGP) 的第 3 层模式的负载平衡。
23.1.5.2. 支持单堆栈网络
虽然您可以在同一个地址池中指定 IPv4 地址和 IPv6 地址,但 MetalLB 仅为负载均衡器分配一个 IP 地址。
当将 MetalLB 部署到为双栈网络配置的集群中时,MetalLB 会为负载均衡器分配一个 IPv4 或 IPv6 地址,具体取决于该服务的集群 IP 的 IP 地址系列。例如,如果服务的集群 IP 是 IPv4,则 MetalLB 为负载均衡器分配一个 IPv4 地址。MetalLB 不同时分配 IPv4 和 IPv6 地址。
IPv6 仅支持使用 OVN-Kubernetes 网络供应商的集群。
23.1.5.3. MetalLB 的基础架构注意事项
MetalLB 主要用于内部的裸机安装,因为这些安装不包含原生负载平衡器功能。除了裸机安装外,在有些基础架构上安装 OpenShift Container Platform 可能不包括原生负载均衡器功能。例如,以下基础架构可从添加 MetalLB Operator 中受益:
- 裸机
- VMware vSphere
OpenShift SDN 和 OVN-Kubernetes 网络供应商支持 MetalLB 和 MetalLB。
23.1.5.4. 第 2 层模式的限制
23.1.5.4.1. 单节点瓶颈
MetalLB 通过单一节点路由服务的所有流量,该节点可能会成为瓶颈并限制性能。
第 2 层模式将服务的入口带宽限制为单个节点的带宽。这是使用 ARP 和 NDP 定向流量的一个根本限制。
23.1.5.4.2. 延迟故障转移性能
节点之间的故障转移取决于客户端的合作。发生故障转移时,MetalLB 发送粒度 ARP 数据包来通知客户端与服务 IP 关联的 MAC 地址已更改。
大多数客户端操作系统正确处理细粒度 ARP 数据包,并及时更新其邻居缓存。当客户端快速更新其缓存时,故障转移将在几秒钟内完成。客户端通常在 10 秒内故障转移到新节点。但是,一些客户端操作系统或者根本不处理饱和的 ARP 数据包,或者存在延迟缓存更新的过时实施。
Windows、macOS 和 Linux 等常见操作系统的最新版本正确实现了第 2 层故障转移。除了较旧和不太常见的客户端操作系统外,预计不会出现故障转移较慢的问题。
为最大程度减轻计划内故障转移对过时客户端的影响,在颠倒领导地位后让旧节点保持运行几分钟。旧节点可以继续转发过期客户端的流量,直到其缓存刷新。
在计划外故障转移期间,服务 IP 无法访问,直到过期的客户端刷新其缓存条目为止。
23.1.5.5. 与 IP 故障切换不兼容
MetalLB 与 IP 故障转移功能不兼容。在安装 MetalLB Operator 前,删除 IP 故障切换。