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 蓝图的依赖关系。
测试¶
适当的单元测试将被调整以适应新的更改。
文档影响¶
需要添加与此更改相关的新内容。
参考资料¶
没有参考资料。
历史¶
没有历史记录。