支持使用外部监控工具进行自动修复和自动伸缩的 VNFM

https://blueprints.launchpad.net/tacker/+spec/support-auto-lcm

问题描述

Zed 版本支持故障管理/性能管理 (FM/PM) 接口,以及使用外部监控工具进行自动修复和自动伸缩 [1]。但是,修复或伸缩的执行必须由 NFVO 触发。

本规范提供了一些实现,用于支持接收来自外部监控工具的告警,以及 VNFM (tacker) 驱动的自动修复和自动伸缩,无需 NFVO。此实现仅支持通过 Tacker 的 v2 API 实例化的 VNF 和 CNF。

提议的变更

需要进行以下更改

  1. 添加 AutoHeal RESTful API 以接收来自外部监控工具发送的告警。

    • POST /alert/auto_healing

  2. 修改 AutoScale RESTful API 以接收来自外部监控工具发送的告警。

    • POST /alert/auto_scaling

  3. 在配置文件中添加字段以确定是否应触发自动修复。

注意

外部监控工具是一种监控服务,不包含在 Tacker 中。运营商实施外部监控工具。外部监控工具使用指标服务,例如 Prometheus,并使用 Prometheus 插件接口触发自动修复和自动伸缩事件。

Prometheus 插件

Prometheus 插件是针对 Prometheus 特定功能的一种示例实现。在本规范中,Prometheus 插件有两个 API,用于接收 Prometheus 发送的请求,然后调用 Tacker 的修复或伸缩接口。

Prometheus 插件是一项可选功能。AutoHeal 和 AutoScale API 可以在 tacker.conf 中启用。

[prometheus_plugin]
auto_healing = True
auto_scaling = True

触发自动修复

当外部监控工具检测到 VNF 或 CNF 资源故障或问题时,它会将告警消息发送到 Tacker。Tacker 接收告警并对其进行验证。然后 Tacker 调用资源的内部修复功能。使用此修复方法来修复 VNF 或 CNF 资源的故障和问题。

修复操作的设计

以下是修复的示意图

                            +--------------------------------------------------------------------------+
                            |                                                                     VNFM |
                            |  +------------------------+  +----------------------------+              |
                            |  |                 Tacker |  |                  Tacker    |              |
                            |  |                 Server |  |                  Conductor |              |
+----------------+          |  |                        |  |                            |              |
|  External      | 2. POST  |  |         3. Check parameters and confirm vnfc_info_id   |              |
|  Monitoring    |    alert |  |  +------------+        |  |                            |  +--------+  |
|  Tool          +----------------> Prometheus +-------------------------------------------> Tacker |  |
|  (based on     |          |  |  | Plugin     |        |  |                            |  | DB     |  |
|   Prometheus)  |          |  |  +------+-----+        |  |                            |  +--------+  |
+--+-------------+          |  |         | 4. Heal      |  |                            |              |
   | 1. Collect metrics     |  |         |              |  |                            |              |
   |                        |  |  +------v-----+        |  |  +---------------+         |              |
   |                        |  |  | Vnflcm     +--------------> Vnflcm Driver +--+      |              |
   |                        |  |  | Controller |        |  |  +---------------+  |      |              |
   |                        |  |  +------------+        |  |           +---------v--+   |              |
   |                        |  |                        |  |           | Infra      +--------------+   |
   |                        |  |                        |  |           | Driver     |   |          |   |
   |                        |  |                        |  |           +------------+   |          |   |
   |                        |  +------------------------+  +----------------------------+          |   |
   |                        +----------------------------------------------------------------------|---+
   |                                                                                               |
   |                        +-----------------------------------------------------------------+    |
   |                        |                                                      Kubernetes |    |
   |                        |                  +---------------+-----------------------------------+
   |                        | 5. Delete failed |               | 6. Create new Pod            |    |
   |                        |    Pod           |               |                              |    |
   |                        |         +--------v----+   +------v------+    +-------------+    |    |
   |                        |         | +--------+  |   | +--------+  |    |             |    |    |
   +----------------------------------> | Pod    |  |   | | Pod    |  |    |             |    |    |
   |                        |         | +--------+  |   | +--------+  |    |             |    |    |
   |                        |         |      Worker |   |      Worker |    |      Master |    |    |
   |                        |         +-------------+   +-------------+    +-------------+    |    |
   |                        +-----------------------------------------------------------------+    |
   |                                                                                               |
   |                        +-----------------------------------------------------------------+    |
   |                        |                                                       OpenStack |    |
   |                        |                  +---------------+-----------------------------------+
   |                        | 5. Delete failed |               | 6. Create new VM             |
   |                        |    VM            |               |                              |
   |                        |         +--------v----+   +------v------+    +-------------+    |
   |                        |         | +--------+  |   | +--------+  |    |             |    |
   +----------------------------------> | VM     |  |   | | VM     |  |    |             |    |
                            |         | +--------+  |   | +--------+  |    |             |    |
                            |         |    Compute  |   |    Compute  |    |  Controller |    |
                            |         +-------------+   +-------------+    +-------------+    |
                            +-----------------------------------------------------------------+
  1. 外部监控工具收集指标并决定是否需要触发告警。

  2. 外部监控工具向 /alert/auto_healing 发送 POST 请求。

  3. Prometheus 插件接收告警请求并验证其内容。然后,它确认告警请求中的 vnfc_info_id 是否存在于数据库中。

  4. 触发修复操作。

  5. 指定的 VM 或 Pod 被删除。

  6. 创建新的 VM 或 Pod。

