概述
名词解释
| 名词 | 说明 |
|---|---|
| VIP | 虚拟 IP 地址(Virtual IP Address,VIP) 是 MetalLB 为 LoadBalancer 类型内部路由分配的 IP 地址,此地址为集群外流量提供了统一的访问入口,以便访问集群内服务。 |
| ARP | 地址解析协议(Address Resolution Protocol,ARP),用于将网络层 IP 地址映射到数据链路层 MAC 地址的协议。 |
| GARP | 无偿 ARP(Gratuitous ARP,GARP)是一种特殊的 ARP 请求,它用于通知网络中的其他节点关于某个 IP 地址与 MAC 地址的绑定关系,与正常的 ARP 请求不同,GARP 不等待其他节点的响应,而是主动向网络发送信息。 |
| ARP Responder | MetalLB 的组件,主要作用是响应 ARP 请求,将 VIP 映射到节点的 MAC 地址。当节点需要与 VIP 进行通信时,它们会发送 ARP 请求以获取 VIP 对应的 MAC 地址,每个可用节点上的 ARP Responder 负责响应这些 ARP 请求,将 VIP 映射到节点的 MAC 地址。 |
| Controller | MetalLB 的组件,负责动态地从外部地址池中为 LoadBalancer 类型的内部路由分配 VIP,且 Controller 组件会监听集群中内部路由的创建和删除事件,按需分配或释放 VIP。 |
| Speaker | MetalLB 的组件,负责根据策略或算法决定节点是否承载 VIP 并发送 GARP,且确保节点之间有一定的均衡,以及在某个节点不可用时,其他节点可以接管 VIP 并发送 GARP,实现高可用。 |
MetalLB 高可用原理
平台默认使用 MetalLB 的 ARP 模式,具体的实现过程和原理如下:
-
MetalLB 的 Controller 组件从外部地址池中选择 IP 地址,分配给 LoadBalancer 类型内部路由作为 VIP。
-
MetalLB 根据 算法 选择出承载此 VIP 的可用节点,由此节点转发流量。
-
此节点上的 Speaker 组件主动发送 GARP,使得各个节点形成 VIP 与 MAC 地址的映射关系。
-
同子网的节点在学习到 VIP 与可用节点 MAC 地址的映射关系后,在访问 VIP 时会直接与此节点进行通信。
-
不同子网的节点访问此 VIP 时,流量会先路由至此子网的网关,由网关将流量转发到承载 VIP 的节点上。
-
-
当该节点发生异常时,MetalLB 会选择其他可用节点作为承载 VIP 的节点,由此实现高可用。
-
流量到达节点后,由 Kube-Proxy 将流量转发至对应的 Pod。
MetalLB 选择承载 VIP 节点的算法
MetalLB 会将外部地址池对应的所有可用节点分别和 VIP 做 Hash,并按照一定算法进行排序,选择其中第一个可用节点做为承载 VIP 的节点。
外部地址池及节点数量
创建一个外部地址池并添加可用节点,所有可用节点之间是 备份 的关系,即所有可用节点中只有承载 VIP 的节点可以转发流量,因此该节点需要能够承载外部地址池中所有 VIP 的流量。
计算公式
计算的公式为:外部地址池数量 = 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 的节点及一个备份节点,共两个可用节点,因此两个外部地址池对应四个可用节点。