nova-scheduler是Nova的调度器,主要作用是通过调度策略选择虚拟机实例的落点。当大规模部署时,我们需要通过定制调度策略,去满足我们的特殊需求,最典型的就是负载均衡。
nova-scheduler同nova-conductor一样,作为rpcserver对外提供rpcapi。
Icehouse版本的nova-scheduler对外暴露的rpcapi较少:
1.select_destinations 返回指定要求和过滤条件的节点列表
2.run_instance 根据请求条件和过滤属性选取出合适的节点,然后通过rpc调用节点nova-compute的run_instance api
3. prep_resize 对虚拟机实例进行resize前要先进行调度,然后通过rpc调用节点nova-compute的prep_resize api
下面分析一下run_instance的流程:
1.nova-scheduler有很多驱动,有随机节点选择调度器ChanceScheduler、过滤称重调度器FilterScheduler、带缓存调度器CachingScheduler(FilterScheduler的子类,缓存节点信息,可以加速过滤称重过程),默认使用的驱动是FilterScheduler
2.每种驱动都必须实现3个方法schedule_run_instance、select_destinations和run_periodic_tasks(可选)
3.每当nova-scheduler接收到run_instance请求时,就会调用对应驱动的schedule_run_instance方法
4.在FilterScheduler的schedule_run_instance中,会先根据request_spec请求规格和filter_properties进行过滤和称重,request_spec里面包含的信息有“要创建的实例数量“、“实例的块设备信息包括镜像id”、“使用的镜像信息”、“实例类型包括flavor信息”,“元数据”、“安全组”等,filter_properties里面则主要包括“实例的flavor信息”,下面使用代码进行说明
# 实例组: OpenStack支持对实例进行分组,这些分组有一些策略,譬如我现在要使用OpenStack的多个实例搭建一个分布式存储系统,
# 为了保证这个系统的高可用性,我希望让这些实例落在不同的主机上,那么就可以借助实例组实现
# 该方法用于判断过滤属性中是否有实例组相关参数,如果有就更新过滤属性中的属性,并返回True;反之返回False
def _setup_instance_group(context, filter_properties):
update_group_hosts = False
scheduler_hints = filter_properties.get('scheduler_hints') or {}
# 获取过滤属性中是否有group参数,可以是uuid也可以是实例组名称
group_hint = scheduler_hints.get('group', None)
if group_hint:
# 获取数据库中的InstanceGroup对象
group = instance_group_obj.InstanceGroup.get_by_hint(context,
group_hint)
policies = set(('anti-affinity', 'affinity'))
# 如果实例组的策略中有anti-affinity或者affinity,那么这就会成为