支持使用 MgmtDriver 修改正在更改的 VNF 实例

蓝图 URL: https://blueprints.launchpad.net/tacker/+spec/container-update

本规范描述了在容器更新的情况下,配置支持的 VNF 修改信息操作。

问题描述

ETSI NFV-SOL003 v2.6.1 中的 VNF 更新 API [1] 在当前的 Tacker 实现中支持更新 VNFD 本身 support-vnf-update-api-based-on-etsi-nfv-sol,但没有办法将配置更改反映到 VNF 实例。目前 MgmtDriver 中不支持 Modify VNF 操作的前导或后导操作,因此我们将通过向 MgmtDriver 添加前导和后导操作来支持对 VNF 实例的配置更改。Modify VNF 操作有很多用例,但本规范侧重于更改 Kubernetes 中 ConfigMap 和 Secret 的配置,以及更改 Pod 和 Deployment 清单中的镜像参数。

提议的变更

我们建议进行以下更改

  1. 为修改 VNF 操作实现前导和后导操作。

    • VnfLcmDriver 支持 modify_start 和 modify_end,以调用 MgmtDriver 脚本提供的过程,该脚本由用户创建并包含在 VNF 包中。有关如何使用 MgmtDriver,请参阅 mgmt_driver_deploy_k8s_usage_guide

    注意

    modify_start 在此用例中没有操作。

  2. 提供更新的清单文件以执行以下操作

    • 更新 Kubernetes ConfigMap 和 Secret。

    • 重新创建 Kubernetes Pod。

    注意

    镜像参数是 Pod 或 Deployment 清单中唯一可修改的参数。不支持更改除镜像以外的参数,因为它们可能与 Tacker 管理的信息不一致。

  3. Modify VNF 操作执行以下操作

    • TackerDB 中要更新的属性如下

      • VnfInstance.vnfdId:用新的 vnfd ID 替换现有的 vnfd ID。

      • VnfInstance.instantiatedVnfInfo.vnfcResourceInfo.computeResource.resourceId:由于 Pod 重新创建后资源 ID 会更改,因此使用新的资源 ID 更新 resourceId。

注意

在当前实现中,此 vnfd_id 参数在 conductor_server 中更新。我们将把此 vnfd_id 的更新过程从 conductor_server 移动到 VnfLcmDriver。

注意

Modify VNF 的操作流程如下

  1. 上载并实例化原始 VNF 包。

  2. 上载新的 VNF 包并修改现有的 VNF 实例。

由于上述过程,旧的 VNF 包和新的 VNF 包将同时存在。Modify VNF 操作后,用户必须删除旧的 VNF 包。

操作设计

以下是 VNF 修改信息操作的图表

                                       +---------------+ +--------+
                                       | Updated       | |  VNFD  |
                                       | manifest file | |        |
                                       +-------------+-+ +-+------+
                                                     |     |
                                                     v     v
                                                   +----------+  +------------------+
                                                   |   CSAR   |  | Modify Request   |
                                                   |          |  | with new vnfd_id |
                                                   +----+-----+  +-+----------------+
                                                        |          | 1. Modify VNF Information request
                                                        |          |
                                                  +-----+----------+--------------------------------------+
                                                  |     v          v        VNFM                          |
                                                  |  +------------------------------+                     |
                                                  |  |   Tacker-server              |                     |
                                                  |  +--+---------------------------+                     |
                                                  |     |  2. Modify VNF Information request              |
                                                  |     v                                                 |
+--------------------------+                      |  +-------------------------------------------+        |
|  TackerDB                |                      |  |                                           |        |
|                          |                      |  |    +------------------------+             |        |
|                          | 4. Update vnfdId     |  |    |  VnfLcmDriver          |             |        |
|                          |<---------------------+--+----+                        |             |        |
|                          |                      |  |    |                        |             |        |
|                          | 6. Update resourceId |  |    |                        |             |        |
|                          |<---------------------+--+----+                        |             |        |
|                          |                      |  |    |                        |             |        |
+--------------------------+                      |  |    +--+-------------------+-+             |        |
                                                  |  |       |  3. modify_start  | 5. modify_end |        |
+--------------------------+                      |  |       v                   v               |        |
|  +--------------------+  | 5-1. Replace config  |  |    +------------------------+             |        |
|  |  Kubernetes        |<-+----------------------+--+----+                        |             |        |
|  |  ConfigMap/Secret  |  |                      |  |    |  MgmtDriver            |             |        |
|  +--------------------+  |                      |  |    |                        |             |        |
|  +--------------------+  | 5-2. Replace Pod     |  |    |                        |             |        |
|  |  Kubernetes Pod    |<-+----------------------+--+----+                        |             |        |
|  +--------------------+  |                      |  |    +------------------------+             |        |
|    Kubernetes cluster    |                      |  |                                           |        |
+--------------------------+                      |  |   Tacker-conductor                        |        |
+--------------------------+                      |  +-------------------------------------------+        |
|    Hardware Resources    |                      |                                                       |
+--------------------------+                      +-------------------------------------------------------+

操作请求参数

用户将以下修改参数作为 VnfInfoModificationRequest 数据类型提供给“PATCH /vnflcm/v1/vnf_instances/{vnfInstanceId}”

VnfInfoModificationRequest 数据类型的定义

属性名称

基数

参数描述

vnfInstanceName

0..1

String. “vnfInstanceName” 属性在 “VnfInstance” 中。

vnfInstanceDescription

0..1

String. “vnfInstanceDescription” 属性在 “VnfInstance” 中。

vnfdId

0..1

Identifier. “vnfdId” 属性在 “VnfInstance” 中。

