在此页面上
用于 ECMP 负载平衡的自定义哈希字段选择
概述:自定义哈希功能
借助 Contrail 网络,您可以配置在等价多路径 (ECMP) 负载平衡期间用于哈希处理的字段集。
借助自定义散列功能,用户可以配置在一组符合条件的 ECMP 候选项中选择转发路径时要散列的确切字段子集。
可以通过以下方式应用自定义哈希配置:
全球
每个虚拟网络 (VN)
每个虚拟网络接口 (VMI)
VMI 配置优先于 VN 配置,VN 配置优先于全局级别配置(如果存在)。
每当源自特定源并寻址到特定目标的数据包在传输过程中必须通过同一组服务实例时,自定义哈希非常有用。如果源、目标或中转节点基于流维护特定状态,并且状态行为也可用于同一对源地址和目标地址之间的后续新流,则可能需要这样做。在这种情况下,后续流必须遵循同一组服务节点,后跟初始流。
您可以使用 Contrail Web UI 在 ECMP 哈希字段部分的“配置>网络>创建网络”窗口中标识网络中要对其进行哈希处理的特定字段,如下图所示。

如果为虚拟网络配置了散列字段,则在 vRouter 通过 ECMP 路径转发期间,发往该 VN 的所有流量都将受到自定义散列字段选择的约束。这可能并非在所有情况下都是可取的,因为它可能会通过 IP 交换矩阵中的一小部分路径将所有流量倾斜到目标网络。
更实际的方案是,源和目标之间的流量必须经过两者之间的同一服务实例,其中可以为服务实例的虚拟机接口配置自定义的 ECMP 字段。然后,源自该虚拟机接口的每个服务链路由都将应用所需的 ECMP 字段选择作为其路径属性,并最终传播到入口 vRouter 节点。请参阅以下示例。

使用 ECMP 哈希字段选择
自定义哈希字段选择在目标存在多个 ECMP 路径的情况下最有用。通常,多个 ECMP 路径指向入口服务实例节点,这些节点可以在 Contrail 云中的任何位置运行。
通过服务链配置 ECMP 哈希字段
使用以下步骤通过服务链上的 ECMP 创建自定义哈希字段。
创建使用服务链和 ECMP 负载平衡进行互连所需的虚拟网络。
创建服务模板并启用缩放。
创建服务实例,然后使用服务模板通过选择以下内容进行配置:
所需的横向扩展实例数
要连接的左右虚拟网络
共享地址空间,以确保实例化服务分别为左和右提供相同的 IP 地址
此配置在转发期间在所有这些服务实例中启用 ECMP。
创建策略,然后选择之前创建的服务实例,并将策略应用于所需的 VMI 或 VN。
实例化服务虚拟机后,左右接口的端口可用于进一步配置。在“网络”下的“Contrail Web UI 端口”部分,选择服务实例左侧接口(虚拟机接口)上的端口,然后应用所需的 ECMP 哈希字段配置。
注意:目前,必须通过使用网络下的端口 (VMI) 部分并为每个实例化服务实例的 VMI 显式配置 ECMP 字段选择来应用服务实例左侧或右侧接口的 ECMP 字段选择配置。必须对组的所有服务接口执行此操作,以确保最终结果符合预期,因为只有最佳路径的负载均衡属性才会传递到入口 vRouter。如果未配置负载均衡属性,则即使其他路径具有该配置,也不会将其传播到入口 vRouter。
配置完成后,虚拟路由器将使用路由表进行编程,其中包含到各种服务实例的 ECMP 路径。虚拟路由器还使用所需的 ECMP 哈希字段进行编程,以便在流量负载平衡期间使用。
负载均衡系统的流量粘性
流粘性是 Contrail 网络 21.3 版中的一项测试功能,有助于最大限度地减少负载平衡系统中等价多路径 (ECMP) 组之间的流重新映射。
我们将向您展示一个流重新映射问题的示例,该问题在将新成员添加到三成员 ECMP 负载平衡系统时发生。有关工作流程,请参见 图 1 。

在此示例中,您将向 IP 地址 1.2.3.4 发送流请求。由于这是一个 VIP 地址为 1.2.3.4 的三成员组,因此 vRouter 会根据流哈希计算将请求发送到 pod1。让我们将一个新的成员 pod4 添加到同一个 VIP 组。现在,请求被转移并根据流哈希重新计算重定向到 pod4。
流粘性减少了此类流被重新映射,并保留了流与 pod1 的原始路径,尽管添加了一个新的成员 pod4。如果添加 pod4 影响流,vRouter 会重新编程流表并使用 pod1 重新平衡流。
表 1 显示了纵向扩展和缩减方案的预期正常哈希和流粘性结果。
示例场景 |
普通(静态)哈希结果 |
流量粘性结果 |
---|---|---|
ECMP 组大小为 3。 |
根据流哈希,流量将被定向到 pod1。 |
根据流哈希,流量将被定向到 pod1。 |
向同一服务再添加一个容器。ECMP 组大小为 4。 |
流量重新分配是可能的,流量现在可以重定向到另一个 Pod。 |
流量将继续定向到 pod1。 |
从同一服务中删除一个容器。ECMP 组大小为 2。 |
流量重新分配是可能的,流量现在可以重定向到另一个 Pod。 |
除非删除 pod1,否则流量将继续定向到它。如果删除 pod1,则必须从客户端重新启动会话。 |
仅当流在纵向扩展或缩减之前和之后都是 ECMP 流时,才支持流粘性。
下面是流量粘性可能无法按预期工作的示例:
部署示例 |
场景 |
结果 |
---|---|---|
两个计算中的两个 Pod,每个计算中一个。 |
放大前 |
对于转发流量的计算,流将是非 ecmp。 |
放大后 |
流成为 ECMP 流并触发重新哈希。这可能会导致流量粘性失效。 |