如何在OpenStack中创建并部署Nova Filter Scheduler?
OpenStack Nova自定义调度过滤器完整操作流程
核心疑问先明确:文档中提及的自行创建的自定义过滤器包必须安装到nova-scheduler节点的nova服务对应Python运行环境中,否则scheduler服务无法识别加载你的自定义过滤器。
1. 自定义过滤器代码编写规范
- 首先你需要创建一个Python类,继承
nova.scheduler.filters.BaseHostFilter基类 - 必须实现
host_passes方法,方法入参为host_state(宿主机状态对象)、filter_properties(调度请求携带的参数),返回布尔值,True表示宿主机通过过滤,False表示被排除 - 可选:设置
RUN_ON_REBUILD = False(默认值),表示实例重建时不重新执行该过滤器,若有特殊需求可设为True - 简单代码示例:实现仅允许调度到总内存大于16G宿主机的过滤器
# 文件名:custom_memory_filter.py from nova.scheduler.filters import BaseHostFilter class CustomMemoryFilter(BaseHostFilter): RUN_ON_REBUILD = False def host_passes(self, host_state, filter_properties): # 取宿主机总内存,单位为MB total_mem = host_state.total_memory_mb return total_mem >= 16 * 1024
2. 代码放置与包部署
两种部署方式可选,优先推荐第一种独立包方式,避免污染原生Nova代码、升级时被覆盖:
方式一:独立Python包安装(推荐)
- 把你的过滤器代码放到一个独立Python包目录下,目录结构参考:
custom_nova_filters/ ├── __init__.py ├── custom_memory_filter.py └── setup.py
setup.py内容示例,需要声明Nova依赖以及entry point指向你的过滤器类:
from setuptools import setup, find_packages setup( name="custom-nova-filters", version="0.1", packages=find_packages(), entry_points={ 'nova.scheduler.filters': [ 'CustomMemoryFilter = custom_nova_filters.custom_memory_filter:CustomMemoryFilter', ] }, install_requires=['nova>=23.0.0'] # 对应你使用的Wallaby版本Nova的版本号即可 )
- 切换到nova-scheduler节点的Nova运行Python环境(如果是用venv部署的需要先激活venv),在
setup.py所在目录执行pip install .完成包安装。
方式二:直接放入Nova原生代码目录(不推荐)
- 直接把你的
custom_memory_filter.py文件放到Nova安装路径的scheduler/filters/目录下,默认路径一般为/usr/lib/python3.x/site-packages/nova/scheduler/filters/,无需额外打包安装。
3. 修改Nova配置生效
- 编辑nova-scheduler节点的
/etc/nova/nova.conf配置文件 - 找到
[scheduler]配置段,修改enabled_filters参数,在原有默认过滤器列表末尾加上你的过滤器类名,示例:
[scheduler] enabled_filters = ...原有默认过滤器列表...,CustomMemoryFilter # 如果你开发的是自定义权重类,同步修改weight_classes配置即可
- 保存配置文件后,重启nova-scheduler服务生效:
systemctl restart openstack-nova-scheduler
4. 功能验证
- 查看nova-scheduler日志
/var/log/nova/nova-scheduler.log,无加载错误提示即说明过滤器部署成功 - 可创建测试实例,核对调度结果是否符合你的过滤规则即可。
内容的提问来源于stack exchange,提问作者Swetank Subham
相关产品推荐
相关产品推荐

