Neutron OVS DVR - 分布式虚拟路由器¶
https://blueprints.launchpad.net/neutron/+spec/neutron-ovs-dvr
Neutron 分布式虚拟路由器在计算节点上实现 L3 路由器,以便租户内 VM 之间的通信无需经过网络节点。 (东西向路由)
此外,Neutron 分布式虚拟路由器在 VM 所在的每个计算节点上实现浮动 IP 命名空间。在这种情况下,具有浮动 IP 的 VM 可以将流量转发到外部网络,而无需到达网络节点。 (南北向路由)
Neutron 分布式虚拟路由器为所有私有 VM 提供传统的 SNAT 行为。SNAT 服务不是分布式的,它是集中的,服务节点将托管该服务。
问题描述¶
如今,Neutron L3 路由器部署在特定的节点(网络节点)中,所有计算流量都将流经这些节点。
问题 1:VM 间流量流经网络节点
在这种情况下,即使属于同一租户的不同子网的 VM 流量也必须到达网络节点才能在子网之间路由。 这会影响性能。
问题 2:具有浮动 IP 的 VM 也通过网络节点路由器接收和发送数据包
如今,浮动 IP(DNAT)转换在网络节点完成,并且外部网络网关端口也仅在网络节点可用。 因此,来自 VM 到外部网络的任何流量都必须经过网络节点。
在这种情况下,网络节点成为单点故障,并且网络节点上的流量负载将很重。 这会影响性能和可扩展性。
这也有助于使 Neutron 网络与 Nova 的奇偶校验保持一致。
提议的变更¶
该提案是在需要 VM 时将 L3 路由器分布到计算节点上。
在这种情况下,每个计算节点上都将运行增强的 L3 代理(这不是新代理,而是现有 L3 代理的更新版本)。 根据 L3 Agent.ini 文件中的配置,增强的 L3 代理将以传统(集中式路由器)模式或分布式路由器模式运行。
此外,浮动 IP 将在 VM 所在的特定计算节点上创建一个新的命名空间。 每个计算节点将为每个外部网络创建一个新的 FIP 命名空间,这些命名空间将在租户之间共享。 将在计算节点上为外部流量创建外部网关端口。
默认 SNAT 功能仍然是集中的,并且将在服务节点上运行。
元数据代理也将分布式,并将托管在所有计算节点上,元数据代理将托管在所有分布式路由器上。
现有的 DHCP 服务器仍然在服务节点上运行。 未来有分布式 DHCP 的计划。(这将在不同的蓝图中解决)
此实现特定于 ML2 与 OVS 驱动程序。
备选方案¶
另一种选择是使用内核模块。 但我们没有追求它,因为内核模块必须是上游 Linux 发行版的一部分,然后我们才能推送此补丁。
数据模型影响¶
将有少量数据模型更改由该蓝图解决。
路由器对象数据模型。
+----------------+--------------+------+-----+---------+
| Field | Type | Null | Key | Default |
+----------------+--------------+------+-----+---------+
| tenant_id | string(256) | Yes | | NULL |
| id | string(36) | NO | PRI | |
| name | string(256) | YES | | NULL |
| status | string(16) | YES | | NULL |
| admin_state_up | boolean | YES | | NULL |
| gw_port_id | string(36) | YES | MUL | NULL |
| enable_snat | boolean | NO | | |
| distributed | boolean | YES | | NULL |
+----------------+--------------+------+-----+---------+
在路由器对象数据模型中添加“distributed”标志。 这将使代理能够根据路由器模型采取必要的措施。
SNAT 代理到主机映射数据模型。
一个新表,用于服务节点增强的 L3 代理,以跟踪每个节点上的 SNAT 服务。
+------------------+--------------+------+-----+---------+
| Field | Type | Null | Key | Default |
+------------------+--------------+------+-----+---------+
| id | string(36) | NO | PRI | |
| router_id | string(36) | YES | MUL | NULL |
| host_id | string(255) | YES | | NULL |
| l3_agent_id | string(36) | YES | MUL | NULL |
+------------------+--------------+------+-----+---------+
ML2 DVR 接口绑定数据模型。
- ::
字段
类型
是否为空
键
默认值
port_id host router_id vif_type vif_details vnic_type profile cap_port_filter driver segment status
string(36) string(255) string(36) string(64) string(4095) string(64) string(36) boolean string(64) string(36) string(16)
NO NO YES YES YES YES YES YES YES YES YES
PRI PRI
NULL NULL NULL NULL NULL NULL NULL NULL NULL
一个新表,用于仅保存 DVR 路由器接口的端口绑定。 这类似于 portbindings 表,但此表仅保存 DVR 路由器接口的绑定。
原始 portbindings 表也将保存 DVR 路由器接口的一个绑定行,但该行不保存绑定信息。 该绑定行保留在那里,只是为了确保租户本身对 DVR 的存在透明。
上述一些重要字段是:port_id - 这指的是应用此绑定的 DVR 路由器接口的端口 ID。 port-id 将引用端口表的 id 字段。 host - 这保存了 DVR 接口绑定的主机。 router_id - 此字段指示此绑定属于哪个路由器接口。 status - 此字段表示主机上 DVR 接口端口的状态,该状态由此绑定表示。
原始 portbindings 表中 DVR 路由器接口的单个绑定行的 status 字段现在将是上述表中所有可用 DVR 路由器接口的 status 字段的 ORed 结果。
ML2 DVR 唯一 MAC 地址表
- ::
字段
类型
是否为空
键
默认值
host mac_address
string(255) string(32)
NO NO
主键
NULL
一个新表,用于保存分配给以 DVR 模式运行的 OVS L2 代理的唯一 DVR 基 MAC 地址。
对于正在运行 OVS L2 代理的任何给定主机,仅从 DVR 基 MAC 池中分配一个 MAC 地址给该 OVS L2 代理。 此分配 rpc 周期在 OVS L2 代理的 init() 期间完成。
为了使 OVS L2 代理以 DVR 模式运行,必须在 ml2 ini 文件(ml2_conf.ini)的 [agent] 部分中将 enable_distributed_routing 标志设置为 True。
类似地,表示池起始的 DVR 基 MAC 地址需要在 neutron.conf 中定义
REST API 影响¶
router-create 为给定的租户创建一个路由器。
router-create --name another_router --distributed=true
只有管理员才能设置此属性。 租户不需要了解路由器表中的此属性。 因此,它对租户不可见。
请求
POST /v2.0/routers
Accept: application/json
{
"router":{
"name":"another_router",
"admin_state_up":true,
"distributed":true}
}
响应
{
"router":{
"status":"ACTIVE",
"external_gateway_info":null,
"name":"another_router",
"admin_state_up":true,
"distributed":true,
"tenant_id":"6b96ff0cb17a4b859e1e575d221683d3",
"id":"8604a0de-7f6b-409a-a47c-a1cc7bc77b2e"}
}
router-show 显示给定路由器的信息。
请求
GET /v2.0/routers/a9254bdb-2613-4a13-ac4c-adc581fba50d
Accept: application/json
响应
{
"routers":[{
"status":"ACTIVE",
"external_gateway_info":{
"network_id":""
},
"name":"router1",
"admin_state_up":true,
"distributed":true,
"tenant_id":"33a40233088643acb66ff6eb0ebea679",
"id":"a9254bdb-2613-4a13-ac4c-adc581fba50d"}]
}
router-update 为给定的租户创建一个路由器。
只有管理员才能将集中式路由器更新为分布式路由器。
注意:管理员只能将集中式路由器更新为分布式路由器,反之则不行。 对于第一个版本,我们仅针对从集中式到分布式。
仅管理员上下文
neutron router-update router1 --distributed=True
仅管理员 CLI 命令
l3-agent-list-hosting-snat List L3 agents hosting a snat service.
此命令将列出具有 router-id 和 SNAT IP 的代理。
l3-agent-snat-add Associate a snat namespace to an L3 agent.
此命令将允许管理员将 SNAT 命名空间关联到代理。 此命令将路由器 ID 作为参数。
l3-agent-snat-remove Remove snat association from an L3 agent.
此命令将允许管理员删除或取消关联代理上的 SNAT 服务。
安全影响¶
需要确保现有的 FWaaS 和安全组规则不受 DVR 影响。
通知影响¶
无
其他最终用户影响¶
是的,此更改将对 python-neutronclient 产生一些影响
上述管理级别 API 必须在 CLI 中实现。
此外,Horizon 也有影响,需要解决上述管理级别 API。
性能影响¶
提高性能。
租户子网之间的 VM 间流量无需到达网络节点上的路由器即可路由,并将从计算节点本地路由。 这将大大提高性能。
此外,来自计算节点的 VM 的浮动 IP 流量将直接命中计算节点的外部网络,而不是经过网络节点上的路由器。
其他部署者影响¶
全局配置以启用分布式虚拟路由器。
#neutron.conf
[default]
# To enable distributed routing this flag need to be enabled.
# It can be either True or False.
# If False it will work in a legacy mode.
# If True it will work in a DVR mode.
#router_distributed = True
# ovs_neutron_plugin.ini
# This flag need to be enabled for the L2 Agent to address
# DVR rules
#enable_distributed_routing = True
# l3_agent.ini
#
# This flag is required by the L3 Agent as well to run the L3
# agent in a Distributed Mode.
#
#distributed_agent = True
#
默认情况下这将处于禁用状态。
注意:这是为了向后兼容。 为了迁移,管理员可能需要运行 db-migration 脚本并使用正确的配置重新启动代理才能生效。
如果云管理员想要启用该功能,可以对其进行配置。
它当前使用 Linux 发行版中现有的 OVS 二进制文件。 因此,不应该有新的二进制文件。
开发人员影响¶
可能需要多节点 Devstack 设置来进行开发和测试。
服务影响 - 一些服务,例如 VPN 和 FW,需要进行重构以适应分布式虚拟路由器。 相应的服务团队将与 DVR 团队合作以重构服务。
实现¶
负责人¶
主要负责人
<swaminathan-vasudevan>
其他贡献者
<rajeev-grover>
<mbirru>
<michael-smith6>
<vivekanandan-narasimhan>
工作项¶
用于 DVR 的 L3 插件扩展
用于 DVR 的 ML2 插件/OVS 代理
用于 DVR 的 L3 增强代理
用于 DVR 的 L3 代理调度器
用于 DVR 的 L3 驱动程序/iplib
依赖项¶
OVS(2.01 及以上版本),L2-Pop。
测试¶
是的。 由于我们正在实现路由器的分布式特性,因此需要多节点设置来测试此功能,以便可以验证规则和实际的路由器命名空间创建。
单节点基础设施仍然可以测试此功能,但我们需要验证。
将考虑在 gate 上使用持续集成测试来测试 dvr。
文档影响¶
是的。 将会产生文档影响,因此需要修改文档以解决新的部署场景。