网络服务描述符中的 VNF 转发图支持

https://blueprints.launchpad.net/tacker/+spec/vnffg-ns

本文档描述了将 VNF 转发图 (VNFFG) 支持添加到 Tacker 网络服务编排 (NSO) 的计划。目前,Tacker 包含一个 NSO 功能,可以使用 NSD 一次部署一组 VNF [1]。Tacker 还支持 VNFFG,但它用作单独的 VNFFGD 模板模式,无法启动 VNF。本文档的目的是通过 NSD 添加对流量流和 VNFFG 的支持。

问题描述

            +-----------------------------------------------------+
            |            +----------------------------+           |
            |            |            VNFFG           |           |
            |            | +--------+      +--------+ |           |
   +-------+|            |/| VNF 2A |      | VNF 2B |\|           |
  / End   / |            / +--------+      +--------+ \           |
 / Point / \|           /|       \            /       |\          |
+-------+   \          / |        \          /        | \         |
            |\ +-------+ |         \        /         | +-------+ |
            | \| VNF 1 | |         +--------+         | | VNF 3 | |
            |  +-------+ |         | VNF 2C |         | +-------+ |
            |            |         +--------+         |           |
            |            +----------------------------+           |
            +-----------------------------------------------------+

NFV 社区希望能够使用 NSD 模板编排和管理网络流量。添加对 VNFFG 的支持是网络服务的重要组成部分,它描述了互连的 VNF 图。通过转发路径元素控制 VNFFG 中的流量,该元素还包括策略,用于确定哪些流量可以遍历图中连接的 VNF 的转发路径。NSD 包含网络服务中所有 VNF 的描述,这些 VNF 如何通过虚拟链路 (VL) 元素(第二层连接)连接,以及描述流量应如何流动的 VNFFG。

为了实现由单个 NSD 驱动的完整 NSO,本文档旨在通过将 VNFFG 集成到 NSO 来解决 NSO 功能缺失的问题。

注意事项

  • 本文档侧重于将 VNFFG 集成到 NS 中,并且在 VNFFG 的当前实现中,仅支持一条路径。

  • VNFFG 的未来工作将添加对多条路径的支持。然后 NS 将能够根据所需的流量流包含通过图的多个路径。

背景知识

NS 中如何支持 VNF

首先,我们需要导入 VNFD,然后在 NSD 中导入导入的 VNFD。

带有 NSD 的 VNF 的基本 tosca 模板

tosca_definitions_version: tosca_simple_profile_for_nfv_1_0

description: Import VNFDs(already on-boarded)
imports:
  - VNFD1
  - VNFD2
topology_template:
  node_templates:
    VNF1:
      type: tosca.nodes.nfv.VNF1

    VNF2:
      type: tosca.nodes.nfv.VNF2

实例化此 NSD 时,nfvo_plugin 从 DB 中检索这些 VNFD,生成 mistral 工作流,然后执行这些工作流。

接下来,mistral 调用 tacker 的 API 以根据工作流实例化 VNF [2]

拟议的变更

引入一个新的模板来描述网络服务,其拓扑包含 VNF、连接点、虚拟链路、转发路径和 VNF 转发图。未来的工作将添加对多个转发路径的支持,并且 groups 属性将包含一组 VNFFG。

                 TOSCA                                        NFV
+------------------------------------------+         +--------------------+
|                                          |         |                    |
|           Service Template  <------------------------+ Network Service  |
|                                          |         |   Descriptor (NSD) |
| +-------------------+                    |         |                    |
| | Topology template |   +-------------+  |         |     +----------+   |
| |  +---------+      |   | Node types  <------------------+   VNFD   |   |
| |  |  Node   <----------+substitutable|  |         |     +----------+   |
| |  | Template|      |   +-------------+  |         |                    |
| |  +---------+      |                    |         |     +----------+   |
| |  +---------+      |   +-------------+  |      +--------+   VLD    |   |
| |  |  Node   <----------+ Node types  <---------+  |     +----------+   |
| |  | Template|      |   +-------------+  |         |                    |
| |  +---------+      |                    |         |     +----------+   |
| |  +---------+      |   +-------------+  |      +--------+  VNFFGD  |   |
| |  |  Node   <----------+ Group types <---------+  |     +----------+   |
| |  | Template|      |   +-------------+  |         |                    |
| |  +---------+      |                    |         |     +----------+   |
| |  +---------+      |                    |      +--------+   PNFD   |   |
| |  |  Node   |      |   +-------------+  |      |  |     +----------+   |
| |  | Template<----------+ Node types  <---------+  |                    |
| |  +---------+      |   +-------------+  |         +--------------------+
| |                   |                    |
| +-------------------+                    |
|                                          |
+------------------------------------------+

