关于创建虚拟机,收到一个需求,是希望通过单纯地指定flavor来确定该虚机被创建的区域,于是做了些小研究,阅读了些源码,记录一下。
如果不知道nova如何确定在哪台Host上创建虚机的过程,请查看这篇文档 资源池物理主机分组方案 , 读完后,您的脑海中应该会有一个filter_properties的概念,这个对物理Host的选择, 起到至关重要的作用。那么它的属性都是哪些因素决定的呢?
阅读源码得知,filter_properties的组成大致如下:
instance_type : 调用get_flavor_by_flavor_id 和传入的flavor相关
availability_zone : nova boot 时传入的 --availability-zone
scheduler_hint: nova boot 时传入的 --hint
get_flavor_by_flavor_id 返回的就是flavor的extra_specs属性,如此我们便可通过flavor来改变filter_properties,进而控制物理Host的选择策略。
filter_properties可以改变了,但是我们还差左后一步,我们需要一个Filter来处理传入的参数。 好在,强大的openstack社区已经给我们准备好了,只不过这个Filter并不是默认生效的,您需要在配置中开启,了解他的原理请看scheduler/filters/aggregate_instance_extra_specs.py的代码。
创建一个新的flavor命名为test,给extra_specs添加一个availability_zone属性, 一系列操作后这个flavor的detail大致是这样的:
$ nova flavor-show 88
+----------------------------+----------------------------------+
| Property | Value |
+----------------------------+----------------------------------+
| name | test |
| ram | 1024 |
| OS-FLV-DISABLED:disabled | False |
| vcpus | 2 |
| extra_specs | {u'availability_zone': u'horde'} |
| swap | 128 |
| os-flavor-access:is_public | True |
| rxtx_factor | 1.0 |
| OS-FLV-EXT-DATA:ephemeral | 0 |
| disk | 5 |
| id | 88 |
+----------------------------+----------------------------------+
建立一个availability_zone名为horde,并关联主机compute2,最终的效果是:
$ nova-manage service list
Binary Host Zone
nova-compute compute1 nova
nova-compute compute2 horde
修改nova.conf的scheduler_default_filters配置,增加AggregateInstanceExtraSpecsFilter,但同时要注意去掉ComputeCapabilitiesFilter, 否则哥俩会有冲突导致不能过滤出可用的Host,可以参考下面的配置:
修改前是默认配置
scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter
修改后
scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ImagePropertiesFilter,AggregateInstanceExtraSpecsFilter
修改完后需要重启nova-scheduler服务,然后就可以选用这个flavor创建虚机, 最终你会看到这个flavor创建的虚机都会建到指定的zone上。
Nova组件有很多不错的功能,官方文档并没有写得很详细,需要好好研读代码, 才能挖掘出来。