支持由故障通知触发的 VNF 自动修复

https://blueprints.launchpad.net/tacker/+spec/support-autoheal-queue

问题描述

本文档提供了一个实现,用于支持 Tacker 和 VIM 之间使用故障通知接口的自动修复。

当 VIM 中发生故障事件时,VIM 会通过该接口向 Tacker 通知故障事件。

Tacker 主动发起自动修复。根据配置,Tacker 检查故障事件中的 faultID 属性,并确定是否应执行自动修复。如果执行自动修复,则通过 Heat 删除或创建虚拟机 [1]

故障通知接口可以被多个事件触发。为了防止对单个 VNF 调用多次修复操作,来自 VIM 到 Tacker 的故障通知请求会被打包,持续一段时间。

提议的变更

需要进行以下更改

  1. 添加 Tacker 和 VIM 之间故障通知的 RESTful API 支持

    • POST <配置的 URI 前缀>/vnf_instances/{vnf_instance_id} /servers/{server_id}/notify 用于从 VIM 向 Tacker 通知故障事件。

    • 支持对上述 API 进行排队和打包多个请求。

  2. 添加 MgmtDriver 支持,用于故障通知目标处理

    • instantiate_end

      • 通过 <ServerNotifier URI 前缀>/v2/{tenant_id}/ servers/{server_id}/alarms 通过 VIM 设置为创建的虚拟机的故障通知目标 URI。

    • terminate_start

      • 通过 <ServerNotifier URI 前缀>/v2/{tenant_id} /servers/{server_id}/alarms/{alarm_id} 删除已删除虚拟机的 alarmID。

    • scale_start

      • 在缩减规模时,通过 <ServerNotifier URI 前缀>/v2/{tenant_id} /servers/{server_id}/alarms/{alarm_id} 删除已删除虚拟机的 alarmID。

    • scale_end

      • 在扩展规模时,通过 <ServerNotifier URI 前缀>/v2/{tenant_id} /servers/{server_id}/alarms 为添加的虚拟机设置故障通知目标 URI。

    • heal_start

      • 通过 <ServerNotifier URI 前缀>/v2/{tenant_id} /servers/{server_id}/alarms/{alarm_id} 删除故障虚拟机的 alarmID。

    • heal_end

      • 通过 <ServerNotifier URI 前缀>/v2/{tenant_id} /servers/{server_id}/alarms 为添加的虚拟机设置故障通知目标 URI。

由故障通知触发的 VNF 自动修复

自动修复主要由两项服务组成。

服务器通知器是一个监控服务,可能具有每个运营商实现的专用接口,因此不包含在 Tacker 中。当服务器通知器检测到 VIM 中的故障事件时,它会将故障通知发送到 Tacker。

在 Tacker 中,VnfServerNotificationController 具有 RESTful API 的外部接口。VnfServerNotificationDriver 决定是否应执行自动修复。之后,它几乎与由 VnfLcmDriverV2 执行的手动修复相同。

由故障通知触发的自动修复操作设计

以下是故障通知触发的自动修复的示意图

                          +------------------------+
                          |                        |
                          |    Client (NFVO)       <--------+
                          |                        |        |
                          +------------------------+        | 8,18.POST VnfLcmOperationOccurrenceNotification
                                                            | 9.POST grants
                        +-----------------------------------|-------------------------------------------+
                        |                                   |                                      VNFM |
                        |  +-------------------------+ +----|----------------------------+              |
                        |  |                  Tacker | |    |                  Tacker    |              |
                        |  |                  Server | |    |                  Conductor |              |
                        |  |                         | |  +-+-------------+              |              |
                        |  |                         | |  | NfvoClient    |              |              |
                        |  |                         | |  +-^-------------+              |              |
                        |  |                         | |    |                            |              |
                        |  |     +--------------+    | |  +-+-------------+              |              |
                        |  |     | Vnflcm       +---------> ConductorV2   |              |              |
                        |  |     | ControllerV2 <--+ | |  +-+-^---+-------+              |              |
                        |  |     +--------------+  | | |    | |   |                      |              |