操作请求参数

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

操作顺序

以下描述了外部监控工具发送告警后 Tacker 的处理流程。

../../_images/016.png
  1. 作为外部监控工具,Prometheus 通过用户定义的规则监控指定的资源。当 Prometheus 监控的数据与规则的条件匹配时,Prometheus 会向 Tacker 发送告警。

  2. Tacker 接收到告警后,Prometheus 插件首先检查 tacker.confauto_healing 字段的值是否为 True。如果不是,则终止该过程。

  3. Prometheus 插件检查告警中 status 字段的值是否为 firing。如果不是,则终止该过程。

  4. Prometheus 插件检查告警中 function_type 字段的值是否为 auto_heal。如果不是,则终止该过程。

  5. 根据告警标签中 vnf_instance_id 的值,Prometheus 插件从数据库中获取相应的 vnf_instance

  6. Prometheus 插件检查 vnf_instance.vnfConfigurableProperties 中是否存在 isAutohealEnabled 键,并且其值为 True。如果不是,则终止该过程。

  7. Prometheus 插件检查告警请求中的 vnfc_info_id 值是否存在于 vnf_instance.vnfc_info 中。

  8. 根据 vnf_instance_idvnfc_info_id 的值,Prometheus 插件调用 vnflcm 的内部修复功能。

  9. 从这一步开始,它与默认的修复操作完全相同。

注意

默认的修复操作是 all = False,并且修复了指定的 VNFC 实例。当设置 all = True 时,将修复指定的 VNFC 实例和存储资源。

注意

当发生多个告警时,应聚合或过滤告警。此实现将防止重复的修复操作。

触发自动伸缩

当外部监控工具检测到 VNF 或 CNF 的 CPU、内存、磁盘和其他资源欠载或超载时,它会将告警消息发送到 Tacker。Tacker 接收告警并对其进行验证。然后 Tacker 调用资源的内部伸缩功能。使用此伸缩方法来平衡欠载或超载的 VNF 或 CNF 资源。

伸缩操作的设计

以下是伸缩的示意图

                            +--------------------------------------------------------------------------+
                            |                                                                     VNFM |
                            |  +------------------------+  +----------------------------+              |
                            |  |                 Tacker |  |                  Tacker    |              |
                            |  |                 Server |  |                  Conductor |              |
