容器网络功能 (CNF) 与 VNFM 和 CISM

https://blueprints.launchpad.net/tacker/+spec/cnf-support-with-etsi-nfv-specs

本规范描述了 Tacker 中容器网络功能生命周期管理的增强。

问题描述

基于容器的虚拟化是操作系统级别的虚拟化,而虚拟机 (VM) 是基于 hypervisor 的虚拟化。基于容器的虚拟化的优点是它对内存和 CPU 的消耗更轻。它们更易于部署、迁移和链式化。Kubernetes 是最广泛使用的容器编排平台,具有内置的可扩展性和高可用性功能。

Tacker 具有 Kubernetes 基础设施驱动程序,可以使用 VNFD 中提供的 TOSCA 定义实例化 CNF。它支持有限数量的 Kubernetes 对象。此外,它也不符合 VNF LCM API。本规范旨在添加对其他 Kubernetes 对象和 VNF LCM API 的支持。当前的 ETSI SOL 标准没有指定如何在 VNFD 中包含 CNF 定义。因此,本规范提出了一种额外的从 CSAR 包提供的工件中读取 Kubernetes 对象文件作为 CNF 定义的方法。

注意

虽然未来将支持基于 VNFD 的 CNF 定义,但它们不在本规范的范围内。

预计 NFVO 将使用规范 add-artifact-support-for-vnf-package 中提到的 API 对 CSAR 包提供的工件进行验证。NFVO 中的此类更改将是未来的工作。在本规范中,验证将在 VNFM 中执行。

提议的变更

本规范假定 CNF 部署在预安装的 Kubernetes 集群上。Kubernetes 基础设施驱动程序需要以下更改

  1. 从 additionalParams 中指定的工件加载 Kubernetes 对象文件。

  2. 支持 Kubernetes 资源种类支持 中指定的其他 Kubernetes 对象。

  3. 通过实现来自 VnfAbstractDriver 的其他方法来支持 VNF LCM API。

    • pre_instantiation_vnf

    • instantiate_vnf

    • post_vnf_instantiation

以下框图显示了涉及在预安装的 Kubernetes 集群上实例化 CNF 的组件

                                +----------------------+
+--------------------------+    |                NFVO  |
|    Instantiated CNF      |    |                      |
|                          |    +----------------------+
|  +------+      +------+  |    +----------------------+
|  | App  |      | App  |  |    |                VNFM  |
|  +------+      +------+  |    |  +-------------+     |
| +---------+  +---------+ |    |  |Infra driver |     |
| |Container|  |Container| |    |  +----+--------+     |
| +---------+  +---------+ |    |       |              |
+--------------------------+    +-------+--------------+
                                +-------+--------------+
+--------------------------+    |       v         VIM  |
|+---------+   +---------+ |    |  +----------+        |
||  CIS    |   |  CIS    |<+----+--+  CISM    |        |
|+---------+   +---------+ |    |  +----------+        |
|                          |    +----------------------+
|     Pre-installed        |
|   Kubernetes cluster     |
+--------------------------+

在这种情况下,容器基础设施服务管理 (CISM) 嵌入在 VIM 中。基础设施驱动程序将使用 CISM 在预安装的 Kubernetes 集群上实例化 CNF。容器基础设施服务 (CIS) 可以在裸机或 VM 上运行。

下图显示了在预安装的 Kubernetes 集群上实例化 CNF

                                                 +------------+
                                                 |    VNFD    |
                                                 +----+-------+     +---------------+
                                                      |             | Instantiation |
                             +-----------+       +----v-------+     | Request with  |
                             |CNF        +-----> |            |     | additional    |
                             |Definition |       |    CSAR    |     | Params        |
                             +-----------+       +--------+---+     +-+-------------+
                                                          |           |
                                                          |           |
                                              +-----------+-----------+-----------+
                                              |           v           v           |
                                              |  +----------------------+         |
                                              |  |   Tacker-server      |         |
                                              |  +-----+----------------+         |
                                              |        |                          |
                                              |        v                          |
                                              | +------------------------------+  |
                  Instantiate CNF             | |  +--------------+            |  |
       +-------------+------------------------+-+--+ Kubernetes   |            |  |
       |             |                        | |  | Infra Driver |            |  |
       v             v                        | |  +--------------+            |  |
