深挖Openstack Nova - Scheduler调度策略(2)

当OpenStack自带的调度算法无法满足自己的业务需求时,这时我们可以增加自定义调度器


现在有如下需求:

需求1. 同一项目的多个实例分散到不同的计算节点上;

需求2. 机柜感知 - 同一项目的多个实例分散到不同的机柜上;

需求3. 要求实例B不放在与实例A相同的节点上。


思路:

需求1:

(1)自带的ServerGroupAntiAffinityFilter过滤器可解决,创建实例时指定scheduler_hints -> group_hosts = [host1, host2],那么实例不能创建在这些host上。创建时,需要获取指定项目的其他实例所在的host,将其放入这过滤列表中。

缺点:每一次创建实例的请求都强依赖于上一次实例创建后的host,导致只能串行的一个一个创建实例。(当然可以采用预分配后创建的方式优化)

(2)采用hash算法对实例将要分配到的host节点进行预分配


需求2:

(1)客户端创建实例时指定机柜ID,机柜参数可以在Flavor里面的extra_specs中设置(key-value值)。同时,nova的instances表需要新增机柜ID字段:cabinet_id

(2)新增自定义过滤器 CabinetFilter:在/nova/scheduler/filters中添加机柜过滤策略文件cabinet_filter.py,排除不属于该机柜的节点。

过滤器代码大概如下:

class CabinetFilter(filters.BaseHostFilter):
    '''Schedule the instance on a host with a particular cabinet
    '''
    def host_passes(self, host_state, filter_properties):
        cabinet_id = filter_properties.get('cabinet_id',[])
        if cabinet_id:
            return host_state.cabinet in cabinet_id

        return True

或者不需要加过滤器,直接在/nova/scheduler/filter_scheduler.py中添加指定机柜的逻辑。但这种方法对代码侵入过多,不利于扩展。

(3)在/etc/nova/nova.conf配置文件,在scheduler_default_filters项中添加自定义的机柜过滤器CabinetFilter。


需求3:

(1)自带的DifferentHostFilter过滤器就可解决,该过滤器的作用是在创建新的实例时可以指定不在某些实例所在的节点上创建。

比如:在host1运行着vm1,当创建vm2时,指定scheduler_hints -> different_host=[vm1],那么vm2就不会在host1上创建。

你可能感兴趣的:(深挖OpenStack)