支持由故障通知触发的 VNF 自动修复¶
https://blueprints.launchpad.net/tacker/+spec/support-autoheal-queue
问题描述¶
本文档提供了一个实现,用于支持 Tacker 和 VIM 之间使用故障通知接口的自动修复。
当 VIM 中发生故障事件时,VIM 会通过该接口向 Tacker 通知故障事件。
Tacker 主动发起自动修复。根据配置,Tacker 检查故障事件中的 faultID 属性,并确定是否应执行自动修复。如果执行自动修复,则通过 Heat 删除或创建虚拟机 [1]。
故障通知接口可以被多个事件触发。为了防止对单个 VNF 调用多次修复操作,来自 VIM 到 Tacker 的故障通知请求会被打包,持续一段时间。
提议的变更¶
需要进行以下更改
添加 Tacker 和 VIM 之间故障通知的 RESTful API 支持
POST <配置的 URI 前缀>/vnf_instances/{vnf_instance_id} /servers/{server_id}/notify 用于从 VIM 向 Tacker 通知故障事件。
支持对上述 API 进行排队和打包多个请求。
添加 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] 中指定。
注意
ServerNotifier URI 和 faultID 设置在 VNF LCM 接口的
InstantiateVnfRequest.additionalParams字段中。(参见 REST API 影响)此 additionalParams 字段在 ETSI NFV-SOL003 v3.3.1 [2] 中定义为键/值对。当单个 VNF 同时针对其 VNFC 引发多个故障事件时,Tacker 将针对这些 VNFC 并一次性执行修复。在此修复操作中,
HealVnfRequest.vnfcInstanceId包含所有这些 VNFC。因此,VnfLcmOperationOccurrenceNotification 和授权仅执行一次。
由故障通知触发的自动修复操作的请求参数¶
API 详细信息在 REST API 影响 中描述。
由故障通知触发的自动修复操作的序列¶
以下描述了由故障通知触发的自动修复的处理流程。
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 添加项。