4.POST                  |  |             7.perform | | |    | |   | +--+ 6.check faultID,|              |
<configured URI prefix> |  |               healing | | |    | |   | |  | pack multiple   |              |
/vnf_instances          |  |                       | | |    | |   | |  | requests        |              |
/{vnf_instance_id}      |  |     +--------------+  | | |    | | +-v-+--v--------+        |   +--------+ |
/servers                |  |     | VnfServer    |  +------------+ VnfServer     +------------> Tacker | |
/{server_id}/notify     |  |     | Notification |    | |    | | | Notification  |    +-------> DB     | |
         +-----------------------> Controller   +-------------+ | Driver        |    |   |   +--------+ |
         |              |  |     +--------------+    | |    |   +---------------+    |   |   2,17.Save  |
         |              |  |                  5.post | |    |                        |   |   parameters |
         |              |  |            notification | |    |                        |   |   12.Delete  |
         |              |  |                         | |    |                        |   |   parameters |
         |              |  |                         | |    |    +--------------+    |   |              |
         |              |  |                         | |    +----> VnfLcm       +----+   |              |
         |              |  |                         | |         | DriverV2     |        |              |
         |              |  |                         | |         +----+------+--+        |              |
         |              |  |                         | | 10.heal_start|      |           |              |
         |              |  |                         | | 15.heal_end  |      |           |              |
         |              |  |                         | |   +----------v-+ +--v---------+ |              |
         |              |  |                         | |   | Mgmt       | | Infra      | |              |
         |              |  |                         | |   | Driver     | | Driver     | |              |
         |              |  |                         | |   +----+-------+ +---+--------+ |              |
         |              |  +-------------------------+ +--------|-------------|----------+              |
         |              +---------------------------------------|-------------|-------------------------+
         |       +----------------------------------------------+             |
  +------|-------|------------------------------------------------------------|--------------+
  |      |       | 1,16.Set FaultNotification destination URI                 |     VIM/NFVI |
  |      |       | 11.Delete alarmID                                          |              |
  |      |       |                                   +---------------+--------+              |
  |      |       |              13.Delete failed VNF |               | 14.Create new VNF     |
  |   +--+-------v--+                       +--------v----+   +------v------+                |
  |   | Server      | 3.Detects fault event | +--------+  |   | +--------+  |                |
  |   | Notifier    +-------------------------> VNF    |  |   | | VNF    |  |                |
  |   |             |                       | +--------+  |   | +--------+  |                |
  |   |             |                       |          VM |   |          VM |                |
  |   +-------------+                       +-------------+   +-------------+                |
  +------------------------------------------------------------------------------------------+
  • 1-2. Tacker 在 VNF 实例化时,为每个 VM 设置故障通知目标 URI 和 faultID 到 VIM(参见注释 1)。作为回报,获得一个 alarmID。然后,ServerNotifier URI 和 faultID 保存到 VnfInstance.instantiatedVnfInfo.metadata 上,获得的 alarmID 保存到 VnfInstance.instantiatedVnfInfo.vnfcResourceInfo.metadata 上。

  • 3. 服务器通知器监视并检测 VNF 上的故障事件。

  • 4-5. 服务器通知器通过故障通知接口将故障事件通知给 Tacker。VnfServerNotificationController 通过 ConductorV2 将通知转发给 VnfServerNotificationDriver。

  • 6. VnfServerNotificationDriver 检查其 faultID 属性是否包含在上述第 1 步中设置的 faultID 中。如果由多个事件发出警报,为了防止对单个 VNF 调用多次修复操作,故障事件会被打包成一个单一的修复请求,持续一段时间(参见注释 2)。

  • 7-9. 剩余过程与手动修复相同。VnfLcmDriverV2 发送 VnfLcmOperationOccurrenceNotification 并授予客户端。此过程在 [3][4] 中指定。

  • 10-12. Tacker 删除新 VNF 的 alarmID。同时,它也会从数据库 (VnfInstance.instantiatedVnfInfo.vnfcResourceInfo.metadata) 上删除 alarmID。

  • 13-14. 删除故障 VNF 并创建新的 VNF。此过程由 OpenStack 的 Heat 接口执行 [1]

  • 15-17. Tacker 为新的 VNF 设置故障通知目标 URI。同时,它也会在数据库 (VnfInstance.instantiatedVnfInfo.vnfcResourceInfo.metadata) 上保存 alarmID。

  • 18. VnfLcmDriverV2 向客户端发送 VnfLcmOperationOccurrenceNotification。此过程在 [3][4] 中指定。