+------------+  +-----------+                 | |                              |  |
| Container  |  | Container |                 | |                              |  |
+------------+  +-----------+                 | |                              |  |
+---------------------------+                 | |                              |  |
|     Pre-installed         |                 | |      Tacker conductor        |  |
|    Kubernetes cluster     |                 | +------------------------------+  |
+---------------------------+                 +-----------------------------------+

该图显示 Kubernetes 驱动程序将使用 YAML 格式的 Kubernetes 对象文件作为 CNF 定义在预安装的集群上实例化 CNF。VNFD 不包含任何资源信息,例如 VDU、连接点、虚拟链路,因为 CNF 的所有必需组件都将指定在 Kubernetes 对象文件中。VNFD 将仅用于标识 CNF 的风味。

示例 VNFD 文件

tosca_definitions_version: tosca_simple_yaml_1_2

description: Deployment flavour for Kubernetes Cluster with
    "pre_installed" flavour ID

imports:
  - etsi_nfv_sol001_common_types.yaml
  - etsi_nfv_sol001_vnfd_types.yaml

topology_template:
  inputs:
    descriptor_id:
      type: string
    descriptor_version:
      type: string
    provider:
      type: string
    product_name:
      type: string
    software_version:
      type: string
    vnfm_info:
      type: list
      entry_schema:
        type: string
    flavour_id:
      type: string
    flavour_description:
      type: string

  substitution_mappings:
    node_type: Company.Tacker.KubernetesCluster
    properties:
      flavour_id: pre_installed

  node_templates:
    VNF:
      type: Company.Tacker.Kubernetes
      properties:
        flavour_description: The pre_installed flavour

示例 Kubernetes 对象文件

注意

作为 CNF 定义文件的 Kubernetes 对象文件可以包含 Kubernetes 资源种类支持 部分中提到的 Kubernetes 对象的定义。示例包含 Deployment 的定义。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: curry-test001
  namespace: curryns
spec:
  replicas: 2
  selector:
    matchLabels:
      app: webserver
  template:
    metadata:
      labels:
        app: webserver
        scaling_name: SP1
    spec:
      containers:
      - env:
        - name: param0
          valueFrom:
            configMapKeyRef:
              key: param0
              name: curry-test001
        - name: param1
          valueFrom:
            configMapKeyRef:
              key: param1
              name: curry-test001
        image: celebdor/kuryr-demo
        imagePullPolicy: IfNotPresent
        name: web-server
        ports:
        - containerPort: 8080
        resources:
          limits:
            cpu: 500m
            memory: 512M
          requests:
            cpu: 500m
            memory: 512M
        volumeMounts:
        - name: curry-claim-volume
          mountPath: /data
      volumes:
      - name: curry-claim-volume
        persistentVolumeClaim:
          claimName: curry-pv-claim
      terminationGracePeriodSeconds: 0

注册 VIM

在 CNF 实例化之前,需要注册类型为 kubernetes 的 VIM。VIM 注册过程将保持不变。以下示例 vim-config.yaml 提供了注册 Kubernetes 类型 VIM 的必要信息。

auth_url: "https://172.20.20.10:6443"
username: "admin"
password: "admin"
project_name: "default"
ssl_ca_cert: None
type: "kubernetes"

此 VIM 可用于 CNF 的实例化请求。如果请求中未指定 VIM,则用户必须确保默认 VIM 的类型为 kubernetes

CNF 实例化

以下是实例化请求的示例

{
  "flavourId": "pre_installed",
  "additionalParams": {
    "lcm-kubernetes-def-files": [
      "Files/kubernetes/sample1.yaml",
      "Files/kubernetes/sample2.yaml"
    ]
  },
  "vimConnectionInfo": [
    {
      "id": "8a3adb69-0784-43c7-833e-aab0b6ab4470",
      "vimId": "7dc3c839-bf15-45ac-8dff-fc5b95c2940e",
      "vimType": "kubernetes"
    }
  ]
}

