×

作为集群管理员,您可以将 MetalLB 运算符添加到您的集群,以便当类型为 LoadBalancer 的服务添加到集群时,MetalLB 可以为该服务添加一个外部 IP 地址。外部 IP 地址将添加到集群的主机网络。

何时使用 MetalLB

当您拥有一个裸机集群或类似于裸机的基础设施,并且希望通过外部 IP 地址获得对应用程序的容错访问时,使用 MetalLB 非常有价值。

您必须配置您的网络基础设施,以确保外部 IP 地址的网络流量从客户端路由到集群的主机网络。

在使用 MetalLB 运算符部署 MetalLB 后,当您添加类型为 LoadBalancer 的服务时,MetalLB 将提供一个平台原生的负载均衡器。

当外部流量通过 MetalLB LoadBalancer 服务进入您的 OpenShift Container Platform 集群时,返回到客户端的流量将使用负载均衡器的外部 IP 地址作为源 IP。

在 2 层模式下运行的 MetalLB 通过使用类似于 IP 故障转移的机制来提供故障转移支持。但是,MetalLB 不依赖于虚拟路由器冗余协议 (VRRP) 和 keepalived,而是利用基于八卦的协议来识别节点故障实例。当检测到故障转移时,另一个节点将承担领导节点的角色,并发送 gratuitous ARP 消息来广播此更改。

在三层模式或边界网关协议 (BGP) 模式下运行的 MetalLB 将故障检测委托给网络。OpenShift Container Platform 节点已与其建立连接的 BGP 路由器(或路由器)将识别任何节点故障并终止到该节点的路由。

为了确保 Pod 和服务的可用性,最好使用 MetalLB 来代替 IP 故障转移。

MetalLB 运算符自定义资源

MetalLB 运算符监控其自身命名空间中的以下自定义资源

MetalLB

当您向集群添加MetalLB自定义资源时,MetalLB 运算符会在集群上部署 MetalLB。运算符仅支持单个自定义资源实例。如果删除该实例,运算符将从集群中删除 MetalLB。

IPAddressPool

当您添加类型为LoadBalancer的服务时,MetalLB 需要一个或多个 IP 地址池,以便可以将其分配给该服务。一个IPAddressPool包含一个 IP 地址列表。该列表可以是一个使用范围设置的单个 IP 地址(例如 1.1.1.1-1.1.1.1),一个用 CIDR 表示法指定的范围,一个用连字符分隔的起始和结束地址指定的范围,或者这三种的组合。一个IPAddressPool需要一个名称。文档中使用的名称例如doc-exampledoc-example-reserveddoc-example-ipv6。MetalLB controllerIPAddressPool中的地址池分配 IP 地址。L2AdvertisementBGPAdvertisement自定义资源启用从给定池中宣传给定 IP。您可以通过使用IPAddressPool自定义资源中的spec.serviceAllocation规范将IPAddressPool中的 IP 地址分配给服务和命名空间。

单个IPAddressPool可以被 L2 广告和 BGP 广告引用。

BGPPeer

BGP 对等体自定义资源标识 MetalLB 要与其通信的 BGP 路由器、路由器的 AS 号、MetalLB 的 AS 号以及路由宣传的自定义设置。MetalLB 将服务负载均衡器 IP 地址的路由宣传给一个或多个 BGP 对等体。

BFDProfile

BFD 配置文件自定义资源配置 BGP 对等体的双向转发检测 (BFD)。BFD 提供比 BGP 单独提供的更快的路径故障检测。

L2Advertisement

L2Advertisement 自定义资源使用 L2 协议宣传来自IPAddressPool的 IP。

BGPAdvertisement

BGPAdvertisement 自定义资源使用 BGP 协议宣传来自IPAddressPool的 IP。

在您向集群添加MetalLB自定义资源并运算符部署 MetalLB 后,controllerspeaker MetalLB 软件组件将开始运行。

MetalLB 验证所有相关的自定义资源。