注意

  1. ServerNotifier URI 和 faultID 设置在 VNF LCM 接口的 InstantiateVnfRequest.additionalParams 字段中。(参见 REST API 影响)此 additionalParams 字段在 ETSI NFV-SOL003 v3.3.1 [2] 中定义为键/值对。

  2. 当单个 VNF 同时针对其 VNFC 引发多个故障事件时,Tacker 将针对这些 VNFC 并一次性执行修复。在此修复操作中,HealVnfRequest.vnfcInstanceId 包含所有这些 VNFC。因此,VnfLcmOperationOccurrenceNotification 和授权仅执行一次。

由故障通知触发的自动修复操作的请求参数

API 详细信息在 REST API 影响 中描述。

由故障通知触发的自动修复操作的序列

以下描述了由故障通知触发的自动修复的处理流程。

../../_images/0152.png
  • 1. 服务器通知器监视并检测 VNF 上的故障事件。

  • 2-5. VNF 通过故障通知接口将故障事件通知给 Tacker。如果 faultID 无效,Tacker 会忽略它。故障事件会被临时排队。

  • 6-14. 如果由多个事件发出警报,故障事件会被打包成一个单一的请求,持续一段时间。

  • 15-16. 当计时器到期时,故障事件会被打包成一个单一的请求。

  • 17-18. VnfServerNotificationDriver 请求 VnflcmControllerV2 进行修复,并启动修复操作。

  • 19-24. Tacker 向客户端发送 VnfLcmOperationOccurrenceNotification(STARTING,PROCESSING) 并授予权限。此过程在 [3][4] 中指定。

  • 25. VnfLcmDriverV2 执行修复。

    注意

    在此修复操作中,additionalParams.all 不能由用户指定,因此只有 VNFC 本身(即不包括存储)将是修复操作的目标。有关 additionalParams.all 行为的详细信息,请参见 [3]

  • 26-27. Tacker 删除新 VNF 的 alarmID。

  • 28-31. 删除故障 VNF 并创建新的 VNF。此过程由 OpenStack 的 Heat 接口执行 [1]

  • 32-33. Tacker 为新的虚拟机设置故障通知目标 URI(参见注释)。

  • 34-35. Tacker 向客户端发送 VnfLcmOperationOccurrenceNotification(COMPLETE)。此过程在 [3][4] 中指定。

    注意

    • ServerNotifier URI 和 faultID 设置在 VNF LCM 接口的 InstantiateVnfRequest.additionalParams 字段中。(参见 REST API 影响)此 additionalParams 字段在 ETSI NFV-SOL003 v3.3.1 [2] 中定义为键/值对。

备选方案

数据模型影响

REST API 影响

