MetalLB Operator

了解 MetalLB Operator

MetalLB Operator 为无法使用云负载均衡服务的本地或裸金属环境提供了 Kubernetes 原生的负载均衡器实现。
它通过为 LoadBalancer 类型的 Service 资源分配外部 IP 地址,并通过二层(ARP/NDP)或三层(BGP)进行地址通告,使这些服务能够正常工作。

该 Operator 自动化管理 MetalLB 组件的生命周期,包括安装、升级和配置同步。

术语

术语说明
VIP虚拟 IP 地址(VIP)是 MetalLB 为 LoadBalancer 类型的内部路由分配的 IP 地址,为外部流量访问集群内服务提供统一的访问入口。
ARP地址解析协议(ARP)用于将网络层的 IP 地址映射到数据链路层的 MAC 地址。
GARPGratuitous ARP(GARP)是一种特殊的 ARP 请求,用于通知网络中其他节点某个 IP 地址与 MAC 地址的绑定关系。与普通 ARP 请求不同,GARP 不等待响应,而是主动将信息广播到网络中。
ARP ResponderMetalLB 的一个组件,负责响应 ARP 请求,将 VIP 映射到节点的 MAC 地址。当节点需要与 VIP 通信时,会发送 ARP 请求以获取对应的 MAC 地址。每个可用节点都有一个 ARP Responder 来响应这些请求,将 VIP 映射到该节点的 MAC 地址。
ControllerMetalLB 的一个组件,动态从外部地址池中分配 VIP 用于 LoadBalancer 类型的内部路由。Controller 监听集群中内部路由的创建和删除事件,按需分配或释放 VIP。
SpeakerMetalLB 的一个组件,根据策略或算法决定哪些节点应承载 VIP 并发送 GARP。它确保节点间的负载均衡,当某节点不可用时,其他节点可以接管 VIP 并发送 GARP,从而实现高可用。

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、外部流量策略、活跃的 endpoints、节点选择器等因素。

  • 每个 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 地址。

CRDKind作用
IPAddressPoolIPAddressPool定义负载均衡服务可用的 IP 地址池。
L2AdvertisementL2Advertisement配置如何通过 ARP/NDP(二层)通告地址池中的 IP。
BGPPeerBGPPeer定义 MetalLB 用于建立路由会话的 BGP 对等体(三层)。
BGPAdvertisementBGPAdvertisement指定通过 BGP 通告哪些 IPAddressPool 及其策略。
BFDProfileBFDProfile可选;定义双向转发检测(BFD)参数,用于更快检测 BGP 故障。

IPAddressPool

定义 MetalLB 可分配给 Service.type=LoadBalancer 的 IP 范围。

apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
  name: production-pool
  namespace: metallb-system
spec:
  addresses:
    - 192.168.10.100-192.168.10.150
  autoAssign: true
  1. 一个或多个 CIDR 或地址范围。
  2. 默认情况下,MetalLB 会从任何配置的地址池中分配空闲 IP,这可能导致“昂贵”的地址被分配给不需要的服务。
    若要防止此行为,可以通过将 autoAssign 标志设置为 false 来禁用某个地址池的自动分配。

L2Advertisement

用于二层模式,MetalLB 通过 ARP/NDP 通告 IP。

apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
  name: l2-adv
  namespace: metallb-system
spec:
  ipAddressPools:
    - production-pool
  1. 要通告其 IP 的地址池列表。

BGPPeer

apiVersion: metallb.io/v1beta1
kind: BGPPeer
metadata:
  name: peer1
  namespace: metallb-system
spec:
  peerAddress: 10.0.0.1
  peerASN: 64512
  myASN: 64513
  holdTime: 90s
  keepaliveTime: 30s
  nodeSelectors:
    - matchLabels:
        alertmanager: 'true'
  1. 对等路由器的 IP 地址。
  2. 对等体的 ASN。
  3. MetalLB 使用的 ASN。
  4. holdTime / keepaliveTime:BGP 会话的可选定时器。
  5. 可通过配置中的 node-selectors 属性限制对等体只作用于特定节点。

BGPAdvertisement

控制如何通过 BGP 通告地址池中的 IP。

apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
  name: bgp-adv
  namespace: metallb-system
spec:
  ipAddressPools:
    - production-pool
  aggregationLength: 32
  communities:
    - no-export
  1. 要通告的地址池。
  2. 路由聚合前缀长度。
  3. BGP 社区属性。

BFDProfile(可选)

用于定义 BGP 对等体的 BFD(双向转发检测)参数。

apiVersion: metallb.io/v1beta1
kind: BFDProfile
metadata:
  name: fast-failover
spec:
  receiveInterval: 300
  transmitInterval: 300
  detectMultiplier: 3

约束与限制

外部地址的 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。

  1. 进入 Administrator -> Marketplace -> Cluster Plugin
  2. 输入关键词 MetalLB
  3. 点击 ,选择 Install
  4. 安装完成后,点击 ,选择 Uninstall

升级 MetalLB Operator

通过 Alauda Container Platform Web 控制台上传包的方式升级 MetalLB Operator。

  1. 进入 Administrator -> Marketplace -> Upload Package

了解更多关于 Upload Package 的内容。