MetalLB 软件组件

安装 MetalLB 运算符时,metallb-operator-controller-manager部署将启动一个 Pod。该 Pod 是运算符的实现。该 Pod 监控所有相关资源的变化。

当运算符启动 MetalLB 实例时,它会启动一个controller部署和一个speaker守护程序集。

您可以在 MetalLB 自定义资源中配置部署规范,以管理controllerspeaker Pod 在集群中的部署和运行方式。有关这些部署规范的更多信息,请参见“其他资源”部分。

controller

运算符启动部署和单个 Pod。当您添加类型为LoadBalancer的服务时,Kubernetes 使用controller从地址池分配 IP 地址。如果服务发生故障,请验证您的controller Pod 日志中是否包含以下条目

示例输出
"event":"ipAllocated","ip":"172.22.0.201","msg":"IP address assigned by controller
speaker

运算符为speaker Pod 启动一个守护程序集。默认情况下,会在集群中的每个节点上启动一个 Pod。您可以通过在启动 MetalLB 时在MetalLB自定义资源中指定节点选择器来将 Pod 限制到特定节点。如果controller已将 IP 地址分配给服务,但服务仍不可用,请阅读speaker Pod 日志。如果speaker Pod 不可访问,请运行oc describe pod -n命令。

对于 2 层模式,在controller为服务分配 IP 地址后,speaker Pod 将使用一种算法来确定集群中哪个节点上的哪个speaker Pod 将宣布负载均衡器 IP 地址。该算法涉及对节点名称和负载均衡器 IP 地址进行哈希处理。有关更多信息,请参见“MetalLB 和外部流量策略”。speaker使用地址解析协议 (ARP) 来宣布 IPv4 地址,并使用邻居发现协议 (NDP) 来宣布 IPv6 地址。

对于边界网关协议 (BGP) 模式,在controller为服务分配 IP 地址后,每个speaker Pod 都将其 BGP 对等体宣传负载均衡器 IP 地址。您可以配置哪些节点与 BGP 对等体启动 BGP 会话。

对负载均衡器 IP 地址的请求将路由到具有宣布 IP 地址的speaker的节点。节点收到数据包后,服务代理将数据包路由到服务的端点。在最佳情况下,端点可以在同一节点上,也可以在另一个节点上。每次建立连接时,服务代理都会选择一个端点。

MetalLB 和外部流量策略

在 2 层模式下,集群中的一个节点接收服务 IP 地址的所有流量。在 BGP 模式下,主机网络上的路由器将为新的客户端连接打开到集群中一个节点的连接。集群在流量进入节点后如何处理流量会受到外部流量策略的影响。

cluster

这是spec.externalTrafficPolicy的默认值。

使用cluster流量策略,节点收到流量后,服务代理会将流量分发到服务中的所有 Pod。此策略提供跨 Pod 的统一流量分配,但它会隐藏客户端 IP 地址,并且在您的 Pod 中的应用程序看来,流量似乎源自节点而不是客户端。

local

使用local流量策略,节点收到流量后,服务代理只将流量发送到同一节点上的 Pod。例如,如果节点 A 上的speaker Pod 宣布外部服务 IP,则所有流量都将发送到节点 A。流量进入节点 A 后,服务代理只将流量发送到也在节点 A 上的服务的 Pod。其他节点上的服务 Pod 不会从节点 A 接收任何流量。其他节点上的服务 Pod 在需要故障转移时充当副本。

此策略不会影响客户端 IP 地址。应用程序 Pod 可以从传入连接确定客户端 IP 地址。

在 BGP 模式下配置外部流量策略时,以下信息非常重要。

尽管 MetalLB 从所有合格节点宣传负载均衡器 IP 地址,但服务的负载均衡节点数量可能会受到路由器建立等价多路径 (ECMP) 路由的能力的限制。如果宣传 IP 的节点数大于路由器的 ECMP 组限制,路由器将使用少于宣传 IP 的节点。

