支持使用 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 清单中的镜像参数。
提议的变更¶
我们建议进行以下更改
为修改 VNF 操作实现前导和后导操作。
VnfLcmDriver 支持 modify_start 和 modify_end,以调用 MgmtDriver 脚本提供的过程,该脚本由用户创建并包含在 VNF 包中。有关如何使用 MgmtDriver,请参阅 mgmt_driver_deploy_k8s_usage_guide。
注意
modify_start 在此用例中没有操作。
提供更新的清单文件以执行以下操作
更新 Kubernetes ConfigMap 和 Secret。
重新创建 Kubernetes Pod。
注意
镜像参数是 Pod 或 Deployment 清单中唯一可修改的参数。不支持更改除镜像以外的参数,因为它们可能与 Tacker 管理的信息不一致。
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 的操作流程如下
上载并实例化原始 VNF 包。
上载新的 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}”
属性名称 |
基数 |
参数描述 |
|---|---|---|
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
操作顺序¶
注意
上述和下面的序列描述假设 Tacker 提前获取了新的 VNF 包。
客户端向“单个 VNF 实例”资源发送 PATCH 请求。
Tacker-conductor 将修改 VNF 请求发送到 VnfLcmDriver。
VnfLcmDriver 调用 MgmtDriver 的 modify_start。
VnfLcmDriver 在 TackerDB 中将
VnfInstance.vnfdId更新为新的 VNFD 的 ID。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 时将替换镜像。
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>
工作项¶
使用 MgmtDriver 添加 Modify VNF 信息操作的前导和后导操作。
添加一个更新的清单文件,以反映 VNF 实例中的配置更改
更新 Kubernetes ConfigMap 和 Secret。
重新创建 Kubernetes Pod。
添加 Modify VNF 操作以执行以下操作
更新 TackerDB 中的 vnfdId 和 resourceId 属性。
依赖项¶
无
测试¶
将添加单元和功能测试,以涵盖规范所需的用例。
文档影响¶
将完成用户指南,以解释从 VNF LCM API 的角度修改 VNF 信息。