VIM 发送以下 RESTful API 以向 Tacker 通知故障事件。

  • 名称:通知故障事件
    描述:当 VIM 中发生故障事件时,通知 Tacker。
    方法类型: POST
    资源的 URL:<配置的 URI 前缀>/vnf_instances/ {vnf_instance_id}/servers/{server_id}/notify
    路径参数:

    名称

    基数

    描述

    <配置的 URI 前缀>

    1

    Tacker 上通知故障事件的 URI 前缀。此参数在 tacker.conf 文件中的 fault_notification_uri 中描述。

    vnf_instance_id

    1

    VNF 实例 ID。

    server_id

    1

    VM ID。

    请求:

    数据类型

    基数

    描述

    ServerNotification

    1

    将故障信息发送到 Tacker,当 VIM 中发生故障事件时。

    属性名称 (ServerNotification)

    数据类型

    基数

    描述

    notification

    结构 (内联)

    1

    >host_id

    标识符

    0..1

    物理服务器 ID。仅在故障发生在物理服务器上时才指定。

    >alarm_id

    标识符

    1

    用于标识警报的 ID。

    >fault_id

    字符串

    1

    目标故障 ID

    >fault_type

    字符串

    1

    故障类型。“10”:物理服务器故障,“11”:物理服务器 OUS,“20”:VM 状态不一致,“21”:VM 重启检测。

    >fault_option

    KeyValuePairs

    0..1

    故障的可选信息。

    响应:

    数据类型

    基数

    响应代码

    描述

    n/a

    1

    成功:204

    当 ServerNotification 被成功接受时,应返回。

    n/a

    1

    错误: 400

    请求语法错误。

    n/a

    1

    错误:404

    服务器找不到请求的资源。

    n/a

    1

    错误:500

    服务器遇到它不知道如何处理的情况。

    n/a

    1

    错误:503

    此错误响应表示服务器在作为网关以获取处理请求所需的响应时,收到无效响应。

LCM 接口被修改为设置 ServerNotifier 的参数。

  • 名称:实例化 VNF 任务
    描述:此任务资源表示“实例化 VNF”操作。客户端可以使用此资源来实例化 VNF 实例。仅描述了此处用于 FaultNotification 的 additionalParams
    方法类型: POST
    资源的 URL:/vnflcm/v2/vnf_instances/ {vnfInstanceId}/instantiate
    请求:

    属性名称 (InstantiateVnfRequest)

    数据类型

    基数

    描述

    additionalParams

    0..1

    KeyValuePairs (内联)

    用于实例化过程的附加输入参数,特定于正在实例化的 VNF。

    >ServerNotifierUri

    1

    字符串

    ServerNotifier 的基本 Uri。后面的部分(如 通知影响 中描述的“v2/{tenant_id}/…” 部分)由 Tacker 内部添加,因此只需设置第一部分。

    >ServerNotifierFaultID

    1..N

    字符串

    字符串列表,指示要检测哪些类型的警报。

安全影响

通知影响

