跳转到: 导航, 搜索

Neutron/VirtualResourceForServiceChaining

问题

Neutron 有多个高级服务。但同时使用多个高级服务存在一些困难。

当前方法

有两个提案。

  • Neutron 服务的插入与链式处理
  • 服务功能链

现有方案分析

我们需要能够

  1. 指定正在使用的多个高级服务的图
  2. 为每个高级服务提供足够的配置信息

上述提案引入新的数据库对象来解决 #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 是虚拟的

  1. 获取底层路由器和高级服务
  2. 如果高级服务的组合不受支持,则引发错误
  3. 执行必要的操作 (*)
  • (*) 支持的组合可以硬编码,或者可以存在高级服务之间的 API。

限制

无法通过单个 API 调用创建高级服务链。用户需要逐步构建链。