Kubernetes 驱动程序需要进行更改,以引入一种从 CSAR 包提供的工件中加载 CNF 定义的额外方法。这些工件将是一个或多个 YAML 文件。此类 Kubernetes 对象 YAML 工件文件的列表将在实例化请求的 additionalParams 中的 lcm-kubernetes-def-files 参数中提供。Kubernetes 驱动程序的 create() 方法将查找此参数并加载 Kubernetes 对象。规范 add-artifact-support-for-vnf-package 引入的表 vnf_artifacts 将用于验证工件。列表中指定的文件顺序需要保持,因为这些文件中指定的对象可能存在依赖关系。

以下序列图描述了涉及的组件和 CNF 实例化的流程

../../_images/0113.png
  1. create() 方法将获取实例化请求和 VNF 包路径作为参数。它将查找 additionalParams 中的 lcm-kubernetes-def-files 以决定从哪里获取 Kubernetes 对象文件。本规范侧重于存在此参数的情况。

    下一个序列图显示了 create() 方法的详细信息。

  2. TODO:根据讨论,已决定不会将有关容器、pod 等资源的信息存储在 vnfc_resource_info 中,因为很难将此类对象直接映射到现有的 vnfc_resource_info 结构。此决定的含义是,当用户查询 VNF 实例时,此类资源的信息将不会显示。目前仍在讨论决定在哪里存储有关 CNF 创建的资源的信息。

以下序列图显示了 Kubernetes 基础设施驱动程序中 create() 方法的运行方式

../../_images/027.png
  1. 从 Kubernetes 对象 YAML 文件中提取的定义将被转换为 Kubernetes 模型对象 [1]。将添加 KubernetesUtils 模块进行转换。

  2. Kubernetes 模型对象将传递给 Kubernetes 客户端 API [2] 以部署对象。Kubernetes 客户端的 API 将根据对象的 kind 调用。考虑到它们的依赖关系,对象部署的顺序将很重要。参考 Kubernetes API 组支持

  3. 部署对象的的信息将用于准备部署名称。部署名称将作为 instance_id 返回,以保持与 VNF LCM API 的兼容性。

以下图表显示了 CNF 将如何部署

          +-----------+ +------------------+
          |           | |Kubernetes object |
          |   VNFD    | |YAML file         |
          |           | |                  |
          +--------+--+ +---+--------------+
                   |        |
                   |        |
                   |<-------+
                   |
+---------+     +--v--------+     +-----------+     +------------+     +----------+     +----------+
|Command/ |     | VNFM      |No   | Parse k8s |     | Kubernetes |     |Kubernetes|     |Kubernetes|
|REST Api +---->|           +---->| object    +---->| Object     +---->|Python    +---->|          |
|         |     |Is CNF def |     | YAML files|  ^  |            |     |Client    |     |          |
+---------+     |VNFD Based?|     +-----------+  |  +------------+     +----------+     +----------+
                +--+--------+                    |
                   |      +-----------+          |
                   |Yes   | Parse     |          |
                   +----->| TOSCA CNF +----------+
                          | definition|
                          | from VNFD |
                          +-----------+
                          This case is out
                          of scope of this
                          spec
  • 实例化过程将通过命令或 REST API 调用调用。

  • VNFM 将根据实例化请求中的 additionalParams 处理 VNFD 和 Kubernetes 对象文件。

  • VNFD 将仅包含风味定义。

  • 将从 Kubernetes 对象 YAML 文件中提供的定义创建 Kubernetes 模型对象 [1]

  • kubernetes-client 将在 Kubernetes 集群上实例化对象。

CNF 终止

以下序列图显示了 CNF 终止的流程。

../../_images/034.png

Kubernetes 驱动程序的当前实现处理有限的对象,例如 Service、Deployment、HorizontalPodAutoscaler 等。由于本规范引入了 Kubernetes 资源种类支持 中提到的更多对象,因此 delete() API 的实现需要删除这些对象。

Kubernetes API 组支持

当前的 Kubernetes 基础设施驱动程序支持以下 API 组

  1. AutoscalingV1Api

  2. CoreApi

  3. CoreV1Api

  4. ExtensionsV1beta1Api