需要进行多项更改,包括对 tacker 客户端、Horizon 和服务器的更改。

+--------------------------------------------+
|     +------------------+                   |
|     |Client Application|                   |
|     +--------+---------+                   |
|              |                             |
|       +------v-----+                       |
|       |  NFVO NS   +----------------+      |
| +-----+    API     |                |      |
| |     +------+-----+             +--v---+  |
| |            |                   | VNFM |  |
| |            |                   +---+--+  |
| |            |                       |     |
| | +----------v---------------+   +---v--+  |
| | |Network Service Descriptor|   | VNFs |  |
| | +--------------------------+   +------+  |
| +-------------+                            |
|               |                            |
|       +-------v--------+                   |
|       |     VNFFGs     |                   |
|       +----------------+                   |
+--------------------------------------------+

VNF 映射

VNF 映射功能是在 VNFFG 中引入的。此功能允许操作员决定在实例化 VNFFG 时使用哪些特定的 VNF 实例。VNF 映射是编排器的选择。VNF 的默认映射将基于随机选择。

在 NSO 中,VNF 由 NSO 实例化,因此我们可以将新创建的 VNF 用于 VNFFG。

VNFFGD 更改

VNFFG 创建

支持 VNFFGD 的建议方法是在 NSD 中定义 VNFFGD

带有 NSD 的 VNFFG 的建议 tosca 模板

tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0

description: Import VNFDs(already on-boarded) with input parameters
imports:
    - sample-vnfd1
    - sample-vnfd2

topology_template:
  inputs:
    vl1_name:
      type: string
      description: name of VL1 virtuallink
      default: net_mgmt
    vl2_name:
      type: string
      description: name of VL2 virtuallink
      default: net0
    net_src_port_id:
      type: string
      description: neutron port id of source port
    ip_dest_prefix:
      type: string
      description: IP prefix of destination port

  node_templates:
    VNF1:
      type: tosca.nodes.nfv.VNF1
      requirements:
        - virtualLink1: VL1

    VNF2:
      type: tosca.nodes.nfv.VNF2

    VL1:
      type: tosca.nodes.nfv.VL
      properties:
        network_name: {get_input: vl1_name}
        vendor: tacker

    VL2:
      type: tosca.nodes.nfv.VL
      properties:
        network_name: {get_input: vl2_name}
        vendor: tacker

    Forwarding_path1:
      type: tosca.nodes.nfv.FP.TackerV2
      description: creates path inside ns (src_port->CP12->CP22->dst_port)
      properties:
        id: 51
        policy:
          type: ACL
          criteria:
            - name: block_tcp
              classifier:
                network_src_port_id: {get_input: net_src_port_id}
                destination_port_range: 80-1024
                ip_proto: 6
                ip_dst_prefix: {get_input: ip_dest_prefix}
        path:
          - forwarder: sample-vnfd1
            capability: CP12
          - forwarder: sample-vnfd2
            capability: CP22

    Forwarding_path2:
      type: tosca.nodes.nfv.FP.TackerV2
      description: creates path inside ns (src_port->CP12->dst_port)
      properties:
        id: 52
        policy:
          type: ACL
          criteria:
            - name: block_tcp
              classifier:
                network_src_port_id: {get_input: net_src_port_id}
                destination_port_range: 8080-8080
                ip_proto: 6
                ip_dst_prefix: {get_input: ip_dest_prefix}
        path:
          - forwarder: sample-vnfd1
            capability: CP12

  groups:

    VNFFG1:
      type: tosca.groups.nfv.VNFFG
      description: HTTP to Corporate Net
      properties:
        vendor: tacker
        version: 1.0
        number_of_endpoints: 2
        dependent_virtual_link: [VL1, VL2]
        connection_point: [CP12, CP22]
        constituent_vnfs: [sample-vnfd1, sample-vnfd2]
      members: [Forwarding_path1]

    VNFFG2:
      type: tosca.groups.nfv.VNFFG
      description: HTTP to Corporate Net
      properties:
        vendor: tacker
        version: 1.0
        number_of_endpoints: 1
        dependent_virtual_link: [VL1]
        connection_point: [CP12]
        constituent_vnfs: [sample-vnfd1]
      members: [Forwarding_path2]

