尊重 Nova 调度器过滤器

https://blueprints.launchpad.net/watcher/+spec/scheduler-filters

问题描述

此规范延续了 nova-policies 蓝图的想法。 Watcher 的一项全局业务需求是尊重 Nova 调度器过滤器,至少在亲和性/反亲和性过滤器的上下文中。 许多企业客户为其云应用程序构建 HA 架构,他们希望尊重虚拟机策略,这些策略表示为 Nova 调度器过滤器。 在 VM 启动过程中可以使用以下典型过滤器:* 将某些 VM 保留在 不同主机上(以实现 HA 兼容性)。 * 将 VM 放置在指定的宿主 聚合可用区内。 * 仅将 VM 放置在启用且 核心兼容的主机上。

目前,Nova 没有公开 API 暴露给 Nova 调度器的 select_destinations 方法。 此方法仅供 Nova 内部使用,并且从 Watcher 等第三方服务访问此方法不是好的架构实践。

用例

作为 OpenStack 操作员,我希望在考虑 Nova 调度器过滤器的情况下执行审计。

提议的变更

主要提议是添加 Watcher 过滤器可插拔系统,该系统将在审计过程中使用一组 Nova 兼容的过滤器。 我们无法直接导入它们(因为 OpenStack 项目只能导入项目客户端来相互交互),因此我们需要以 Nova 相同的方式实现每个过滤器。 Nova 调度器使用内部对象 host_statespec_obj,它们分别表示主机和实例属性。 我们可以用 CDM 中的相应节点替换这些对象。 CDM 通过通知总线系统消耗通知。 CDM 节点中属性的扩展将取决于特定的过滤器。 如果我们可以消耗有关可用区或主机聚合更改的通知,我们可以将它们添加到 CDM 作为主机属性。 否则,我们可以通过 API 调用获取它们。

主要逻辑应保存以保持与适当的 Nova 过滤器的兼容性。 让我们看一下 Nova 的 DifferentHost 过滤器

def host_passes(self, host_state, spec_obj):
    affinity_uuids = spec_obj.get_scheduler_hint('different_host')
    if affinity_uuids:
        overlap = utils.instance_uuids_overlap(host_state, affinity_uuids)
        return not overlap
    # With no different_host key
    return True

应在 decision_engine 文件夹中创建 filter 子文件夹。 它将包含 manager.py 和 filters/ 文件夹,其中包含过滤器插件。 过滤器管理器将加载启用的插件,并通过加载的插件列表将虚拟机与目标主机传递。 应将 FilterManager 类的实例添加到 BaseStrategy 类作为类属性,以便每个策略过滤 VM。 应修改策略以支持过滤器。 可以将方法 self.verify_destination(instance, host) 添加到 BaseStrategy 类以简化其在其他策略中的使用。 由于每个策略的独特工作流程,因此无法在策略中使用过滤器的通用点。

在当前情况下,这是架构设计和业务需求之间的权衡。 我建议将其视为临时解决方案,直到我们找到更好的解决方案为止。

备选方案

继续使用 Watcher 范围来隔离云集群的资源。

另一种解决方案是 enhance-watcher-applier-engine 蓝图。 我们不是采取确切的行动,而是采取所有可能的行动,并将决策交给 Nova 调度器。

数据模型影响

REST API 影响

安全影响

通知影响

其他最终用户影响

性能影响

其他部署者影响

Watcher 配置文件应包含 filters 选项,其中包含按策略启用的过滤器字典,例如

{"basic": "AvailabilityZoneFilter, DifferentHostFilter",
 "zone_migration": "AvailabilityZoneFilter"}.

默认情况下,应将 AllHostsFilter 关联到每个策略,以在不限制的情况下通过每个虚拟机。

开发人员影响

实现

负责人

主要负责人

alexchadin

工作项

  • 添加有关过滤器的文档页面

  • 更新策略开发人员的文档

  • 将过滤器管理器添加到 watcher/decision_engine/manager.py

  • 添加亲和性/反亲和性、主机聚合和可用区过滤器

  • 添加单元和功能测试

  • 更新配置文件以支持 filters 选项。

依赖项

测试

应添加适当的单元和功能测试。

文档影响

  • 添加有关过滤器的文档页面

  • 更新策略开发人员的文档

参考资料

历史