1. 楔子
从之前openstack Nova模块概览这篇文章我们可以大致知道nova-scheduler
模块的功能:在创建(或者重建)虚机时,无非是nova-api
接收到HTTP请求后,由nova-schduler
决定该请求在哪个节点具体执行。而本篇主要是基于应用及代码层面进一步学习nova-scheduler
的。
2. 调度步骤
问题来了,nova-scheduler
究竟是通过什么方式或算法来选择合适的节点来创建虚机呢?简单来说,基本上就是如下两种途径了:
- Filters:通过各种Filter筛选掉不满足要求的的主机;
- 计算权重:基于上面过滤后的结果对每个主机计算权重值,然后排序,最终选择权重值高的几个主机。
3. Filters
过滤器配置
可以通过查看控制节点
/etc/nova/nova.conf
来获取,而其中需要留意的是下面三项配置信息:scheduler-driver
: 调度驱动scheduler_available_filters
:可用的过滤器,默认所有都可用scheduler_default_filters
:实际用的过滤器过滤调度实现
下面具体从代码层面一步一步分析过滤调度是如何实现的:
/nova/conductor/manager.py
/nova/scheduler/client/__init__.py
/nova/scheduler/client/query.py
/nova/scheduler/rpcapi.py
/nova/scheduler/manager.py
/nova/scheduler/filter_scheduler.py
/nova/scheduler/host_manager.py
而函数
get_filtered_hosts
最终实现过滤调度,深挖你会发现这个函数会根据配置文件scheduler_default_filters
依次调用各个过滤器模块的host_passes
函数实现对主机的筛选,这儿就不细细赘述了。
另外注意,对于CPU、HDD、Memory等模块是允许overcommit
,具体的比例值参照配置文件。
4. 权重计算
/nova/scheduler/filter_scheduler.py
这个文件除了实现Filters筛选出符合要求的HOST外,而且也同时实现对这些HOST的权重计算。
/nova/scheduler/host_manager.py
函数
get_weighted_objects
依据不同的Weighter来计算每个HOST的权重值,而对于每个Weighter只需要实现函数_weight_object
即可,另外每种Weighter的multiplier
值通过配置文件获取。