要从此 NSD 实例化 NS,nfvo_plugin 从 NSD 中提取 VNFGD,生成 mistral 工作流,然后执行这些工作流。

VNFFG 列出

通过 NSD 创建的 VNFFG 然后将在以下命令的结果中可用。

openstack vnf graph list

VNFFG 更新

我们可以使用 NSD 更新通过 NSD 创建的 VNFFG。

NSO 更改

Tacker 的当前实现缺乏更新 NS 的能力。更新功能将在未来支持。

openstack ns update --nsd-template <NSD template to update NS> <NS name or id>

如上所述,可以通过此方法更新 VNFFG。

由于 networking-sfc 不支持 NSH(网络服务标头),因此在我们可以为 VNFFG 创建流分类器之前,需要提供 neutron port-ids 信息 [3]。这将增加通过 NSD 实现创建网络和 VNFFG 的复杂性。因此,在本文档中,我们将仅关注通过 NSD 创建 VNFFG,并要求提前提供所有网络。未来的工作将添加对通过 NSD 创建网络的支持。

备选方案

数据模型影响

  • 需要更新 NS 的数据模型,以包含它包含的 VNFFG 列表。

  • VNFFG 数据模型已经存在,可以跟踪每个 VNFFG 属于的转发路径和 VNF。将添加一个新的列名 ns_id 以跟踪 VNFFG 属于的 NS。如果该 VNFFG 不属于任何 NS,则该 VNFFG 的 ns_id 列的值将为空。

  • 对于 VNFFGD,也将添加一个新的列名 nsd_id 以标识它所属的 NSD。

REST API 影响

当前的 REST API 包含查询 VNFFG 对象及其子组件的功能。NS 的 REST API 的更改将包括返回与该 NS 实例关联的 VNFFG。

JSON 请求和响应示例

GET /v1.0/nss/{ns_id}

显示 ns - 显示指定 ns id 的信息。

  • show_res

{
    "ns": {
        "name": "NS_vnffg_demo"
        "description": "ns vnffg demo",
        "status": "ACTIVE",
        "created_at": "2018-07-19 01:28:36",
        "tenant_id": "a7f7c7a319ab4b6bb5217712e8e62c38",
        "vim_id": "8010ece7-0e9a-420f-8ec9-08d87304f7fd",
        "updated_at": "2018-07-19 01:30:23",
        "mgmt_urls": "{'VNF2': {'VDU1': '192.168.120.7'},
                       'VNF1': {'VDU1': '192.168.120.3'}}",
        "vnf_ids": "{'VNF2': '28f957ea-4cdb-4611-9b3d-25f5711d88b6',
                     'VNF1': '287a0084-7ddf-4682-b286-20304a143078'}",
        "error_reason": null,
        "vnffg_ids": "{'VNFFG2': '23268756-ea57-4958-aa19-493c8d697bbf',
                       'VNFFG1': '69683863-d3da-4ff1-badc-f16ca36b40e5'}",
        "nsd_id": "2ab5c205-e526-4176-a22e-219242346dab",
        "id": "26257a53-e0c2-423f-9385-0ff5ccc02839",
    }
}

安全影响

通知影响

其他最终用户影响

