Neutron/VirtualResourceForServiceChaining
< Neutron
问题
Neutron 有多个高级服务。但同时使用多个高级服务存在一些困难。
当前方法
有两个提案。
- Neutron 服务的插入与链式处理
- 服务功能链
现有方案分析
我们需要能够
- 指定正在使用的多个高级服务的图
- 为每个高级服务提供足够的配置信息
上述提案引入新的数据库对象来解决 #1,但尚不清楚 #2 将如何解决。为了能够链式处理不同的服务,需要进行一些抽象,但现有的想法可能进行了过多的抽象。因此,必要的信息可能会在这种抽象中丢失。
提出的解决方案
本提案的主要思想是引入虚拟网络资源的概念。
例如,假设有一个具有防火墙配置的路由器。
========= network1
|
+-------+ +-----+
|router1|...|FWaaS|
+-------+ +-----+
|
========= network2
将 router1 和 FWaaS 的组合赋予一个新的路由器 UUID,并让它命名为 vrouter1。使用 vrouter1 作为 router_id 定义另一个高级服务是微不足道的。
========= network1
|
+-----------------------+
| | vrouter1 |
| +-------+ +-----+ | +------------------+
| |router1|...|FWaaS| |...|other adv. service|
| +-------+ +-----+ | +------------------+
+-----|-----------------+
|
========= network2
对于 L2VPN,配置的 L2VPN 服务可以拥有一个虚拟网桥 UUID。然后可以使用 virtual bridge_id 定义另一个高级服务。
network1 network2
=========== ===========
| |
+-----------------------+
| | | | +-------------------------------+
| +------l2vpn-------+ |........| firewall, tapping device, etc.|
| | +-------------------------------+
+-----------------------+
vbridge
数据库变更
路由器将获得这些额外的列
| name | type | description |
|---|---|---|
| parent_id | uuid 或 none | 底层路由器的 ID |
| service_type | 字符串 | FIREWALL, VPN 等 |
| service_id | uuid 或 none | 代表特定的高级服务。可能需要 (可以从 parent_id 和 service_type 推断吗?) |
高级服务变更
在插件调用时,如果给定的 router_id 是虚拟的
- 获取底层路由器和高级服务
- 如果高级服务的组合不受支持,则引发错误
- 执行必要的操作 (*)
- (*) 支持的组合可以硬编码,或者可以存在高级服务之间的 API。
限制
无法通过单个 API 调用创建高级服务链。用户需要逐步构建链。