例如,如果外部流量策略设置为local,路由器的 ECMP 组限制设置为 16,并且实现 LoadBalancer 服务的 Pod 部署在 30 个节点上,则会导致部署在 14 个节点上的 Pod 不会接收任何流量。在这种情况下,最好将服务的外部流量策略设置为cluster

2 层模式的 MetalLB 概念

在二层模式下,一个节点上的speaker Pod 会向主机网络广播服务的外部 IP 地址。从网络角度来看,该节点似乎有多个 IP 地址分配给一个网络接口。

在二层模式下,MetalLB 依赖于 ARP 和 NDP。这些协议在特定子网内实现本地地址解析。在这种情况下,为了 MetalLB 能够正常工作,客户端必须能够访问 MetalLB 分配的 VIP,该 VIP 必须与广播服务的节点位于同一子网。

speaker Pod 会响应 IPv4 服务的 ARP 请求和 IPv6 的 NDP 请求。

在二层模式下,服务 IP 地址的所有流量都通过一个节点路由。流量进入节点后,CNI 网络提供程序的服务代理会将流量分发到该服务的全部 Pod。

由于在二层模式下,服务的所有流量都通过单个节点进入,因此严格来说,MetalLB 没有实现二层负载均衡器。相反,MetalLB 为二层实现了故障转移机制,以便当speaker Pod不可用时,另一个节点上的speaker Pod可以广播服务 IP 地址。

当节点不可用时,故障转移是自动的。其他节点上的speaker Pod 会检测到节点不可用,然后新的speaker Pod 和节点会从失效的节点接管服务 IP 地址。

Conceptual diagram for MetalLB and layer 2 mode

上图显示了与 MetalLB 相关的以下概念

  • 一个应用程序可以通过一个在172.130.0.0/16子网中具有集群 IP 的服务访问。该 IP 地址可在集群内部访问。该服务还具有 MetalLB 分配给服务的外部 IP 地址192.168.100.200

  • 节点 1 和 3 都有该应用程序的 Pod。

  • speaker DaemonSet 在每个节点上运行一个 Pod。MetalLB Operator 启动这些 Pod。

  • 每个speaker Pod 都是一个主机网络 Pod。Pod 的 IP 地址与主机网络上节点的 IP 地址相同。

  • 节点 1 上的speaker Pod 使用 ARP 广播服务的外部 IP 地址192.168.100.200。广播外部 IP 地址的speaker Pod 必须与服务的端点位于同一节点,并且端点必须处于Ready状态。

  • 客户端流量被路由到主机网络并连接到192.168.100.200 IP 地址。流量进入节点后,服务代理会根据为服务设置的外部流量策略将流量发送到同一节点或另一个节点上的应用程序 Pod。

    • 如果服务的外部流量策略设置为cluster,则从运行speaker Pod 的节点中选择广播192.168.100.200负载均衡器 IP 地址的节点。只有该节点才能接收服务的流量。

    • 如果服务的外部流量策略设置为local,则从运行speaker Pod 的节点(并且至少有一个服务的端点)中选择广播192.168.100.200负载均衡器 IP 地址的节点。只有这些节点才能接收服务的流量。在上图中,节点 1 或 3 都可以广播192.168.100.200

  • 如果节点 1 变得不可用,则外部 IP 地址将故障转移到另一个节点。在具有应用程序 Pod 实例和服务端点的另一个节点上,speaker Pod 开始广播外部 IP 地址192.168.100.200,并且新节点接收客户端流量。在图中,唯一的候选节点是节点 3。

BGP 模式下的 MetalLB 概念

在 BGP 模式下,默认情况下,每个speaker Pod 会向每个 BGP 对等体广播服务的负载均衡器 IP 地址。还可以通过添加可选的 BGP 对等体列表,将来自给定池的 IP 地址广播到特定的一组对等体。BGP 对等体通常是配置为使用 BGP 协议的网络路由器。当路由器接收到负载均衡器 IP 地址的流量时,路由器会选择一个具有广播该 IP 地址的speaker Pod 的节点。路由器将流量发送到该节点。流量进入节点后,CNI 网络插件的服务代理会将流量分发到该服务的全部 Pod。

