路由网络浮动IP¶
https://bugs.launchpad.net/neutron/+bug/1667329
本规范提出为路由网络实现浮动IP。
问题描述¶
Neutron 路由网络由运营商基础设施中的 L3 路由器连接在一起的各个 L2 报文段组成。运营商可以选择将此类网络的端口的固定 IP 地址路由到外部世界,但这在没有足够大的外部可路由地址范围的情况下,对于 IPv4 而言可能不可行。
最初实现路由网络是为了支持大量端口/虚拟机,突破基于单个 L2 广播域的网络限制。运营商希望能够支持尽可能多的端口/虚拟机,并将其中一部分路由到外部,而不会受到 IPv4 地址范围可用性的限制。
提议的变更¶
本规范建议启用将路由网络中的端口与浮动 IP 地址(浮动 IP)关联。这将使运营商及其用户能够在路由网络中创建具有私有范围内的固定 IP 地址的端口,并在需要时通过关联浮动 IP 分配稀缺的公共可路由 IPv4 地址。此功能需要以下部分中描述的更改。
跨越报文段的子网创建¶
为了支持在路由提供网络上使用浮动 IP,需要有一种创建不绑定到报文段的子网的方法。在当前状态下,如果网络上的一个或多个子网已经绑定到报文段,则无法在没有指定报文段的情况下在网络上创建子网。
将引入一个新的子网服务类型 network:routed。当子网支持此 service_type 时,它可以关联到路由提供网络的网络,而不是必须关联到构成路由网络的各个报文段之一。这提供了一种表达跨越路由网络报文段的子网概念的方法。因此,这不仅支持在路由网络上使用浮动 IP,还允许各种 neutron 后端以创新的方式处理这些子网。
路由提供网络的当前定义是网络中每个子网都关联到不同报文段的网络。此定义将略有更改,并包含 1 个或多个子网具有 network:routed 的 service_types 与网络关联,但其任何单个报文段都不关联的网络。
为了实现这一点,需要对 neutron/db/ipam_backend_mixin.py 中的 _validate_segment() 进行小的更改,允许具有此特殊服务类型的子网存在于任何报文段之外。
路由网络的专用子网和浮动 IP¶
专用子网使运营商能够为网络上的每个子网定义有效的端口类型,而无需将网络限制为单个子网或手动创建具有特定子网 ID 的端口。通过使用此功能,运营商可以确保实例和路由器接口的端口始终使用不同的子网。
为了允许在路由网络上创建浮动 IP,运营商将在创建浮动 IP 子网时利用此功能。要创建可用于路由提供网络的浮动 IP 子网,应使用两个 service_types 创建该子网:network:routed 和 network:floatingip。network:routed 允许将子网固定到网络,而不是特定的报文段,而 network:floatingip 允许从该子网分配浮动 IP。
预计无需进行任何更改即可使其正常工作。将更新文档以解释运营商的工作流程。不会引入任何当前创建/关联/取消关联/删除浮动 IP 的工作流程的更改。
DVR 和路由提供网络¶
无需进行任何更改即可支持这些更改,从而支持 DVR 的当前操作。将对文档进行更改,以反映以下事实:您希望在报文段上构建浮动 IP 网关端口的子网应使用 `service_type network:floatingip_agent_gateway 创建,以指示计算节点可以到达给定报文段上的路由外部网络。对于网络节点连接,应使用 service_type network:router_gateway 来指示将在适当的报文段上实例化集中式路由器端口。
由于只有提供到网络报文段连接的 ToR 设备才知道如何到达浮动 IP(DVR 将发送免费 ARP),因此必须通过主机路由提供来自报文段外部的连接,这些主机路由会将流量引导到适当的报文段。可以通过启用 neutron-dynamic-routing 实现此目的,启用它以向 ToR 路由器通告 FIP 可达性,并确保 ToR 路由器使用适当的下一跳传播 FIP 主机路由。将在文档中添加说明,解释运营商如何设置此配置。
使用 BGP 动态路由通告浮动 IP¶
BGP 动态路由是一个 Neutron Stadium 项目,它能够将自助服务(私有)网络前缀通告给支持 BGP 的物理路由器,从而消除了对静态路由的传统依赖。 BGP speaker 将自助服务网络前缀通告给关联的 BGP peers,这些前缀代表运营商基础设施中的 BGP 功能物理路由器。
在其当前状态下,neutron-dynamic-routing 通过识别相关的路由器和浮动 IP 代理网关端口并将浮动 IP 映射到其正确的端点来确定浮动 IP 的下一跳。 这样,它完全不了解报文段,并且能够正确发现和通告浮动 IP 的 /32 主机路由的正确下一跳。
安全影响¶
预计此更改不会带来任何新的安全问题。
其他最终用户影响¶
预计不会对客户端产生任何影响。将更新网络指南,并提供适当的文档和示例配置。
未来工作¶
对于某些运营商而言,希望允许将浮动 IP 与端口关联,而无需先将路由器连接到外部网络和租户网络。可以通过多种方式实现这一点。一种方法是依赖于类似 cloud-init 的过程,将 FIP 设置为 VM 内部的环回地址,并依赖 BGP 过程以固定 IP 作为浮动 IP 的下一跳地址进行通告。在先前章节中描述的实施到位后,类似的方案将是路由提供网络的下一个逻辑迭代。
实现¶
负责人¶
主要负责人
其他贡献者
工作项¶
引入新的子网服务类型
network:routed。重构网络报文段完整性检查,以允许将具有
service_typenetwork:routed的子网直接关联到网络。
依赖项¶
无
测试¶
Tempest 测试¶
目前没有针对路由提供网络的 tempest 测试。但是,正在开发一些测试,并且可以最终将涵盖在路由提供网络上创建浮动 IP 的测试添加到这些测试中。
功能测试¶
未知
API 测试¶
可以将以下测试添加到正在 https://review.opendev.org/#/c/665155/ 中开发的场景测试套件中
可以在路由提供网络上创建浮动 IP 子网
可以在路由提供网络上创建浮动 IP
来自同一子网的浮动 IP 可以关联到不同报文段上的端口
neutron-dynamic-routing 中的测试,以断言路由提供网络上的正确路由发现
文档影响¶
是
用户文档¶
记录创建浮动 IP 子网的新行为
记录如何与 neutron-dynamic-routing 结合使用
路由网络、ToR 路由器 BGP 配置和 neutron-dynamic-routing 的示例配置。
开发人员文档¶
将向 Neutron devref 添加一个新部分,描述路由网络浮动 IP 的实现。