+----------------+          |  |                        |  |                            |              |
|  External      | 2. POST  |  |         3. Check parameters and confirm aspect_id      |              |
|  Monitoring    |    alert |  |  +------------+        |  |                            |  +--------+  |
|  Tool          +----------------> Prometheus +-------------------------------------------> Tacker |  |
|  (based on     |          |  |  | Plugin     |        |  |                            |  | DB     |  |
|   Prometheus)  |          |  |  +------+-----+        |  |                            |  +--------+  |
+--+-------------+          |  |         | 4. Scale     |  |                            |              |
   | 1. Collect metrics     |  |         |              |  |                            |              |
   |                        |  |  +------v-----+        |  |  +---------------+         |              |
   |                        |  |  | Vnflcm     +--------------> Vnflcm Driver +--+      |              |
   |                        |  |  | Controller |        |  |  +---------------+  |      |              |
   |                        |  |  +------------+        |  |           +---------v--+   |              |
   |                        |  |                        |  |           | Infra      +--------------+   |
   |                        |  |                        |  |           | Driver     |   |          |   |
   |                        |  |                        |  |           +------------+   |          |   |
   |                        |  +------------------------+  +----------------------------+          |   |
   |                        +----------------------------------------------------------------------|---+
   |                                                                                               |
   |                        +-----------------------------------------------------------------+    |
   |                        |                                                      Kubernetes |    |
   |                        |                  +---------------+-----------------------------------+
   |                        |                  |               | 5. Create or Delete Pod      |    |
   |                        |                  |               |                              |    |
   |                        |         +--------v----+   +------v------+    +-------------+    |    |
   |                        |         | +--------+  |   | +--------+  |    |             |    |    |
   +----------------------------------> | Pod    |  |   | | Pod    |  |    |             |    |    |
   |                        |         | +--------+  |   | +--------+  |    |             |    |    |
   |                        |         |      Worker |   |      Worker |    |      Master |    |    |
   |                        |         +-------------+   +-------------+    +-------------+    |    |
   |                        +-----------------------------------------------------------------+    |
   |                                                                                               |
   |                        +-----------------------------------------------------------------+    |
   |                        |                                                       OpenStack |    |
   |                        |                  +---------------+-----------------------------------+
   |                        |                  |               | 5. Create or Delete VM       |
   |                        |                  |               |                              |
   |                        |         +--------v----+   +------v------+    +-------------+    |
   |                        |         | +--------+  |   | +--------+  |    |             |    |
   +----------------------------------> | VM     |  |   | | VM     |  |    |             |    |
                            |         | +--------+  |   | +--------+  |    |             |    |
                            |         |    Compute  |   |    Compute  |    |  Controller |    |
                            |         +-------------+   +-------------+    +-------------+    |
                            +-----------------------------------------------------------------+
  1. 外部监控工具收集指标并决定是否需要触发告警。

  2. 外部监控工具向 /alert/auto_scaling 发送 POST 请求。

  3. Prometheus 插件接收告警请求并验证其内容。然后,它确认告警请求中的 aspect_id 是否存在于数据库中。

  4. 触发伸缩操作。

  5. 有两种类型的伸缩处理

    • 如果触发了伸缩操作,则在相应的 VDU 中创建 VM 或 Pod。

    • 如果触发了缩减操作,则在相应的 VDU 中删除 VM 或 Pod。

操作请求参数

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

操作顺序

以下描述了外部监控工具发送告警后 Tacker 的处理流程。

../../_images/022.png
  1. 作为外部监控工具,Prometheus 通过用户定义的规则监控指定的资源。当 Prometheus 监控的数据与规则的条件匹配时,Prometheus 会向 Tacker 发送告警。

  2. Tacker 接收到告警后,Prometheus 插件首先检查 tacker.confauto_scaling 字段的值是否为 True。如果不是,则终止该过程。

  3. Prometheus 插件检查告警中 status 字段的值是否为 firing。如果不是,则终止该过程。

  4. Prometheus 插件检查告警中 function_type 字段的值是否为 auto_scale。如果不是,则终止该过程。

  5. Prometheus 插件检查告警中 auto_scale_type 字段的值必须是 SCALE_OUTSCALE_IN。如果不是,则终止该过程。

  6. 根据告警标签中 vnf_instance_id 的值,Prometheus 插件从数据库中获取相应的 vnf_instance

  7. Prometheus 插件检查 vnf_instance.vnfConfigurableProperties 中是否存在 isAutoscaleEnabled 键,并且其值为 True。如果不是,则终止该过程。

  8. Prometheus 插件检查告警请求中的 aspect_id 值是否存在于 vnf_instance.scale_status 中。

  9. 根据 vnf_instance_idauto_scale_typeaspect_id 的值,Prometheus 插件调用 vnflcm 的内部伸缩功能。

  10. 从这一步开始,它与默认的伸缩操作完全相同。

注意

默认的伸缩操作是 numberOfSteps = 1,并且伸缩一个 VNFC 实例。

备选方案

数据模型影响

REST API 影响