与集群节点位于同一二层网络段上的直连路由器可以配置为 BGP 对等体。如果未将直连路由器配置为 BGP 对等体,则需要配置网络,以便负载均衡器 IP 地址的数据包在 BGP 对等体和运行speaker Pod 的集群节点之间路由。

每次路由器接收到负载均衡器 IP 地址的新流量时,它都会创建一个与节点的新连接。每个路由器制造商都有一个特定于实现的算法来选择与哪个节点建立连接。但是,这些算法通常旨在跨可用节点分配流量,以平衡网络负载。

如果节点不可用,路由器将与另一个具有广播负载均衡器 IP 地址的speaker Pod 的节点建立新连接。

Speaker pods on host network 10.0.1.0/24 use BGP to advertise the load balancer IP address, 203.0.113.200, to a router.
图 1. BGP 模式的 MetalLB 拓扑图

上图显示了与 MetalLB 相关的以下概念

  • 一个应用程序可以通过一个在172.130.0.0/16子网中具有 IPv4 集群 IP 的服务访问。该 IP 地址可在集群内部访问。该服务还具有 MetalLB 分配给服务的外部 IP 地址203.0.113.200

  • 节点 2 和 3 都有该应用程序的 Pod。

  • speaker DaemonSet 在每个节点上运行一个 Pod。MetalLB Operator 启动这些 Pod。您可以配置 MetalLB 以指定哪些节点运行speaker Pod。

  • 每个speaker Pod 都是一个主机网络 Pod。Pod 的 IP 地址与主机网络上节点的 IP 地址相同。

  • 每个speaker Pod 都与所有 BGP 对等体启动 BGP 会话,并将负载均衡器 IP 地址或聚合路由广播到 BGP 对等体。speaker Pod 宣告它们属于自治系统 65010。该图显示路由器 R1 作为同一自治系统中的 BGP 对等体。但是,您可以配置 MetalLB 以与属于其他自治系统的对等体启动 BGP 会话。

  • 所有具有广播负载均衡器 IP 地址的speaker Pod 的节点都可以接收服务的流量。

    • 如果服务的外部流量策略设置为cluster,则所有运行speaker Pod 的节点都会广播203.0.113.200负载均衡器 IP 地址,并且所有具有speaker Pod 的节点都可以接收服务的流量。主机前缀仅当外部流量策略设置为 cluster 时才被广播到路由器对等体。

    • 如果服务的外部流量策略设置为local,则所有运行speaker Pod 的节点(并且至少有一个服务的端点正在运行)都可以广播203.0.113.200负载均衡器 IP 地址。只有这些节点才能接收服务的流量。在上图中,节点 2 和 3 将广播203.0.113.200

  • 您可以通过在添加 BGP 对等体自定义资源时指定节点选择器来配置 MetalLB,以控制哪些speaker Pod 与特定的 BGP 对等体启动 BGP 会话。

  • 任何配置为使用 BGP 的路由器(例如 R1)都可以设置为 BGP 对等体。

  • 客户端流量被路由到主机网络上的一个节点。流量进入节点后,服务代理会根据为服务设置的外部流量策略将流量发送到同一节点或另一个节点上的应用程序 Pod。

  • 如果某个节点不可用,路由器会检测到故障并与另一个节点建立新的连接。您可以配置 MetalLB 使用双向转发检测 (BFD) 配置文件用于 BGP 对等体。BFD 提供更快的链路故障检测,以便路由器比没有 BFD 时更早地启动新的连接。

限制和约束

MetalLB 的基础设施注意事项

