[OVN] - IPv6 分布式路由¶
RFE: https://bugs.launchpad.net/neutron/+bug/1998609
此 RFE 旨在为仅 IPv6 或双栈使用场景实现分布式路由支持。 分布式路由对于 IPv4 FIP 地址来说已经成为现实,为 IPv6 实现 DVR 的好处与 IPv4 FIP 地址相同。
问题描述¶
当使用仅 IPv6 或双栈部署时,IPv6 地址的流量仍然由路由器的网关端口集中处理。 DVR 对 IPv4 FIP 地址的支持已经通过 ml2_conf.ini 文件中的 [ovn] 部分中的 enable_distributed_floating_ip 标志在 neutron 中实现。
此问题会影响最终用户和部署者
对于最终用户 - (网络性能) 由于流量集中,所有网络应用程序都需要通过网关路由器端口驻留在 chassis <-> 计算节点(通过隧道 - 例如 Geneve)才能到达端点。 如果 gw 路由器端口与 VM 计算节点位于同一 chassis 上,则不适用。
对于部署者 - (动态路由的附加设置) 由于 IPv6 GUA 子网与路由器的 gw 端口相关联,因此有必要动态地将此子网通告到边界网络元素(该元素路由 IPv6 前缀的外部/内部流量)。 可以静态配置,但在谈论大规模部署时,这是不可行的。 因此,我们需要启用额外的设置,例如使用 neutron-dynamic-routing 的 BGP。
如果运行 VM 的计算节点知道发送数据包到外部网络的路径(借助在每个计算节点上配置的路由协议,例如使用 FRR),则传出流量可以直接到达边界。 但是,传入流量始终转发到路由器的 gw 端口,因为它是唯一知道如何响应 IPv6 GUA 地址的 VM 的邻居请求的端口。
DVR 用例
提供商网络必须跨越底层网络,并且每个计算节点都将具有用于外部流量的桥接器。 例如,在 L3 Leaf-Spine 底层网络中,要访问的网络是底层网络能够通过 VXLAN 作为数据平面和 BGP EVPN 作为控制平面扩展 L2 域(VLAN)。 在此解决方案中,Leaf 交换机需要作为 HW VTEP 网关来启动和终止 VXLAN 隧道,并使用 BGP EVPN 来学习和通告来自计算节点提供商网络的 MAC 地址。
- E/W PATH:
Compute Node VM <-> OVS br-int <-> br-provider <-> external-bridge-mapping
<-> FRR <-> BGP EVPN type2 <-> E/W spine/leaf <-> [reverse flow to VM]
- N/S PATH:
Compute Node VM <-> OVS br-int <-> br-provider <-> external-bridge-mapping
<-> FRR <-> BGP EVPN type2 <-> N/S Border Leaf <-> external network
提议的变更¶
为了解决上述问题,建议为分配给 VM 的 IPv6 GUA 地址引入一个新的 NAT 规则(OVN 将 IPv6 GUA 视为 FIP)。 即使这是一个全局地址,运行在 chassis 上的 ovn-controller 也需要此规则才能像处理 IPv4 FIP 的 GARP 一样开始响应 IPv6 的邻居通告。
为了启用 IPv6 DVR NAT 规则管理,应该通过 ml2_conf.ini 文件中的 [ovn] 部分启用一个新的配置选项。
* ``enable_distributed_ipv6 = True``
此选项类似于启用 FIP 的 DVR 的配置选项:enable_distributed_floating_ip。
OVN 影响¶
OVN 对 IPv6 GUA 分布式路由的支持遵循与 IPv4 情况相同的思路 [1]。 对于 ovn-controller,external_ip 和 local_ip 可以包含 IPv4 或 IPv6 地址。 因此,用于创建 IPv6 NAT 规则的 contract 规则与用于 FIP IPv4 地址的规则保持相同。
NAT 规则字段 (OVN)
type : dnat_and_snat
logical_ip : The same VM IPv6 GUA address
external_ip : The same VM IPv6 GUA address
logical_port: VM logical port
external_ids: Managed by Neutron
external_mac: VM MAC address
NAT 规则中使用的 external_ip 和 logical_ip 相同(例如 VM GUA)。 通过此条目,OVN 应该添加逻辑流以直接通过驻留在 VM 所在 chassis 上的 ovn-controller 响应 IPv6 邻居请求。
我们知道 IPv6 没有 NAT,因此这种将 GUA 地址转换为自身的特殊规则仅用于在 VM 驻留的 chassis 中创建流。 如果没有此规则,计算节点将不知道如何响应该 IPv6 GUA,并将通过路由器 GW 端口集中通信(如果路由器位于另一个主机上,则通过 Geneve 隧道)。
Neutron 影响¶
FIP IPv4 的 NAT 规则由 Neutron floating ips 数据库管理。 在 IPv6 GUA 地址的 NAT 规则的情况下,我们需要为与 VM 关联的地址创建一个“假转换规则”。 IPv6 地址在端口创建期间分配给 VM,并通过 ipv6_address_mode(静态、SLAAC、DHCPv6 有状态或 DHCPv6 无状态)进行管理。
这意味着端口创建和删除事件管理分配给 VM 的 IPv6 地址和 MAC 地址。 在这种情况下,IPv6 GUA 的 NAT 规则的创建可以遵循 OVN 驱动程序中 ovn_client 提供的端口创建和删除过程。
端口结构提供 IPv6 地址(子网)、VM MAC 地址和 logical_port,但要创建 NAT 规则,有必要将此规则分配给路由器,因此有必要搜索与 VM 端口关联的路由器的 ID。
IPv6 GUA NAT 规则创建
{
args = {'type': 'dnat_and_snat',
'logical_ip': IPv6_ADDRESS,
'external_ip': IPv6_ADDRESS,
'logical_port': PORT_ID,
'external_ids': EXTERNAL_IDS,
'external_mac': EXTERNAL_MAC}
_nb_idl.add_nat_rule_in_lrouter(gw_lrouter_name, args)
}
IPv6 GUA NAT 规则删除
{
args = {'type': 'dnat_and_snat',
'logical_ip': IPv6_ADDRESS,
'external_ip': IPv6_ADDRESS}
_nb_idl.delete_nat_rule_in_lrouter(gw_lrouter_name, args)
}
对于 IPv4 FIP NAT 规则,external_ids 具有重要的字段,例如 fip_key,但对于 IPv6,external_ids 信息无关紧要。 因此,我们可以将常见端口信息设置在该字段中以进行跟踪。 neutron dnat_and_snat 规则由 external_ids 中的以下信息组成
{ external_ids = OVN_PORT_EXT_ID_KEY, OVN_DEVID_EXT_ID_KEY,
OVN_NETWORK_NAME_EXT_ID_KEY, OVN_ROUTER_NAME_EXT_ID_KEY}
}
常见端口信息存储在 OVN “NAT:external_ids” 字典中
$ ovn-nbctl list NAT
_uuid : 4ab3ef03-c832-4635-bce9-779d1092fc89
allowed_ext_ips : []
exempted_ext_ips : []
external_ids : {"neutron:device_id"=
"a467f63b-8159-4e87-83ce-d6b55ed4401f",
"neutron:network_name"=
neutron-b3110178-9798-4951-a681-2e12301001f8,
"neutron:port_id"=
"9910cdd5-d764-403c-ae35-565930107c7a",
"neutron:router_name"=
neutron-a00e21fa-4332-4e26-8e34-73a24cbf46d1}
external_ip : "2001:db8:1234:1::33"
external_mac : "fa:16:3e:1d:31:57"
external_port_range : ""
logical_ip : "2001:db8:1234:1::33"
logical_port : "9910cdd5-d764-403c-ae35-565930107c7a"
options : {}
type : dnat_and_snat
IPv6 DVR 事件¶
Neutron 将响应以下事件配置 IPv6 分布式路由的 NAT 规则
VM 端口创建:使用此事件,neutron 为分配给 VM 的 IPv6 GUA 地址创建一个 NAT 规则。 如果 VM 没有与 VM 子网关联的路由器,则不要创建 IPv6 NAT 规则。
VM 端口删除:与 VM 端口创建相同,收到此事件,neutron 必须删除附加到路由器的 NAT 规则。 如果 VM 没有与 VM 子网关联的路由器,则不要删除 IPv6 NAT 规则。
路由器端口创建:如果收到此事件,有必要检查添加的端口是否与先前创建的 VM 端口关联的相同子网。 这意味着如果路由器端口与 VM 子网关联,neutron 必须创建 IPv6 NAT 规则。
路由器端口删除:与路由器端口创建相同,这意味着如果路由器端口与 VM 子网关联,neutron 必须删除 IPv6 NAT 规则。
FIP IPv4 影响¶
到目前为止,只有一种类型的 ‘dnat_and_snat’ NAT 规则专门用于 FIP,因此搜索 OVN 数据库中 ‘dnat_and_snat’ 类型 NAT 规则的函数需要过滤为独占 FIP 规则。 一个想法是创建 external_ids 中的一个新常量来设置 IP 版本,但仅查找具有 OVN_FIP_EXT_ID_KEY 字段集的规则就足够了。
Neutron OVN NAT 查找 FIP 的更改可能需要对现有浮动 IP 测试进行更改。
数据库影响¶
不需要新的列条目或表来实现此 RFE。 与 VM 关联的端口上已经记录了 IPv6 和 MAC 地址信息。
但是,为了确保 neutron 和 OVN 之间信息的一致性,有必要在 ovn_db_sync 期间实施对 IPv6 NAT 规则的检查。 对于在启用 ‘enable_distributed_ipv6’ 标志之前已经创建的 VM,neutron 将在重新启动时在日志中通知配置差异。 IPv6 GUA 的 NAT 规则将在执行 SYNC_MODE_REPAIR 时自动添加或删除。
实现¶
负责人¶
- 主要负责人
Roberto Bartzen Acosta <rbartzen@gmail.com>
测试¶
单元/功能测试。
文档影响¶
用户文档¶
关于 IPv6 分布式路由支持的信息。