Tacker 发送以下通知以设置/取消设置 ServerNotifier 配置

  • 名称:从 VNFM 到 VIM 设置故障通知目标 URI
    描述:从 VNFM 到 VIM 设置故障通知目标 URI
    方法类型: POST
    资源的 URL:v2/{tenant_id}/servers/{server_id}/alarms
    路径参数:

    名称

    基数

    描述

    tenant_id

    1

    租户 ID。

    server_id

    1

    VM ID。

    请求标头:

    名称

    描述

    Authorization

    通过 Keystone 提供的访问令牌

    请求:

    数据类型

    基数

    描述

    ServerNotificationRegisterRequest

    1

    用于故障管理的 URI 和过滤器。

    属性名称 (ServerNotificationRegisterRequest)

    数据类型

    基数

    描述

    fault_action

    字符串

    0..1

    发生故障时的故障通知目标 URI。必须指定 fault_action 或 recovery_action。

    recovery_action

    字符串

    0..1

    故障恢复时的故障通知目标 URI。必须指定 fault_action 或 recovery_action。(此属性供将来使用,当前未使用。)

    fault_id

    字符串

    0..n

    目标故障 ID。

    响应:

    数据类型

    基数

    响应代码

    描述

    ServerNotificationRegisterResponse

    1

    成功: 201

    当 ServerNotificationRegisterRequest 成功注册时,应返回。

    n/a

    1

    错误: 400

    请求语法错误。

    n/a

    1

    错误:404

    服务器找不到请求的资源。

    n/a

    1

    错误:408

    服务器正在关闭其连接。

    n/a

    1

    错误:500

    服务器遇到它不知道如何处理的情况。

    n/a

    1

    错误:503

    此错误响应表示服务器在作为网关以获取处理请求所需的响应时,收到无效响应。

    属性名称 (ServerNotificationRegisterResponse)

    数据类型

    基数

    描述

    fault_action

    字符串

    0..1

    发生故障时的故障通知目标 URI。必须指定 fault_action 或 recovery_action。

    recovery_action

    字符串

    0..1

    故障恢复时的故障通知目标 URI。必须指定 fault_action 或 recovery_action。(此属性供将来使用,当前未使用。)

    fault_id

    字符串

    0..n

    目标故障 ID。

    alarm_id

    标识符

    1

    用于标识警报目标的 ID。

  • 名称:从 VNFM 到 VIM 删除 alarmID
    描述:从 VNFM 到 VIM 删除 alarmID
    方法类型:DELETE
    资源的 URL:v2/{tenant_id}/servers/ {server_id}/alarms/{alarm_id}
    路径参数:

    名称

    基数

    描述

    tenant_id

    1

    租户 ID。

    server_id

    1

    VM ID。

    alarm_id

    1

    警报 ID。

    请求标头:

    名称

    描述

    Authorization

    通过 Keystone 提供的访问令牌

    请求:

    数据类型

    基数

    描述

    n/a

    响应:

    数据类型

    基数

    响应代码

    描述

    n/a

    1

    成功:204

    当注册的资源成功删除时,应返回。

    n/a

    1

    错误: 400

    请求语法错误。

    n/a

    1

    错误:404

    服务器找不到请求的资源。

    n/a

    1

    错误:408

    服务器正在关闭其连接。

    n/a

    1

    错误:500

    服务器遇到它不知道如何处理的情况。

    n/a

    1

    错误:503

    此错误响应表示服务器在作为网关以获取处理请求所需的响应时,收到无效响应。

注意

  • 在使用上述 set/delete API 时,应通过 Keystone 提前获取访问令牌进行身份验证。

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

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

其他贡献者

Koji Shimizu <shimizu.koji@fujitsu.com>

Yoshiyuki Katada <katada.yoshiyuk@fujitsu.com>

Ayumu Ueha <ueha.ayumu@fujitsu.com>

新見雄介 <niimi.yusuke@fujitsu.com>

工作项

实现 Tacker 以支持
  • 添加新的 Rest API POST <配置的 URI 前缀>/vnf_instances/{vnf_instance_id}/servers/ {server_id}/notify 以在 VIM 中发生故障事件时向 Tacker 通知故障事件。

  • Tacker 发送 POST v2/{tenant_id}/servers/{server_id}/alarms 以使用 VIM 设置故障通知目标 URI。

  • Tacker 发送 DELETE v2/{tenant_id}/servers/{server_id}/alarms/{alarm_id} 以使用 VIM 删除故障通知目标 URI。

  • 添加 MgmtDriver 支持,用于故障通知目标 URI 处理

    • instantiate_end 设置故障通知目标 URI 并获取 alarmID。

    • terminate_start 删除 alarmID。

    • scale_start 删除 alarmID。

    • scale_end 设置故障通知目标 URI 并获取 alarmID。

    • heal_start 删除 alarmID。

    • heal_end 设置故障通知目标 URI,并使用 VIM 获取 alarmID。

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

依赖项

无。

测试

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

文档影响

  • 完整的用户指南将添加,以解释如何在故障通知触发时配置自动修复操作。

  • 更新 API 文档,以说明 REST API 影响 中提到的 API 添加项。

参考资料