了解 MetalLB

目录

术语

术语描述
VIP虚拟 IP 地址(VIP)是 MetalLB 为 LoadBalancer 类型的内部路由分配的 IP 地址,为外部流量访问集群内服务提供统一的访问入口。
ARP地址解析协议(ARP)用于将网络层的 IP 地址映射到数据链路层的 MAC 地址。
GARP免费 ARP(GARP)是一种特殊的 ARP 请求,用于通知网络中其他节点 IP 地址与 MAC 地址的绑定关系。与普通 ARP 请求不同,GARP 不等待响应,而是主动在网络中发送信息。
ARP ResponderMetalLB 的一个组件,负责响应 ARP 请求,将 VIP 映射到节点的 MAC 地址。当节点需要与 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、外部流量策略、活动的 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 的节点和一个备份节点,因此两个外部地址池各需要两个可用节点。

其他资源