MetalLB Operator
目录
了解 MetalLB Operator术语MetalLB 的高可用性原理选择 VIP 承载节点的算法计算公式应用示例自定义资源定义IPAddressPoolL2AdvertisementBGPPeerBGPAdvertisementBFDProfile(可选)约束和限制安装和卸载 MetalLB Operator配置组件放置调整日志级别升级 MetalLB Operator了解 MetalLB Operator
MetalLB Operator 为无法使用云负载均衡器服务的本地或裸金属环境提供 Kubernetes 原生负载均衡器实现。 它通过为服务分配外部 IP 地址,并通过 Layer 2 (ARP/NDP) 或 Layer 3 (BGP) 宣告这些地址,使类型为 LoadBalancer 的 Service 资源能够正常工作。
Operator 会自动管理 MetalLB 组件的生命周期,包括安装、升级和配置同步。
术语
MetalLB 的高可用性原理

默认情况下,平台使用 MetalLB 的 ARP 模式,具体实现流程和原理如下:
-
MetalLB 的 Controller 组件从外部地址池中选择一个 IP 地址,并将其分配给 LoadBalancer 类型的内部路由作为 VIP。
-
MetalLB 根据算法选择一个可用节点作为 leader 来承载 VIP,然后由该节点转发流量。
-
此节点上的 Speaker 组件会主动发送 GARP,在所有节点间建立 VIP 与 MAC 地址的映射关系。
-
同一子网内的节点学习到 VIP 与可用节点 MAC 地址之间的映射关系后,访问 VIP 时会直接与该节点通信。
-
不同子网中的节点会先将流量路由到其所在子网的网关,再由网关将流量转发到承载 VIP 的节点。
-
-
当此节点发生故障时,MetalLB 会选择另一个 leader 承载 VIP。随后发送 GARP,以刷新 Service IP 的 MAC 地址,从而确保高可用性。
-
流量到达节点后,Kube-Proxy 会将其转发到相应的 Pod。
选择 VIP 承载节点的算法
给定负载均衡器 IP 的“leader”(将要通告该 IP 的节点)选举是无状态的,工作方式如下:
- 每个 speaker 都会收集给定 IP 的潜在通告者列表,同时考虑活动 speaker、外部流量策略、活动端点、节点选择器及其他因素。
- 每个 speaker 执行相同的计算:获取“节点+VIP”元素哈希值的排序列表,并在自身是列表中的第一项时通告该服务。
这样便无需记忆哪个 speaker 负责通告给定 IP。
计算公式
公式为:外部地址池数量 = ceil(n-vip / n-node),其中 ceil 表示向上取整。
注意:如果使用虚拟机,虚拟机数量 = 外部地址池数量 * n。此处 n 必须大于 2,且最多允许一个节点故障。
-
n-vip:表示 VIP 的数量。
-
n-node:表示单个节点能够承载的 VIP 数量。
应用示例
如果某公司有 10 个 VIP,且每个可用节点能够承载 5 个 VIP,同时允许一个节点发生故障,那么该公司应如何规划外部地址池数量和可用节点数量?
分析:
共需要两个外部地址池和四个可用节点。
-
每个可用节点最多可以承载 5 个 VIP,这意味着一个外部地址池可以容纳 5 个 VIP,因此 10 个 VIP 需要两个外部地址池。
-
允许一个节点发生故障意味着每个地址池必须包含一个承载 VIP 的节点和一个备用节点,因此两个外部地址池各需要两个可用节点。
自定义资源定义
MetalLB Operator 会在 metallb.io API 组下安装并管理多个 CRD。 这些 CRD 定义了 MetalLB 分配和通告 IP 地址的方式。
IPAddressPool
定义 MetalLB 可分配给 Service.type=LoadBalancer. 的 IP 范围
- 一个或多个 CIDR 或范围。
- 默认情况下,MetalLB 会从任何已配置且有空闲地址的地址池中分配 IP。这可能导致为不需要“昂贵”地址的服务使用此类地址。
若要阻止此行为,可以将地址池的 autoAssign 标志设置为
false,从而禁用自动分配
L2Advertisement
用于 Layer 2 模式,在该模式下 MetalLB 通过 ARP/NDP 通告 IP。
- 将通告其 IP 的地址池列表。
BGPPeer
- 对等路由器的 IP 地址。
- 对等端的 ASN。
- MetalLB 使用的 ASN。
holdTime/keepaliveTime:BGP 会话的可选计时器。- 可以在配置中使用对等端的 node-selectors 属性,将对等端限制为特定节点。
BGPAdvertisement
控制如何通过 BGP 通告地址池中的 IP。
- 要通告的地址池。
- 路由聚合前缀长度。
- BGP community 属性。
BFDProfile(可选)
用于定义 BGP 对等端的 BFD(双向转发检测)参数。
约束和限制
外部地址的 IP 资源必须满足以下条件:
-
外部地址池必须与可用节点通过二层(L2)互联。
-
IP 必须可供平台使用,且不能包含物理网络中已在使用的 IP,例如网关 IP。
-
不能与集群使用的网络重叠,包括 Cluster CIDR、Service CIDR、子网等。
-
在双栈环境中,请确保同一外部地址池中同时存在 IPv4 和 IPv6 地址,且两者的数量都大于 0。否则,双栈 LoadBalancer 类型的内部路由将无法获取外部访问地址。
-
在 IPv6 环境中,节点的 DNS 必须支持 IPv6;否则,MetalLB 插件将无法成功部署。
安装和卸载 MetalLB Operator
可以通过 Alauda Container Platform Web 控制台中的 Cluster Plugin 安装 Operator。
- 导航到
Administrator->Marketplace->Cluster Plugin - 输入关键字
MetalLB。 - 单击
⋮,然后单击 Install。 - 安装完成后,单击
⋮,然后单击 Uninstall。
配置组件放置
安装 MetalLB Cluster Plugin 后,直接在 metallb-system 命名空间中的 MetalLB 自定义资源上配置组件放置。安装期间,如果该资源不存在,Cluster Plugin 会创建该资源;controller 和 speaker 的调度设置由此资源管理。
controllerNodeSelector 和 controllerTolerations 适用于 MetalLB controller Deployment。nodeSelector 和 speakerTolerations 适用于 MetalLB speaker DaemonSet。默认情况下,这些字段为空,因此 MetalLB 不容忍任何额外的 taint。
在二层模式下,L2Advertisement.spec.nodeSelectors 配置决定哪些 speaker 可以通告 VIP。请将其与 MetalLB 组件放置和 IngressNginx.spec.controller.nodeSelector 对齐,以便 speaker 可以从运行 Ingress Nginx pod 的节点通告 VIP。
调整日志级别
在 MetalLB 自定义资源上设置 spec.logLevel,以调整 controller 和 speaker 使用的日志级别:
支持的值包括 all、debug、info、warn、error 和 none。默认值为 info。
升级 MetalLB Operator
通过 Alauda Container Platform Web 控制台上传软件包来升级 MetalLB Operator。
- 导航至
Administrator->Marketplace->Upload Package
详细了解上传软件包。