以下 RESTful API 是 Tacker 特定的接口,用于 Tacker 和外部监控工具之间的自动修复。

  • 名称:发送自动修复告警事件
    描述:接收来自外部监控工具发送的自动修复告警
    方法类型: POST
    资源的 URL:/alert/auto_healing
    请求:

    数据类型

    基数

    描述

    AutoHealAlertEvent

    1

    来自外部监控工具发送的自动修复告警

    属性名称 (AutoHealAlertEvent)

    数据类型

    基数

    描述

    alerts

    结构

    1..N

    此组中所有警报对象的列表。

    >status

    字符串

    1

    定义警报是 resolved 还是当前 firing。

    >labels

    结构

    1

    要附加到警报的一组标签。

    >>receiver_type

    字符串

    1

    接收器类型:tacker

    >>function_type

    字符串

    1

    功能类型:auto_heal

    >>vnfInstanceId

    标识符

    1

    vnf 实例的标识符。

    >>vnfcInfoId

    字符串

    1

    vnfc 信息的标识符。

    >startsAt

    DateTime

    1

    警报开始触发的时间。

    >endsAt

    DateTime

    0..1

    警报的结束时间。

    >fingerprint

    字符串

    1

    可用于标识警报的指纹。

    响应:

    数据类型

    基数

    响应代码

    描述

    n/a

    成功:204

    当请求已成功读取时,应返回。

    ProblemDetails

    请参阅 [2] 的 6.4 条。

    错误: 4xx/5xx

    除了上述定义的响应代码外,ETSI GS NFV-SOL 013 [2] 的 6.4 条中定义的任何常见错误响应代码也可能返回。

以下 RESTful API 是 Tacker 特定的接口,用于 Tacker 和外部监控工具之间的自动伸缩。

  • 名称:发送自动伸缩告警事件
    描述:接收来自外部监控工具发送的自动伸缩告警
    方法类型: POST
    资源的 URL:/alert/auto_scaling
    请求:

    数据类型

    基数

    描述

    AutoScaleAlertEvent

    1

    来自外部监控工具发送的自动伸缩告警

    属性名称 (AutoScaleAlertEvent)

    数据类型

    基数

    描述

    alerts

    结构

    1..N

    此组中所有警报对象的列表。

    >status

    字符串

    1

    定义警报是 resolved 还是当前 firing。

    >labels

    结构

    1

    要附加到警报的一组标签。

    >>receiver_type

    字符串

    1

    接收器类型:tacker

    >>function_type

    字符串

    1

    功能类型:auto_scale

    >>auto_scale_type

    字符串

    1

    伸缩类型:SCALE_OUT 或 SCALE_IN

    >>vnfInstanceId

    标识符

    1

    vnf 实例的标识符。

    >>aspectId

    字符串

    1

    要伸缩的目标 VDU。

    >startsAt

    DateTime

    1

    警报开始触发的时间。

    >endsAt

    DateTime

    0..1

    警报的结束时间。

    >fingerprint

    字符串

    1

    可用于标识警报的指纹。

    响应:

    数据类型

    基数

    响应代码

    描述

    n/a

    成功:204

    当请求已成功读取时,应返回。

    ProblemDetails

    请参阅 [2] 的 6.4 条。

    错误: 4xx/5xx

    除了上述定义的响应代码外,ETSI GS NFV-SOL 013 [2] 的 6.4 条中定义的任何常见错误响应代码也可能返回。

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

开发人员影响

实现

负责人

主要负责人

Kenta Fukaya <kenta.fukaya.xv@hco.ntt.co.jp>

Yuta Kazato <yuta.kazato.nw@hco.ntt.co.jp>

其他贡献者

Koji Shimizu <shimizu.koji@fujitsu.com>

Yoshiyuki Katada <katada.yoshiyuk@fujitsu.com>

Ayumu Ueha <ueha.ayumu@fujitsu.com>

工作项

  • 实现 Tacker 以支持

    • 外部监控接口

      • 添加新的 Rest API POST /alert/auto_healing 以接收来自外部监控工具发送的自动修复告警。

      • 修改 Rest API POST /alert/auto_scaling 以接收来自外部监控工具发送的自动伸缩告警。

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

依赖项

测试

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

文档影响

  • 将添加完整的用户指南,以说明如何通过外部监控工具进行自动修复和自动伸缩。

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

参考资料