vnfConfigurableProperties

0..1

KeyValuePairs. “vnfConfigurableProperties” 属性在 “VnfInstance” 中。

metadata

0..1

KeyValuePairs. “metadata” 属性在 “VnfInstance” 中。

extensions

0..1

KeyValuePairs. “extensions” 属性在 “VnfInstance” 中。

vimConnectionInfo

0..N

map (VimConnectionInfo). “vimConnectionInfo” 属性数组在 “VnfInstance” 中。

vimConnectionInfoDeleteIds

0..N

Identifier. 从 “VnfInstance” 中的 “vimConnectionInfo” 属性数组中删除。

以下是请求体的示例

{
  "vnfdId": "093c38b5-a731-4593-a578-d12e42596b3e"
}

注意

有关 Tacker 支持的参数,请参阅规范中的 REST API 影响章节 support-vnf-update-api-based-on-etsi-nfv-sol

使用 Kubernetes 中的 ConfigMap 和 Secret

ConfigMap 和 Secret 可以通过设置环境变量或挂载到卷的方式在 Pod 中使用。以下是在使用 ConfigMap 和 Secret 时 Kubernetes 对象文件的示例。

定义 Kubernetes ConfigMap 和 Secret 的示例文件

---
apiVersion: v1
kind: ConfigMap
metadata:
  name: cm-data
data:
  cmKey1.txt: |
    configmap data
    foo
    bar
---
apiVersion: v1
kind: Secret
metadata:
  name: secret-data
stringData:
  password: 1mbb1G968fb1CUg
  secKey1.txt: |
    secret data
    baz

将 ConfigMap 和 Secret 作为环境变量使用时的 Kubernetes 对象文件示例

apiVersion: v1
kind: Pod
metadata:
  name: env-test
spec:
  containers:
  - image: alpine
    name: alpine
    env:
    - name: CMENV
      valueFrom:
        configMapKeyRef:
          name: cm-data
          key: cmkey1.txt
    - name: SECENV
      valueFrom:
        secretKeyRef:
          name: secret-data
          key: password
    envFrom:
    - prefix: CM_
      configMapRef:
        name: cm-data
    - prefix: SEC_
      secretRef:
        name: secret-data
terminationGracePeriodSeconds: 0

通过挂载到卷的方式使用 ConfigMap 和 Secret 时的 Kubernetes 对象文件示例

apiVersion: v1
kind: Pod
metadata:
  name: modify-VNF-volume-test
spec:
  containers:
  - image: alpine
    name: alpine
    volumeMounts:
    - name: cm-volume
      mountPath: /config
    - name: sec-volume
      mountPath: /etc/secrets
  volumes:
  - name: cm-volume
    configMap:
      name: cm-data
      defaultMode: 0666
      items:
      - key: cmKey1.txt
        path: cm/config.txt
  - name: secret-volume
    secret:
      secretName: secret-data
      defaultMode: 0600
      items:
      - key: secKey1.txt
        path: creds/secret.txt
terminationGracePeriodSeconds: 0

操作顺序

../../_images/0138.png

注意

上述和下面的序列描述假设 Tacker 提前获取了新的 VNF 包。

  1. 客户端向“单个 VNF 实例”资源发送 PATCH 请求。

  2. Tacker-conductor 将修改 VNF 请求发送到 VnfLcmDriver。

  3. VnfLcmDriver 调用 MgmtDriver 的 modify_start。

  4. VnfLcmDriver 在 TackerDB 中将 VnfInstance.vnfdId 更新为新的 VNFD 的 ID。

  5. VnfLcmDriver 调用 MgmtDriver 的 modify_end。modify_end 使用“kubectl replace”命令替换 ConfigMap、Secret 和 Pod。

    5-1. MgmtDriver 向 VIM(Kubernetes)发送请求以替换 ConfigMap 和 Secret 的配置。

    5-2. MgmtDriver 向 VIM(Kubernetes)发送请求以重新创建 Pod。

    注意

    理想情况下,仅重新创建引用已更改 ConfigMap 或 Secret 的 Pod,但在此时我们考虑重新创建同一包中定义的所有 Pod。从 VnfInfoModificationRequest 的数据模型角度来看,有必要继续检查哪个参数适合作为指定此参数的参数,或者是否存在为此目的的参数。

    注意

    如果 Pod 或 Deployment 清单中的镜像参数已更改,则在重新创建 Pod 时将替换镜像。

  6. VnfLcmDriver 将 VnfInstance.instantiatedVnfInfo.vnfcResourceInfo.computeResource.resourceId 更新为 TackerDB 中重新创建的 Pod 的 ID。

备选方案

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Hirofumi Noguchi<hirofumi.noguchi.rs@hco.ntt.co.jp>

Masaki Ueno<masaki.ueno.up@hco.ntt.co.jp>

其他贡献者

Yusuke Niimi<niimi.yusuke@fujitsu.com>

Yoshiyuki Katada<katada.yoshiyuk@fujitsu.com>

Ayumu Ueha<ueha.ayumu@fujitsu.com>

工作项

  1. 使用 MgmtDriver 添加 Modify VNF 信息操作的前导和后导操作。

  2. 添加一个更新的清单文件,以反映 VNF 实例中的配置更改

    • 更新 Kubernetes ConfigMap 和 Secret。

    • 重新创建 Kubernetes Pod。

  3. 添加 Modify VNF 操作以执行以下操作

    • 更新 TackerDB 中的 vnfdId 和 resourceId 属性。

依赖项

测试

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

文档影响

将完成用户指南,以解释从 VNF LCM API 的角度修改 VNF 信息。

参考资料