OVN L3 调度器

介绍

OVN L3 调度器将路由器网关端口分配到一系列 chassis。分配多个 chassis 允许服务具有高可用性:如果作为网关的 Logical_Router_Port 分配到故障 chassis,OVN 将此端口绑定到列表中的下一个 chassis。此 chassis 列表具有优先级;Logical_Router_Port 将按定义的顺序绑定到 chassis。

这是通过将多个 Gateway_Chassis 行与 OVN Northbound 数据库中的 Logical_Router_Port 相关联来实现的。 Gateway_Chassis 注册只是对 Chassis 注册和优先级的一种链接。对于相同的 Logical_Router_Port,所有分配的 Gateway_Chassis 都将具有不同的优先级,从 1(最低优先级)开始,到分配的 Gateway_Chassis 的数量为止。

可以分配到 Logical_Router_PortGateway_Chassis 的最大数量为 5。这个数字是硬编码的。这意味着在 Neutron 中,Gateway_Chassis 具有的最高优先级为 5。

如果在 Logical_Router_Port 调度期间没有可用的网关 chassis,则不会分配任何 Gateway_Chassis,并且 Logical_Router 注册的“options”列中不会设置任何值;这将用于检测未托管的路由器网关端口。

调度器类型

OVN L3 调度器是可配置的,允许我们实现几种类型的算法。目前,树内仓库中实现了两种

  • OVNGatewayChanceScheduler

  • OVNGatewayLeastLoadedScheduler

OVNGatewayChanceScheduler

此类中的调度算法非常简单:从提供的网关 chassis 列表(候选 chassis)开始,它会打乱并返回该列表。

OVNGatewayLeastLoadedScheduler

此调度器的目标是在可用的 chassis 之间平衡托管相同数量的 Logical_Router_Port。自从 [1] 以来,调度器将检索可用候选人的列表,并按优先级分配负载最轻的 chassis。这意味着该调度器不仅会考虑绑定了 Logical_Router_Port 的 chassis(最高优先级的网关 chassis),还会平衡较低优先级的分配。这是通过 (1) 遍历优先级列表(从 1 到要调度的 chassis 数量),(2) 为每个 Chassis 在所选优先级上 创建分配的 Logical_Router_Port 列表,以及 (3) 选择负载最轻的 Chassis 来完成的。

如果删除了 Chassis,则重新调度 Logical_Router_Port

从环境中删除网关 Chassis 时,会在 Logical_Router_PortGateway_Chassis 分配中创建一个“空洞”。与删除的 Chassis 关联的 Gateway_Chassis 注册将被删除,并从 HA 分配的 Chassis 列表中删除。Neutron 会捕获此事件,并重新调度 Gateway_Chassis 以创建平衡的分配列表,就像在 OVNGatewayLeastLoadedScheduler 中所做的那样。这在 [2] 中实现。

此过程仅适用于较低优先级的 Gateway_Chassis 注册,而从不适用于最高优先级注册;这是因为 Logical_Router_Port 绑定到此 Chassis 并且可能正在传输。如果更改了最高的 Gateway_Chassis,则 Logical_Router_Port 绑定到新的 Chassis 并且可能会中断任何活动会话。

可用性区域 (AZ) 分布

OVNGatewayChanceSchedulerOVNGatewayLeastLoadedScheduler 调度器都将可用性区域 (AZ) 纳入考虑。如果路由器定义了任何 AZ,则调度器将仅选择位于这些 AZ 中的 chassis。如果没有任何 chassis 满足此条件,则 Logical_Router_Port 将不会分配给任何 chassis 并且不会绑定。

创建候选 Chassis 列表(取决于所选调度器)后,此列表将被重新排序,以优先选择来自不同 AZ 的这些 Chassis。这将把分配选择分散到所有 AZ;如果当前(和最高)Chassis 绑定失败,则列表中的下一个 Chassis 将属于另一个 AZ。

此改进在 [3] 中实现。

具有多个 Logical_Router_PortLogical_Router 的软反亲和性

实现了对多个网关端口 [4] 的支持,以支持在第 3 层提供弹性和负载共享的配置。

除了用于生存能力检测的 BFD 和用于默认路由负载共享的 ECMP 等外部依赖项之外,该功能还需要对调度器进行更改,目标是为 Logical_Router 的每个 Logical_Router_Port 记录都具有一组不同的 Chassis,每个优先级一个。

通过 OVN 驱动程序提供要进行调度的路由器对象来实现反亲和性。然后,调度器会检查目标路由器是否已经存在 Logical_Router_Port 记录,并使已经参与现有端口的任何 Chassis 看起来具有更高的负载,从而降低已用 Chassis 被选为新 Logical_Router_Port 的可能性。

由于该算法基于负载和优先级,因此仅支持 OVNGatewayLeastLoadedScheduler 的反亲和性。

此改进在 [5] 中实现。

参考