支持 Kubernetes VIM 的多租户

https://blueprints.launchpad.net/tacker/+spec/k8s-namespace

问题描述

ETSI NFV-SOL003 VNF 生命周期管理,适用于 Kubernetes VIM 上的 CNF,在 Wallaby 版本中得到支持,例如实例化 [1]、伸缩 [2] 和修复 [3],但未提供使用指定命名空间的这些操作。本规范提出针对具有指定命名空间的 CNF 的 VNF 生命周期管理操作。用户应该是绑定到 ClusterRoles 作为管理员或绑定到 Roles 作为普通用户的 ServiceAccount。

提议的变更

ETSI NFV-SOL003 VNF 生命周期管理 2.6.1 中的实例化操作 [4] 允许用户在 InstantiateVnfRequest 中指定目标命名空间,以便在 Kubernetes VIM 上部署 CNF。additionalParams 字段提供了一个新的参数 namespace 用于目标命名空间。

注意

VNF 实例应该位于单个命名空间中。可以将多个 Kubernetes 资源作为 VNF 实例部署,但它们应该在同一个命名空间中管理。

CNF 的 LCM 操作需要以下更改

  1. CNF 实例化

    • 将命名空间字段添加到 InstantiateVnfRequest

    • 添加逻辑,在 Kubernetes InfraDriver 中使用指定的命名空间。

    • 将指定的命名空间存储在 Tacker DB 中。

    注意

    命名空间存储在 VnfResource.resource_nameVnfInstance.instantiatedVnfInfo.vnfcResourceInfo.metadata 中。本规范建议将它们聚合到 VnfInstance.metadata 中,以便更轻松地在 Tacker DB 中管理命名空间。

    注意

    GET /vnf_instances/{vnfInstanceId}/ 的响应中应描述指定的命名空间。

  2. CNF 伸缩

    • 添加逻辑,在 VnfInstance 表中获取存储的命名空间。

    注意

    需要设计如何在实例化后管理命名空间。这可能不需要。

  3. CNF 修复

    • 添加逻辑,在 VnfInstance 表中获取存储的命名空间。

    注意

    需要设计如何在实例化后管理命名空间。这可能不需要。

  4. CNF 终止

    • 添加逻辑,在 VnfInstance 表中获取存储的命名空间。

使用指定命名空间进行 CNF 实例化

下图显示了使用指定命名空间的 CNF 实例化示意图

                                +----------+
                                |          |
                                |  VNFD    |
                                |          |
                                +-+--------+
                                  |
                                +----------------+  +--------v-+ +------------------+
                                | CNF Definition |  |          | | Instantiation    |
                                | File           +-->   CSAR   | | Request with     |
                                |                |  |          | | additionalParams |
                                +----------------+  +------+---+ +--+---------------+
                                                           |        |
                                                           |        | 1. Request
                                                           |        |    with namespace
+------------------------------+                    +-----------------------------+
| CNF                          |                    |      |        |       VNFM  |
|                              |                    |   +--v--------v----+        |
|  +----------+  +----------+  |                    |   | TackerServer   |        |
|  | Pod      |  | Pod      |  |                    |   +------+---------+        |
|  |          |  |          |  |                    |          |                  |
|  +----------+  +----------+  |                    |   +---------------------+   |
+------------------------------+                    |   |      |              |   |
                                                    |   |  +-v-+----------+   |   |
+------------------------------+                    |   |  | VnflcmDriver |   |   |
| Kubernetes cluster VNF       |                    |   |  |              |   |   |
|                              |                    |   |  +-+-^----------+   |   |
|  +----------+  +----------+  |                    |   |    | | 3. Store     |   |
|  |    VM    |  |    VM    |  | 2. Set namespace   |   |    | |    namespace |   |
|  | +------+ |  | +------+ |  |    in K8s API call |   |  --v-+----------+   |   |
|  | |Worker| |  | |Master+<-------------------------------+ Kubernetes   |   |   |
|  | +------+ |  | +------+ |  |                    |   |  | InfraDriver  |   |   |
|  +----------+  +----------+  |                    |   |  +--------------+   |   |
|                              |                    |   |                     |   |
+------------------------------+                    |   |    Tacker Conductor |   |
                                                    |   |                     |   |
+------------------------------+                    |   +---------------------+   |
| Hardware Resources           |                    |                             |
+------------------------------+                    +-----------------------------+
  1. 指定的命名空间在 InstantiateVnfRequest 中发送。

  2. Kubernetes InfraDriver 使用指定的命名空间调用 K8s API。

  3. VnflcmDriver 将命名空间存储在数据库中。

示例输入参数

在 ETSI NFV-SOL003 v2.2.6 中定义的 InstantiateVnfRequestadditionalParams 参数中添加了一个名为 namespace 的新属性 [4]。现有 CNF 操作的其他参数无需更改。

属性名称

参数描述

namespace

Kubernetes API 调用的命名空间。如果不存在,则使用资源文件中的命名空间。

以下是一个示例

{
  "flavourId": "simple",
  "additionalParams": {
    "lcm-kubernetes-def-files": [
      "Files/kubernetes/pod.yaml"
    ],
    "namespace": "namespaceA"
  },
  "vimConnectionInfo": [
    {
      "id": "8a3adb69-0784-43c7-833e-aab0b6ab4470",
      "vimId": "specified by response of vim list",
      "vimType": "kubernetes"
    }
  ]
}

使用指定命名空间的 CNF 实例化序列

../../_images/0140.png

该过程包含上述步骤。

  1. 客户端发送实例化请求。

  2. 与 Wallaby 版本中的步骤相同,直到调用 KubernetesInfraDriver。

  3. KubernetesInfraDriver 使用指定的命名空间调用 Kubernetes API

    1. Kubernetes 客户端发送带有 InstantiateVnfRequest.additionalParams 中命名空间的请求。如果未提供命名空间,则使用 Kubernetes 资源文件中的命名空间。

    2. KubernetesInfraDriver 将命名空间添加到 TackerDB 中的“vnf_resources”表中。

      注意

      存储在“vnf_resources”表中的 namespace 在 CNF 的伸缩、修复和终止操作中使用。

数据模型影响

如上所述,存储在 Tacker DB 中的命名空间将通过此实现聚合到 VnfInstance.vnf_metadata 中。这些字段将更改如下

  • VnfResource.resource_name

    • 此字段包含以逗号分隔的命名空间和资源名称,但本规范将仅存储资源名称。

  • VnfInstance.instantiatedVnfInfo.vnfcResourceInfo.metadata

    • 本规范未修改此字段,但 Tacker 将不再引用它。

注意

“vnf_instances”表中的 metadata 字段定义为 JSON。无需更改,但值得注意的是,metadata 字段实现为 vnf_metadata

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

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

其他贡献者

Tatsuhiro Furuya <tatu.furuya@fujitsu.com>

Yoshiyuki Katada <katada.yoshiyuk@fujitsu.com>

Ayumu Ueha <ueha.ayumu@fujitsu.com>

陆梁 <lu.liang@fujitsu.com>

工作项

  • 实现以支持

    • 在 CNF 实例化时指定目标命名空间,以便在 Kubernetes VIM 上部署 CNF。

    • 在 CNF 实例化时将指定的命名空间存储在 Tacker DB 中。

    • 从 Tacker DB 获取指定的命名空间,并在 CNF 伸缩和修复时使用它。

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

依赖项

测试

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

文档影响

用户指南将被修改,以解释针对具有指定命名空间的 CNF 的 VNF 生命周期管理操作。

参考资料