MetalLB 主要适用于本地裸机安装,因为这些安装不包含本机负载均衡器功能。除了裸机安装之外,在某些基础设施上安装 OpenShift Container Platform 也可能不包含本机负载均衡器功能。例如,以下基础设施可以从添加 MetalLB Operator 中受益:

  • 裸机

  • VMware vSphere

  • IBM Z® 和 IBM® LinuxONE

  • 用于 Red Hat Enterprise Linux (RHEL) KVM 的 IBM Z® 和 IBM® LinuxONE

  • IBM Power®

二层模式的限制

单节点瓶颈

MetalLB 将服务的所有流量都通过单个节点路由,该节点可能会成为瓶颈并限制性能。

二层模式将服务的入口带宽限制为单个节点的带宽。这是使用 ARP 和 NDP 指导流量的根本限制。

故障转移性能慢

节点之间的故障转移取决于客户端的配合。发生故障转移时,MetalLB 会发送 gratuitous ARP 数据包来通知客户端与服务 IP 关联的 MAC 地址已更改。

大多数客户端操作系统都能正确处理 gratuitous ARP 数据包并迅速更新其邻居缓存。当客户端快速更新其缓存时,故障转移会在几秒钟内完成。客户端通常会在 10 秒内故障转移到新节点。但是,某些客户端操作系统根本不处理 gratuitous ARP 数据包,或者具有过时的实现,从而延迟缓存更新。

Windows、macOS 和 Linux 等常见操作系统的最新版本正确地实现了二层故障转移。除了较旧和不太常见的客户端操作系统外,预计不会出现故障转移缓慢的问题。

为了最大程度地减少计划的故障转移对过时客户端的影响,在切换领导者后,让旧节点继续运行几分钟。旧节点可以继续为过时客户端转发流量,直到其缓存刷新。

在计划外的故障转移期间,服务 IP 在过时客户端刷新其缓存条目之前是不可访问的。

附加网络和 MetalLB 不能使用相同的网络

如果对源 Pod 设置的 MetalLB 和附加网络接口都使用相同的 VLAN,可能会导致连接失败。当 MetalLB IP 和源 Pod 都位于同一节点上时,就会发生这种情况。

为了避免连接失败,请将 MetalLB IP 放置在与源 Pod 所在的子网不同的子网中。此配置确保来自源 Pod 的流量将使用默认网关。因此,流量可以通过使用 OVN 覆盖网络有效地到达其目的地,确保连接按预期运行。

BGP 模式限制

节点故障可能会中断所有活动连接

MetalLB 共享基于 BGP 的负载均衡的常见限制。当 BGP 会话终止时(例如,节点发生故障或speaker Pod 重启时),会话终止可能会导致重置所有活动连接。最终用户可能会遇到Connection reset by peer 消息。

BGP 会话终止的后果对于每个路由器制造商来说都是特定于实现的。但是,您可以预期speaker Pod 数量的变化会影响 BGP 会话的数量,并且与 BGP 对等体的活动连接将会中断。

为了避免或减少服务中断的可能性,您可以在添加 BGP 对等体时指定节点选择器。通过限制启动 BGP 会话的节点数量,不具有 BGP 会话的节点上的故障不会影响与服务的连接。

仅支持单个 ASN 和单个路由器 ID

添加 BGP 对等体自定义资源时,您需要指定spec.myASN 字段来标识 MetalLB 属于的自治系统编号 (ASN)。OpenShift Container Platform 使用 BGP 的实现与 MetalLB 配合使用,这需要 MetalLB 属于单个 ASN。如果您尝试添加 BGP 对等体并为spec.myASN 指定与现有 BGP 对等体自定义资源不同的值,则会收到错误。

同样,添加 BGP 对等体自定义资源时,spec.routerID 字段是可选的。如果您为该字段指定了值,则必须为添加的所有其他 BGP 对等体自定义资源指定相同的值。

支持单个 ASN 和单个路由器 ID 的限制与社区支持的 MetalLB 实现有所不同。