Alauda Container Platform 负载均衡器

了解 MetalLB Operator

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

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

术语

术语说明
VIP虚拟 IP 地址(VIP)是 MetalLB 为 LoadBalancer 类型的内部路由分配的 IP 地址,为外部流量访问集群内的服务提供统一的访问点。
ARP地址解析协议(ARP)用于将网络层 IP 地址映射为数据链路层 MAC 地址。
GARP免费 ARP(GARP)是一种特殊的 ARP 请求,用于通知网络中的其他节点某个 IP 地址与 MAC 地址的绑定关系。与普通 ARP 请求不同,GARP 不等待响应,而是主动向网络发送信息。
ARP ResponderMetalLB 的一个组件,负责通过将 VIP 映射到节点的 MAC 地址来响应 ARP 请求。当节点需要与 VIP 通信时,会发送 ARP 请求,以获取与该 VIP 对应的 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、外部流量策略、活跃端点、节点选择器等因素。
  • 每个 speaker 执行相同的计算:获取“节点+VIP”元素哈希值的排序列表,如果当前 speaker 是列表中的第一项,则通告该 Service。

这样便无需记录哪个 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定义可供负载均衡器 Service 使用的 IP 地址池。
L2AdvertisementL2Advertisement配置如何使用 ARP/NDP(第 2 层)通告地址池中的 IP。
BGPPeerBGPPeer定义供 MetalLB 建立路由会话的 BGP 对等端(第 3 层)。
BGPAdvertisementBGPAdvertisement指定通过 BGP 通告哪些 IPAddressPool 以及所使用的策略。
BFDProfileBFDProfile可选;定义双向转发检测参数,以更快检测 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。这可能会导致将“昂贵”的地址分配给不需要这些地址的 Service。 若要阻止此行为,可以将 autoAssign 标志设置为 false,以禁用地址池的自动分配。

L2Advertisement

用于第 2 层模式,在此模式下,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 community 属性。

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;否则,无法成功部署 Alauda Container Platform Load Balancer 插件。

安装和卸载 MetalLB Operator

可以通过 Alauda Container Platform Web 控制台中的 Cluster Plugin 安装 Operator。

  1. 前往 Administrator -> Marketplace -> Cluster Plugin
  2. 输入关键字 Alauda Container Platform Load Balancer。
  3. 点击 ⋮,然后点击 安装。
  4. 安装完成后,点击 ⋮,然后点击 卸载。

配置组件放置

安装 Alauda Container Platform Load Balancer Cluster Plugin 后,直接在 MetalLB 自定义资源中配置组件放置,该资源位于 metallb-system 命名空间中。如果该资源不存在,Cluster Plugin 会在安装时创建;controller 和 speaker 的调度设置由此资源管理。

apiVersion: metallb.io/v1beta1
kind: MetalLB
metadata:
  name: metallb
  namespace: metallb-system
spec:
  controllerNodeSelector:
    dedicated: ingress
  controllerTolerations:
    - key: dedicated
      operator: Equal
      value: ingress
      effect: NoSchedule
  nodeSelector:
    dedicated: ingress
  speakerTolerations:
    - key: dedicated
      operator: Equal
      value: ingress
      effect: NoSchedule

controllerNodeSelector 和 controllerTolerations 适用于 MetalLB controller Deployment。nodeSelector 和 speakerTolerations 适用于 MetalLB speaker DaemonSet。默认情况下,这些字段为空,因此 MetalLB 不会容忍任何额外的污点。

在 Layer 2 模式下,L2Advertisement.spec.nodeSelectors 配置决定哪些 speaker 可以通告 VIP。请使其与 MetalLB 组件放置以及 IngressNginx.spec.controller.nodeSelector 保持一致,以便 speaker 能够从运行 Ingress Nginx pod 的节点通告 VIP。

调整日志级别

在 MetalLB 自定义资源上设置 spec.logLevel,以调整 controller 和 speaker 使用的日志级别:

spec:
  logLevel: warn

支持的值包括 all、debug、info、warn、error 和 none。默认值为 info。

升级 MetalLB Operator

Alauda Container Platform Load Balancer 是一个 Core 插件。它会随集群一起升级,不支持独立升级,因此无需为其下载或上传软件包。有关插件生命周期类型,请参阅 Core and Extensions。

商标声明

NGINX® 是 F5, Inc. 在美国及其他国家/地区的注册商标。

MetalLB™ 是 The Linux Foundation 的商标。

Alauda 是独立供应商。本产品与 The Linux Foundation 或 F5, Inc. 没有关联,也未获得其认可或赞助。所有商标均归其各自所有者所有,此处仅用于标识目的。