改进 DVR L3 Agent 绑定¶
https://blueprints.launchpad.net/neutron/+spec/improve-dvr-l3-agent-binding
Neutron 代码在 DVR 调度方面处理不当,并且经常混淆路由器为何被调度到 L3 agent,尤其是在 agent 可以同时承载集中式和分布式路由器组件的情况下。
问题描述¶
路由器绑定到 L3 agent 的方式有两种。第一种是针对路由器的集中式组件,类似于传统路由器的绑定方式。第二种是针对分布式组件,应该非常不同。本质上,分布式路由器应该由任何 L3 agent 承载,只要该 agent 的主机上存在 DVR 可服务端口即可。
绑定路由器的集中式部分与绑定传统路由器非常相似。它应该绑定到一个网络节点。当最终启用 HA 和 DVR 协同工作时,它将被绑定到多个节点。让操作员通过 L3 扩展 API 控制绑定是有意义的。然而,正是这种类型的绑定创建了一个新的表,CentralizedSnatL3AgentBinding。
另一种绑定与传统路由器绑定共享相同的表,但其工作方式却大相径庭。这种绑定可以从数据库中的其他信息中计算得出。基本上,您找到路由器连接的网络上的所有 DVR 可服务端口。这些端口绑定的主机上的 agent 集合就是路由器应该绑定的 agent 集合。通过 API 直接控制这种类型的绑定没有意义。然而,这种绑定与传统路由器共享绑定表。
您能理解我们为什么总是对 DVR 调度感到困惑吗?
提议的变更¶
提议的更改是将路由器的集中式部分的绑定移动到与传统路由器共享的表,并希望消除对路由器分布式部分的显式绑定。
通过消除数据库中路由器分布式部分的显式绑定,可能会引入性能损失。在这种情况下,可以为这种类型的绑定添加一个新表。但是,这将是最后的手段。将尽一切努力优化查询,以便无需额外的表即可工作。到目前为止,我认为查询不会太复杂。
需要更改 L3 agent 和 Neutron 服务器之间的 RPC 调用。问题在于,某些 L3 agent 可以承载路由器的集中式部分、分布式部分或两者。当前的 RPC 机制难以区分具体情况。应该有单独的 RPC 调用来独立查询每种类型。
L3 agent 中的 DvrRouter 类将被拆分为两个类:一个用于表示集中式组件,另一个用于表示分布式组件。这两个组件是路由器的两个不同的部分,几乎没有共同之处,应该独立处理。然而,代码混杂在一起,并且有记录表明难以区分相关类型。L3 agent 将独立跟踪它们。
当这些绑定返回到 RouterL3AgentBinding 表时,可以删除许多针对调度路由器集中式组件的特殊情况代码。唯一的例外是在确定符合条件的 agent 时;处于“dvr_snat”模式下的 L3 agent 可以承载 legacy 或 dvr central 组件,但处于“legacy”模式下的 agent 只能承载 legacy 路由器。
数据模型影响¶
DVR 路由器的 RouterL3AgentBinding 行将被删除。CentralizedSnatL3AgentBinding 表将被删除。在删除之前,这些行将被迁移到 RouterL3AgentBinding 表。
应该考虑以下几种场景
向主机添加 DVR 可服务端口。
这将是对基于端口绑定的主机的特定 L3 agent 的通知。将执行查询以列出与该端口位于同一网络上的路由器内部端口。L3 agent 现在应该为每个端口承载一个分布式组件。
从主机删除 DVR 可服务端口。
这本质上是添加端口的反向操作。删除端口后,L3 agent 应该处理的路由器列表可能会减少,在这种情况下,L3 agent 应该进行清理。
L3 Agent 请求其应该承载的分布式路由器组件列表及其详细信息。它应该能够响应通知请求单个路由器,或者请求完整列表。将执行查询以列出主机上所有 DVR 可服务端口关联的网络。然后,对于每个网络,应在一个集合中收集连接的路由器。最终集合应将详细信息返回给 agent。
TODO(Carl) 还有其他情况吗?
REST API 影响¶
由于网络上的端口的增删,无法修改或查看路由器分布式部分的绑定。从一开始就应该如此。这不会改变 API 定义,但可能会影响通过 API 看到的内容。通过 API 操作这些绑定从来没有有效的用例。
安全影响¶
无
通知影响¶
将在任何路由器集中式和分布式部分之间存在歧义的情况下调整通知。必须清楚地告知 L3 agent 正在通知的类型。
其他最终用户影响¶
无
性能影响¶
此更改将修改数据库模型和查找路由器到 L3 agent 绑定的查询。对于 DVR 路由器的分布式部分,必须通过检查网络上的端口来计算绑定。在数据模型影响部分中对此进行了更详细的讨论。最初看来,不会有很大的性能影响。
IPv6 影响¶
分布式虚拟路由尚未受益于 IPv6。预计两者将共存,即分布式路由器即使不是以分布式方式运行,也应该能够正确处理 IPv6。此蓝图不会破坏此功能。
其他部署者影响¶
无
开发人员影响¶
无
社区影响¶
这简化了 DVR,使其更容易理解路由器如何绑定到 L3 agent,因为它将使用更合理的方法。
备选方案¶
我看不出还有其他方法可以使 DVR 绑定更容易理解。
实现¶
负责人¶
- 主要负责人
- 其他贡献者
工作项¶
将 DvrRouter 类拆分为两个类。
修改 RPC 消息以区分集中式和分布式组件。
修改 dvr 调度代码
TODO 稍加完善
依赖项¶
无
测试¶
Tempest 测试¶
将不会添加新的 tempest 测试。
功能测试¶
将为 L3 agent 开发功能测试,以测试 L3 agent 处理集中式和分布式路由器组件组合的情况。
API 测试¶
将不会添加新的 api 测试。
文档影响¶
无
用户文档¶
无
开发人员文档¶
无