了解 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、外部流量策略、活动的 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 的节点和一个备份节点,因此两个外部地址池各需要两个可用节点。