支持 v2 LCM API 中的 CNF 修复

https://blueprints.launchpad.net/tacker/+spec/support-nfv-solv3-heal-vnf

本规范增强了 v2 Heal API,以支持 CNF。

问题描述

Yoga 版本支持 ETSI NFV SOL002 v3.3.1 [1] 和 SOL003 v3.3.1 [2] 中定义的 VNF 生命周期管理 (LCM) 操作。它还支持使用 v2 API(例如实例化 API、终止 API 和更改当前 VNF 包 API)进行 CNF 生命周期管理。

但是,v2 Heal API 尚未支持 CNF。在 v2 LCM API 中支持 CNF 可以使 Tacker 成为更强大的通用 VNFM。

提议的变更

本规范增强了以下 API 以支持 CNF。

  • 修复 VNF (POST /v2/vnf_instances/{vnfInstanceId}/heal)

CNF 修复的定义

v2 CNF 修复的定义与 v1 CNF 修复的定义相同。

对于“使用 SOL003 修复 VNF 实例”,将修复操作定义为终止和实例化 VNF。

对于“使用 SOL002 修复 VNFC”,Pod 映射到 VNFC。Pod 可以是单例,也可以使用 Kubernetes 中的 工作负载资源(例如 ReplicaSet、Deployment、DaemonSet 或 StatefulSet)创建。对于单例 Pod,删除后需要创建新的 Pod。另一方面,对于工作负载资源,Kubernetes 会自动创建新的 Pod。

v2 Heal 操作支持在 Kubernetes 中定义的以下类型。它们与 v1 Heal 操作相同。

  • Pod

  • ReplicaSet

  • Deployment

  • DaemonSet

  • StatefulSet

注意

Tacker 支持修复单例 Pod 或使用上述工作负载资源创建的 Pod。使用 Job 和 CronJob 创建的 Pod 不在范围内,因为不需要修复操作。

当用户执行“使用 SOL003 修复 VNF 实例”时,VNF 包中描述的所有 Kubernetes 资源都会被重新创建,但是对于 StatefulSet 的情况,Kubernetes 自动创建的 PersistentVolumeClaim 分配的 PersistentVolume 不会被删除。同样,在“使用 SOL002 修复 VNFC”中,只有映射到 VnfInstance.instantiatedVnfInfo.VnfcInfo.id 的具有 vnfcInstanceId 的 Pod 会被重新创建,而其他相关资源不会被删除。

注意

存储在 VnfInstance.instantiatedVnfInfo.VnfcResourceInfo.computeResource.resourceId 中的 Pod 名称可能与 Kubernetes 集群中实际的 Pod 名称不同,因为当 Kubernetes 自动修复或自动扩展工作时,Pod 名称可能会更改。在扩展和修复之前需要同步数据库。关于数据库同步的信息在 Tacker 和 Kubernetes 之间资源 ID 不匹配的错误处理 中描述。

修复操作的选项

客户端可以使用 API 请求中的 vnfcInstanceId 指定修复的目标资源。vnfcInstanceId 是一个列表,指示请求修复操作的 VNFC 实例。

此外,v2 Heal API 支持 all 选项,该选项指定除了计算资源之外,还包括网络资源和存储资源等修复目标资源。但是,此选项在 CNF 修复的情况下无效,因为 Kubernetes 无法控制单个网络和存储。

使用 vnfcInstanceId,Tacker 支持以下两种修复模式。

  • 模式 A。vnfcInstanceId 包含在请求中。
    • 它指定“使用 SOL002 修复 VNF 实例”。仅修复指定的 VNFC 实例。

  • 模式 B。vnfcInstanceId 不包含在请求中。
    • 它指定“使用 SOL003 修复 VNF 实例”。修复 VNF 实例中包含的所有 VNFC 实例。

修复操作流程

除了 InfraDriver(KubernetesDriver)处理之外,当前实现没有变化。

../../_images/0156.png

该过程包括以下步骤,如图所示

