巧用flavor metadata决定虚机的宿主机

关于创建虚拟机,收到一个需求,是希望通过单纯地指定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组件有很多不错的功能,官方文档并没有写得很详细,需要好好研读代码, 才能挖掘出来。

Table Of Contents

Previous topic

宿主机资源隔离(未完)

Next topic

openstack中的协程

This Page