本规范建议添加对以下 API 组的支持

  1. AppsV1Api

  2. ApiregistrationV1Api

  3. AuthenticationV1Api

  4. AuthorizationV1Api

  5. BatchV1Api

  6. CoordinationV1Api

  7. NetworkingV1Api

  8. RbacAuthorizationV1Api

  9. SchedulingV1Api

  10. StorageV1Api

Kubernetes 资源种类支持

在本规范中,我们将支持 Kubernetes v1.16.0 和 Kubernetes python 客户端 v11.0。将支持以下 Kubernetes API。

  • API 组 core (CoreV1Api)

    API

    版本

    Container

    v1

    Pod

    v1

    Service

    v1

    ConfigMap

    v1

    Secret

    v1

    PersistentVolumeClaim

    v1

    Volume

    v1

    LimitRange

    v1

    PodTemplate

    v1

    Bindings

    v1

    ComponentStatus

    v1

    Namespace

    v1

    Node

    v1

    PersistentVolume

    v1

    ResourceQuota

    v1

    ServiceAccount

    v1

  • API 组 apiregistration.k8s.io (ApiregistrationV1Api)

    API

    版本

    APIService

    v1

  • API 组 apps (AppsV1Api)

    API

    版本

    DaemonSet

    v1

    Deployment

    v1

    ReplicaSet

    v1

    StatefulSet

    v1

    ControllerRevision

    v1

  • API 组 authentication.k8s.io (AuthenticationV1Api)

    API

    版本

    TokenReview

    v1

  • API 组 authorization.k8s.io (AuthorizationV1Api)

    API

    版本

    LocalSubjectAccessReview

    v1

    SelfSubjectAccessReview

    v1

    SelfSubjectRulesReview

    v1

    SubjectAccessReview

    v1

  • API 组 autoscaling (AutoscalingV1Api)

    API

    版本

    HorizontalPodAutoscaler

    v1

  • API 组 batch (BatchV1Api)

    API

    版本

    Job

    v1

  • API 组 coordination.k8s.io (CoordinationV1Api)

    API

    版本

    Lease

    v1

  • API 组 networking.k8s.io (NetworkingV1Api)

    API

    版本

    NetworkPolicy

    v1

  • API 组 rbac.authorization.k8s.io (RbacAuthorizationV1Api)

    API

    版本

    ClusterRole

    v1

    ClusterRoleBinding

    v1

    角色

    v1

    RoleBinding

    v1

  • API 组 scheduling.k8s.io (SchedulingV1Api)

    API

    版本

    PriorityClass

    v1

  • API 组 storage.k8s.io (StorageV1Api)

    API

    版本

    StorageClass

    v1

    VolumeAttachment

    v1

数据模型影响

表名:vnf_instantiated_info

列名

旧数据类型

新数据类型

instance_id

VARCHAR(255)

TEXT

Kubernetes 驱动程序返回的实例 ID 将是一个包含部署名称的字符串。它可以超过 255 个字符。因此,我们建议将 vnf_instantiated_info 表的 instance_id 字段的数据类型从 VARCHAR(255) 更改为 TEXT。

表名:vnf_resources

列名

旧数据类型

新数据类型

resource_name

VARCHAR(255)

TEXT

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

伊藤良人 <yoshito.itou.dr@hco.ntt.co.jp>

其他贡献者

Nitin Uikey <nitin.uikey@nttdata.com>

Tushar Patil <tushar.vitthal.patil@gmail.com>

Prashant Bhole <prashant.bhole@nttdata.com>

工作项

  • Kubernetes 基础设施驱动程序将被修改为实现

    • VNF LCM 兼容性

    • 从工件提供的定义中实例化 CNF

    • 支持其他 Kubernetes 对象

  • 添加新的单元和功能测试。

依赖项

测试

将添加单元和功能测试,以涵盖规范所需的用例。

TODO:由于假设 Kubernetes 集群将预先安装,门禁作业需要获取有关现有集群的信息并创建 kubernetes VIM。

文档影响

将添加完整的用户指南,以解释从 VNF LCM API 的角度来看 CNF 实例化和终止。

参考资料