先决条件:VNF 实例处于“INSTANTIATED”状态。

  1. 客户端发送修复 VNF 实例的 POST 请求。

  2. 如果请求包含 vnfcInstanceId,VNFM 会根据 Tacker 数据库中的 VnfInstance.instantiatedVnfInfo.VnfcResourceInfo 检查相应资源的存在性。

  3. VNFM 向端点(例如客户端)发送带有“STARTING”状态的 VNF 生命周期管理操作发生通知,以指示生命周期管理操作的开始。

  4. VNFM 和 NFVO 交换授权信息。

  5. VNFM 向端点(例如客户端)发送带有“PROCESSING”状态的 VNF 生命周期管理操作发生通知,以指示生命周期管理操作的处理。

  6. MgmtDriver 根据 MgmtDriver 脚本执行预操作。

  7. KubernetesDriver 向 Kubernetes 发送删除 Pod 请求。在模式 A 的情况下,请求仅针对目标 VNFC 对应的 Pod。在模式 B 的情况下,请求针对 VNF 中的所有 Pod。

  8. 如果修复目标是单例 Pod,KubernetesDriver 会向 Kubernetes 发送创建 Pod 请求。

  9. KubernetesDriver 向 Kubernetes 发送读取资源请求以检查已修复资源的的状态。

  10. MgmtDriver 根据 MgmtDriver 脚本执行后操作。

  11. VNFM 向端点(例如客户端)发送带有“COMPLETED”状态或“FAILED_TEMP”状态的 VNF 生命周期管理操作发生通知,以指示生命周期管理操作的结果。

后置条件:VNF 实例处于“INSTANTIATED”状态,并且已修复。

注意

对于 Kubernetes 中的工作负载资源(例如 ReplicaSet、Deployment、DaemonSet 或 StatefulSet)创建的 Pod,不需要显式的创建过程,因为 Kubernetes 会自动重新生成 Pod。

Kubernetes API 支持

KubernetesDriver 调用以下 API 来修复 Pod 并检查其状态。

API 组

类型

API 方法

apps (AppsV1Api)

读取

read_namespaced_replica_set_scale

read_namespaced_deployment_scale

read_namespaced_daemon_set

read_namespaced_stateful_set_scale

删除

delete_namespaced_pod

创建

create_namespaced_pod

Read API 的参数是 namenamespace

Delete API 的参数是 namenamespacebody。在修复操作的情况下,body 未设置。

Create API 的参数是 namenamespacebody。body 包含从 Kubernetes 清单文件中设置的资源定义。

Tacker 和 Kubernetes 之间资源 ID 不匹配的错误处理

Pod 可能会使用 Kubernetes 自身的自动修复功能进行修复,而无需 Tacker 的参与。此修复操作会更改 Kubernetes 资源的名称。因此,目标 VNFC 可能无法通过先前存储为 VnfInstance.instantiatedVnfInfo.vnfcResourceInfo.computeResource.resourceId 的资源名称找到。在这种情况下,Tacker 会返回错误,并将操作状态移动到 FAILED_TEMP。

注意

仅在使用 ReplicaSet、Deployment、DaemonSet 而不是 StatefulSet 时,Kubernetes 自动修复才会更改 Kubernetes 资源的名称。

要恢复此错误,需要执行以下三个步骤:

  1. 调用 fail API 将 VnfLcmOpOcc 标记为“FAILED”

  2. 同步 Tacker 和 Kubernetes 的数据库

  3. 使用更新后的 vnfcInstanceId 调用 heal API

注意

此 SPEC 未提及同步方法。Tacker 将在未来的版本中支持此类同步功能。

注意

同步后,目标 VNFC 的 vnfcInstanceId(映射到 VnfInstance.instantiatedVnfInfo.vnfcInfo.id)会更改,因为 VnfInstance.instantiatedVnfInfo.vnfcInfo.id 基于当前实现中 Kubernetes 的资源名称。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

野口宏文 <hirofumi.noguchi.rs@hco.ntt.co.jp>

工作项

  • 实施在 Tacker-conductor 上运行的 InfraDriver 流程。

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

  • 更新 Tacker 用户指南。

依赖项

  • 修复操作

    依赖于 spec “增强 NFV SOL_v3 LCM 操作” [3]

测试

将为使用 Kubernetes VIM 的 v2 CNF 修复操作添加单元和功能测试用例。

文档影响

将在 Tacker 用户指南中添加有关 v2 CNF 修复操作的描述。

参考资料