nova で VM を立ち上げるノード制御する
nova-scheduler
nova が hypervisor ホストで VM を立ち上げる時、どの hypervisor ホストで立ち上げるかを決めるのは nova-scheduler です。
nova-scheduler は立ち上げるホストを filtering して決めます。
デフォルトでは、以下の様な filter が使用できます。(/etc/nova/nova.conf に設定されている。)
scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter
新規立ち上げ時以外に、以下の時にホストを決定します。
- VM をマイグレートするとき
- nova evacuate コマンドでホストを指定しなかった場合
立ち上げるホストを指定したい
Host aggregate で指定出来そう。
Host aggregate を使用すると、Flavor に指定した metadata を利用して VM を立ち上げるホストを指定出来るみたいです。
Host aggregate を使用するための設定
/etc/nova/nova.conf の "scheduler_default_filters" に "AggregateInstanceExtraSpecsFilter" を追加する。
scheduler_default_filters=AggregateInstanceExtraSpecsFilter,RetryFilter,AvailabilityZoneFilter,RamFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter
openstack aggregate create コマンドで aggregate を作成する。
$ openstack aggregate create --zone nova test +-------------------+----------------------------+ | Field | Value | +-------------------+----------------------------+ | availability_zone | nova | | created_at | 2015-11-07T10:36:58.000000 | | deleted | False | | deleted_at | None | | id | 1 | | name | test | | updated_at | None | +-------------------+----------------------------+
openstack aggregate add host コマンドで作成した aggregate にホストを追加する
$ openstack aggregate add host 1 compute0 +-------------------+---------------------------------------------------+ | Field | Value | +-------------------+---------------------------------------------------+ | availability_zone | nova | | created_at | 2015-11-07T10:36:58.000000 | | deleted | False | | deleted_at | None | | hosts | [u'compute0'] | | id | 1 | | metadata | {u'test': u'true', u'availability_zone': u'nova'} | | name | test | | updated_at | None | +-------------------+---------------------------------------------------+
aggregate に metadata を設定する
$ openstack aggregate set --property test=true 1 +-------------------+---------------------------------------------------+ | Field | Value | +-------------------+---------------------------------------------------+ | availability_zone | nova | | created_at | 2015-11-07T10:36:58.000000 | | deleted | False | | deleted_at | None | | hosts | [ | | id | 1 | | metadata | {u'test': u'true', u'availability_zone': u'nova'} | | name | test | | updated_at | None | +-------------------+---------------------------------------------------+]
flavor に metadata を設定する
$ nova flavor-key 1 set aggregate_instance_extra_specs:test=true $ nova flavor-show 1 +----------------------------+-------------------------------------------------+ | Property | Value | +----------------------------+-------------------------------------------------+ | OS-FLV-DISABLED:disabled | False | | OS-FLV-EXT-DATA:ephemeral | 0 | | disk | 1 | | extra_specs | {"aggregate_instance_extra_specs:test": "true"} | | id | 1 | | name | m1.tiny | | os-flavor-access:is_public | True | | ram | 512 | | rxtx_factor | 1.0 | | swap | | | vcpus | 1 | +----------------------------+-------------------------------------------------+
VM を立ち上げてみる
aggregate の設定をしていない場合。
$ nova show aggregate-test +--------------------------------------+----------------------------------------------------------+ | Property | Value | +--------------------------------------+----------------------------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-AZ:availability_zone | nova | | OS-EXT-SRV-ATTR:host | compute1 | | OS-EXT-SRV-ATTR:hypervisor_hostname | compute1 | | OS-EXT-SRV-ATTR:instance_name | instance-00000005 | | OS-EXT-STS:power_state | 1 | | OS-EXT-STS:task_state | - | | OS-EXT-STS:vm_state | active | | OS-SRV-USG:launched_at | 2015-11-07T10:53:33.000000 | | OS-SRV-USG:terminated_at | - | | accessIPv4 | | | accessIPv6 | | | config_drive | | | created | 2015-11-07T10:52:12Z | | flavor | m1.tiny (1) | | hostId | d851fc374eb13a12aa7df7f38f6889196fa0cbfc52808379265c6f72 | | id | e1b54302-e9a5-42b7-9e5c-a7e5f9cded71 | | image | cirros (d5bfdf59-fb05-44ae-90fb-62e848feca1b) | | key_name | - | | metadata | { | | name | aggregate-test | | os-extended-volumes:volumes_attached | [ | | pri-net network | 172.16.1.4 | | progress | 0 | | security_groups | default | | status | ACTIVE | | tenant_id | be0aa029aed749169432428147648b68 | | updated | 2015-11-07T10:53:34Z | | user_id | c881bb43e6fd4a8aafd1f3e2cb874d00 | +--------------------------------------+----------------------------------------------------------+]}
設定後。
$ nova boot --flavor m1.tiny --image cirros --nic net-id=a0e5ac16-6dd4-4c68-86f6-ee6691477017 --poll aggregate-test2 +--------------------------------------+-----------------------------------------------+ | Property | Value | +--------------------------------------+-----------------------------------------------+ | OS-DCF:diskConfig | MANUAL | | OS-EXT-AZ:availability_zone | nova | | OS-EXT-SRV-ATTR:host | - | | OS-EXT-SRV-ATTR:hypervisor_hostname | - | | OS-EXT-SRV-ATTR:instance_name | instance-00000007 | | OS-EXT-STS:power_state | 0 | | OS-EXT-STS:task_state | scheduling | | OS-EXT-STS:vm_state | building | | OS-SRV-USG:launched_at | - | | OS-SRV-USG:terminated_at | - | | accessIPv4 | | | accessIPv6 | | | adminPass | NZAQeQp3MmvS | | config_drive | | | created | 2015-11-07T11:05:58Z | | flavor | m1.tiny (1) | | hostId | | | id | cfd4412f-b6e4-4986-830e-bc20c0274ff1 | | image | cirros (d5bfdf59-fb05-44ae-90fb-62e848feca1b) | | key_name | - | | metadata | { | | name | aggregate-test2 | | os-extended-volumes:volumes_attached | [ | | progress | 0 | | security_groups | default | | status | BUILD | | tenant_id | be0aa029aed749169432428147648b68 | | updated | 2015-11-07T11:05:58Z | | user_id | c881bb43e6fd4a8aafd1f3e2cb874d00 | +--------------------------------------+-----------------------------------------------+ Server building... 100% complete Finished
ログを見ると以下の様なログが出ている。
Filter AggregateInstanceExtraSpecsFilter returned 1 host(s)
ここで、compute0 を返しているのではないかと思う。