对最终用户没有影响。行为将与以前的 ns 操作相同。vnffg 的支持将在 ns 内部支持。根据以前的 ns CRUD 操作行为,我们首先需要创建 vnfd 并提及 nsd 模板中的 vnfd 名称。示例 CLI 调用

首先创建所需的 VNFD

openstack vnf descriptor create --vnfd-file <tosca vnf1 yaml file> VNFD1

openstack vnf descriptor create --vnfd-file <tosca vnf2 yaml file> VNFD2

openstack vnf descriptor create --vnfd-file <tosca vnf3 yaml file> VNFD3

提及 nsd 模板中的 vnfd 名称

imports:
    - VNFD1
    - VNFD2
    - VNFD3

创建 NSD

openstack ns descriptor create --nsd-file samples/nsd/tosca-vnffg-nsd.yaml NSD1

创建 NS

openstack ns create --nsd-name NSD1 --param-file <PARAM-FILE> NS1

性能影响

开发人员影响

Mistral 将用于从 NS 生成 VNFFG,请按照以下步骤操作

1. 从导入的 VNF 或通过 NSD 创建的 VNF 获取 vnf-mapping 参数,并将其用作 VNFFG 创建函数的参数。

2. 从 NS 模板中提取嵌套的 VNFFG 模板(类似于嵌套的 Heat 模板,我们可以提取 groups 属性及其成员中的转发路径)。

3. 使用 Mistral 工作流直接从上述 VNFFG 模板创建 VNFFG(无需创建 VNFFGD)。

+---------------------------------------------+
|     +------------------+                    |
|     |Client Application|                    |
|     +--------+---------+                    |
|              |              +-------------+ |
|        +-----v----+         |  Workflow   | |
|        | NFVO:NSD +--------->  Generator  | |
|        +-----+----+         +---------+---+ |
|              |                        |     |
|              |                        |     |
|              |                        |     |
| +------------v-------------+     +----v---+ |
| |Network Service Descriptor|     | Mistral| |
| +--------------------------+   +-+----+---+ |
|                                |      |     |
|                    +--------+  |  +---v--+  |
|                    | VNFFGs <--+  | VNFs |  |
|                    +--------+     +------+  |
+---------------------------------------------+

网络服务创建过程如下所示

             +------------------------+
             |                        |
             |      NSD template      |
             |                        |
             |                        |
             +------------------------+
                         | extract templates
     +-------------------v---------------+
     |                                   |
+----v------------+            +---------v------+
|                 |            |                |
| VNFFGD templates|            |      VNFDs     |
|                 |            |                |
+----+------------+            +---------+------+
     |                                   |    create VNFs
     |                +-----------+------+-----------------+
     |                |           |                        |
     |                |           |                        |
     |           +----v---+   +---v----+              +----v---+
     |           |  VNF1  |   |  VNF2  |              |  VNFn  |
     |           +----+---+   +---+----+              +----+---+
     |                |           |                        |
     |                | +---------+                        |
     |                | | +--------------------------------+
     |                | | |
     |                | | |on-success
     |                | | |
     |            +---v-v-v---------+
     |            |      VNFFGs     |
     +------------>    (optional)   |
    create VNFFGs |                 |
                  +-----------------+

实现

负责人

主要负责人

Cong Phuoc Hoang <hoangphuocbk2.07@gmail.com>

其他贡献者

Tim Rozet <trozet@redhat.com>

Yan Xing an<yanxingan@cmss.chinamobile.com>

Dharmendra Kushwaha <dharmendra.kushwaha@india.nec.com>

Trinh Nguyen <dangtrinhnt@gmail.com>

工作项

  1. 在 NS 中添加对“vnffg”的支持的更改。

  2. tackerclient 中的 CLI 更改

  3. 添加单元测试。

  4. vnffg-ns 的用户指南文档。

  5. 添加 devref 以记录 NSD 中 VNFFG 的工作方式

依赖项

测试

文档影响

将添加 Devref 指南,以描述 NSD 功能中的 vnffg 支持、操作和示例。

参考资料