Watcher 持续优化

https://blueprints.launchpad.net/watcher/+spec/continuously-optimization

问题描述

集群 只有在 管理员 触发后,才能通过不同的 策略 进行优化。手动启动推荐的 行动计划 并不总是合适的,因为集群的状态在不断变化。最好有两种启动审计的方式:手动触发或定期启动。我们建议在 Watcher 项目中将持续优化作为一种持续的审计对象类型包含进来。

本次更改的主要目的是设计和实现 Watcher 审计的活动模式。

此规范与蓝图相关:https://blueprints.launchpad.net/watcher/+spec/continuously-optimization

用例

作为管理员,我希望创建一个定期审计,以便能够持续优化我的云基础设施。我可以使用 –period 参数(以秒为单位)指定一个周期,例如每 600 秒启动一次审计。

作为管理员,我希望能够删除一个持续审计。

作为管理员,我希望能够更新审计的周期。

项目优先级

Newton-2 的必要功能

提议的变更

Watcher 系统使私有云管理员能够在 Openstack 集群上启动 审计,以便根据一个或多个目标对其进行优化。 审计 是一种优化请求。

有两种类型的审计
  • ONESHOT:审计将只执行一次

  • CONTINUOUS:审计将以给定的频率定期执行。

我们建议使用 APScheduler 库来调度持续审计。注意:此库已经包含在 Openstack 全局需求中。

APScheduler 提供了几种调度器实现,用于以特定间隔调度作业。与我们的需求最匹配的调度器是 BackgroundScheduler。APScheduler 提供了一个示例:BackgroundScheduler

DecisionEngineManager (watcher/decision_engine/manager.py) 类需要进行修改,以便实例化新的 ContinuousAuditManager 类。

ContinuousAuditManager 类将包含 BackgroundScheduler,以及管理持续审计的逻辑。我们还应该创建一个 ContinuousAuditJob 类,负责监督一个 审计。该类将包含 APScheduler 作业及其关联的审计。

我们可以使用 BackgroundScheduler 轻松地动态添加新的审计或删除旧的审计。因此,现有的持续审计应该在启动期间由 decision_engine 自动添加。

然后,ContinuousAuditManager 将以事件驱动的方式管理审计。为了做到这一点,我们应该修改 API 源代码文件 中的 ‘post’、‘patch’ 和 ‘delete’ 方法,以便发送即时通知消息。Watcher 生成的通知采用 JSON 格式,并放置在名为 watcher.status 的 AMQP 队列上。此参数必须可配置。

ContinuousAuditManager 将消费这些事件,以便更新审计的状态。

即时通知示例

{
"event_type": "audit.create",
 "timestamp": "2016-03-12 17:01:29.899834",
 "message_id": "1234653e-ce46-4a82-979f-a9286cac5258",
 "priority": "INFO",
 "publisher_id": "<service name >:<the host where the service runs>",
 "payload": {
    "watcher_object.namespace":"watcher",
    "watcher_object.name":"Audit",
    "watcher_object.version":"1.0",
    "watcher_object.data":{
    "audit_uuid": "840eeb3e-3486-11e6-ac61-9e71128cae77",
    "type": "CONTINUOUS",
    "state": "PENDING",
    "period": 3600
   }
 }
}
{
"event_type": "audit.update",
 "timestamp": "2016-03-12 17:01:29.899834",
 "message_id": "1234653e-ce46-4a82-979f-a9286cac5258",
 "priority": "INFO",
 "publisher_id": "<service name >:<the host where the service runs>",
 "payload": {
      "watcher_object.namespace":"watcher",
         "watcher_object.name":"Audit",
    "watcher_object.version":"1.0",
    "watcher_object.data":{
    "audit_uuid": "840eeb3e-3486-11e6-ac61-9e71128cae77",
    "type": "CONTINUOUS",
    "state": "ONGOING",
    "period": 3600
   }
 }
}
{
"event_type": "audit.delete",
 "timestamp": "2016-03-12 17:01:29.899834",
 "message_id": "1234653e-ce46-4a82-979f-a9286cac5258",
 "priority": "INFO",
 "publisher_id": "<service name >:<the host where the service runs>",
 "payload": {
      "watcher_object.namespace":"watcher",
         "watcher_object.name":"Audit",
    "watcher_object.version":"1.0",
    "watcher_object.data":{
    "audit_uuid": "840eeb3e-3486-11e6-ac61-9e71128cae77",
    "type": "CONTINUOUS",
    "state": "SUCCEEDED",
    "period": 3600
   }
 }
}

Watcher 中尚未提供通知逻辑。我们将与 watcher-notifications-ovo 蓝图一起处理此问题。因此,对于此规范的首次实现,我们将通过定期查询 watcher 数据库来管理审计,以便更新正在运行的审计及其周期。

APScheduler 还提供了将作业存储在数据库中的可能性。这样,作业将在 decision engine 重启时幸存下来并保持其状态。此功能很有趣,但对于持续 审计 的首次实现,我们将使用内存后端。

为了跟踪触发的审计,每次重新触发审计时都必须将通知推送到消息总线。当提出新的行动计划时,Watcher 应该取消所有先前生成的行动计划(和行动),因为相同的审计模板已过时,因此其状态应更改为 CANCELLED。

备选方案

  • 使用 Congress 在满足某些条件时自动触发审计。

  • 使用 cronjob 通过 python-watcherclient 定期触发新的审计。

数据模型影响

审计模型中必须有一个新的字段:整数 ‘period’。 ‘period’ 字段默认值为 3600。

REST API 影响

必须将 ‘period’ 字段添加为审计属性。

安全影响

无预期。

通知影响

无预期。

其他最终用户影响

必须在 python-watcherclient 和 watcher-dashboard 中添加对 ‘period’ 字段的支持。

性能影响

预计没有特定的性能影响。

其他部署者影响

预计没有特定的部署影响。

开发人员影响

这不会影响在 OpenStack 上工作的其他开发人员。

实现

负责人

主要负责人

Alexander Chadin <alexchadin>

其他贡献者

Vladimir Ostroverkhov <Ostroverkhov> Jean-Emile DARTOIS <jed56>

工作项

第一部分

  • 实现使用 APScheduler 的 ContinuousAuditManager。

  • 实现 ContinuousAuditJob 类。

  • 通过定期查询 watcher db 实现动态添加新的审计或删除旧的审计的逻辑。 Audit.list()

  • 调整 API 以支持 period 字段。

  • 对 python-watcherclient 进行一些更改,以添加对 period 参数的支持。

  • 添加对 watcher-dashboard 的更改以支持 CONTINUOUS 类型。

  • 实现适当的单元测试来测试各种场景。

第二部分

  • 我们需要等待 watcher-notifications-ovo 的实现才能进行此部分。

  • 在 decision engine 启动期间从 watcher 数据库加载已注册的审计。

  • 通过订阅事件实现动态添加新的审计或删除旧的审计的逻辑。

依赖项

存在与 watcher-notifications-ovo 蓝图的依赖关系。

测试

适当的单元测试将被调整以适应新的更改。

文档影响

需要添加与此更改相关的新内容。

参考资料

没有参考资料。

历史

没有历史记录。