repl.info

OpenStack HeatのResourceGroupを使って任意の台数のインスタンスを起動する

OpenStack Heatを試す の続き。指定した個数のリソースを作成する、ResourceGroupを試します。Mitakaを使用。

まずは使ってみる

例によってテンプレート。resource_defを使って、ResourceGroupで管理するリソースを定義している。

heat_template_version: 2016-04-08



description: テストだよ。



resources:

  my_net:

    type: OS::Neutron::Net

  my_subnet:

    type: OS::Neutron::Subnet

    properties:

      network_id: { get_resource: my_net }

      cidr: "10.8.1.0/24"

      dns_nameservers: ["8.8.8.8", "8.8.4.4"]

      ip_version: 4

  instances:

    type: OS::Heat::ResourceGroup

    properties:

      count: 3

      resource_def:

         type: OS::Nova::Server

         properties:

           name: hoge_%index%

           key_name: r_takaishi

           image: cirros

           flavor: m1.tiny

           networks:

             - network: { get_resource: my_net }

更新前のリソース一覧はこう。

$ openstack stack resource list r_takaishi

+---------------+--------------------------------------+---------------------+-----------------+----------------------+

| resource_name | physical_resource_id | resource_type | resource_status | updated_time |

+---------------+--------------------------------------+---------------------+-----------------+----------------------+

| my_net | e219ca84-d822-4d49-bfeb-339328f1fdc7 | OS::Neutron::Net | CREATE_COMPLETE | 2017-02-13T12:19:35Z |

| my_subnet | 9af0d331-1d87-441f-8061-1aa0f8046c21 | OS::Neutron::Subnet | CREATE_COMPLETE | 2017-02-13T12:19:35Z |

| my_instance | 882382de-9997-451f-9105-1f7577943146 | OS::Nova::Server | UPDATE_COMPLETE | 2017-02-13T12:28:41Z |

+---------------+--------------------------------------+---------------------+-----------------+----------------------+

更新する。

$ openstack stack update -t ./r_takaishi.yml r_takaishi

+---------------------+--------------------------------------+

| Field | Value |

+---------------------+--------------------------------------+

| id | 5d85e9a7-92e9-42b4-8c49-279f3f0cf7be |

| stack_name | r_takaishi |

| description | テストだよ。 |

| creation_time | 2017-02-13T11:58:10Z |

| updated_time | 2017-02-13T13:04:38Z |

| stack_status | UPDATE_IN_PROGRESS |

| stack_status_reason | Stack UPDATE started |

+---------------------+--------------------------------------+

リソース一覧はどうなるか?

$ openstack stack resource list r_takaishi

+---------------+--------------------------------------+-------------------------+-----------------+----------------------+

| resource_name | physical_resource_id | resource_type | resource_status | updated_time |

+---------------+--------------------------------------+-------------------------+-----------------+----------------------+

| my_net | e219ca84-d822-4d49-bfeb-339328f1fdc7 | OS::Neutron::Net | CREATE_COMPLETE | 2017-02-13T12:19:35Z |

| instances | 5e9f017e-65db-4715-af8e-ab03a0fb118e | OS::Heat::ResourceGroup | CREATE_COMPLETE | 2017-02-13T13:04:38Z |

| my_subnet | 9af0d331-1d87-441f-8061-1aa0f8046c21 | OS::Neutron::Subnet | CREATE_COMPLETE | 2017-02-13T12:19:35Z |

+---------------+--------------------------------------+-------------------------+-----------------+----------------------+

my_instanceが消え、instancesになった。個別のインスタンスは管理せず、あくまでもグループとして管理すると言うことかな。

$ openstack server list

+--------------------------------------+--------+--------+------------------------------------------+------------+

| ID | Name | Status | Networks | Image Name |

+--------------------------------------+--------+--------+------------------------------------------+------------+

| b0eed1fc-0609-41f2-a731-7a8ad5719349 | hoge_1 | ACTIVE | r_takaishi-my_net-v26sicemoajs=10.8.1.3 | cirros |

| c4341bb7-a325-49b7-93c3-773e0abfa1f8 | hoge_2 | ACTIVE | r_takaishi-my_net-v26sicemoajs=10.8.1.7 | cirros |

| 0d156210-cafa-4e0a-bdee-e1baad58cf6c | hoge_0 | ACTIVE | r_takaishi-my_net-v26sicemoajs=10.8.1.10 | cirros |

+--------------------------------------+--------+--------+------------------------------------------+------------+

インスタンス一覧を見たら、ちゃんと3台いた。なるほど〜。しかし、こうなるとupdate時に台数を指定したくなる。ということでそれも試した。

インスタンスの数をupdateコマンドの引数で指定する

updateコマンドにはparameterオプションがあり、これを使うとコマンド実行時に任意の値を指定することができる。つまり、このオプションでインスタンスの台数を指定すると実行時に台数を自由に選べるということになる。

まずはテンプレート。parameters sectionが増えており、この値をResourceGroupのcountプロパティで参照している。デフォルト値も指定できる。

heat_template_version: 2016-04-08



description: テストだよ。



parameters:

  instance_count:

    type: number

    label: Instance Count

    default: 3



resources:

  my_net:

    type: OS::Neutron::Net

  my_subnet:

    type: OS::Neutron::Subnet

    properties:

      network_id: { get_resource: my_net }

      cidr: "10.8.1.0/24"

      dns_nameservers: ["8.8.8.8", "8.8.4.4"]

      ip_version: 4

  instances:

    type: OS::Heat::ResourceGroup

    properties:

      count: { get_param: instance_count }

      resource_def:

         type: OS::Nova::Server

         properties:

           name: hoge_%index%

           key_name: r_takaishi

           image: cirros

           flavor: m1.tiny

           networks:

             - network: { get_resource: my_net }

アップデートコマンドを実行する前にインスタンス台数をチェック。

$ openstack server list

+--------------------------------------+--------+--------+------------------------------------------+------------+

| ID | Name | Status | Networks | Image Name |

+--------------------------------------+--------+--------+------------------------------------------+------------+

| 79f62211-2de7-45d8-b6d2-60fcf23047dd | hoge_2 | ACTIVE | r_takaishi-my_net-v26sicemoajs=10.8.1.14 | cirros |

| b0eed1fc-0609-41f2-a731-7a8ad5719349 | hoge_1 | ACTIVE | r_takaishi-my_net-v26sicemoajs=10.8.1.3 | cirros |

| 0d156210-cafa-4e0a-bdee-e1baad58cf6c | hoge_0 | ACTIVE | r_takaishi-my_net-v26sicemoajs=10.8.1.10 | cirros |

+--------------------------------------+--------+--------+------------------------------------------+------------+

3台だ。では、台数を変更してみよう。

$ openstack stack update --parameter instance_count=5 -t ./r_takaishi.yml r_takaishi

+---------------------+--------------------------------------+

| Field | Value |

+---------------------+--------------------------------------+

| id | 5d85e9a7-92e9-42b4-8c49-279f3f0cf7be |

| stack_name | r_takaishi |

| description | テストだよ。 |

| creation_time | 2017-02-13T11:58:10Z |

| updated_time | 2017-02-13T13:20:14Z |

| stack_status | UPDATE_IN_PROGRESS |

| stack_status_reason | Stack UPDATE started |

+---------------------+--------------------------------------+

少し待ってからインスタンス一覧を見てみると、ちゃんと5台になっていた。

$ openstack server list

+--------------------------------------+--------+--------+------------------------------------------+------------+

| ID | Name | Status | Networks | Image Name |

+--------------------------------------+--------+--------+------------------------------------------+------------+

| ed5ba84e-6464-425d-b252-6ba02b4f92e1 | hoge_4 | ACTIVE | r_takaishi-my_net-v26sicemoajs=10.8.1.12 | cirros |

| 7bebeea1-df4a-4afc-8509-9e6e0c606d29 | hoge_3 | ACTIVE | r_takaishi-my_net-v26sicemoajs=10.8.1.8 | cirros |

| 79f62211-2de7-45d8-b6d2-60fcf23047dd | hoge_2 | ACTIVE | r_takaishi-my_net-v26sicemoajs=10.8.1.14 | cirros |

| b0eed1fc-0609-41f2-a731-7a8ad5719349 | hoge_1 | ACTIVE | r_takaishi-my_net-v26sicemoajs=10.8.1.3 | cirros |

| 0d156210-cafa-4e0a-bdee-e1baad58cf6c | hoge_0 | ACTIVE | r_takaishi-my_net-v26sicemoajs=10.8.1.10 | cirros |

+--------------------------------------+--------+--------+------------------------------------------+------------+

インスタンスの数を何台にするか、というのはAutoScallingGroupを使えばCeilometerから取得した情報を使えるが、取得できない情報を使う場合はResourceGroupだけでも十分活用できそう。

RollingUpdateを試す

ドキュメントを見ていると、rolling_update という気になる文字を発見した。これはもしかして…!

heat_template_version: 2016-04-08



description: テストだよ。



parameters:

  instance_count:

    type: number

    label: Instance Count

    default: 3



resources:

  my_net:

    type: OS::Neutron::Net

  my_subnet:

    type: OS::Neutron::Subnet

    properties:

      network_id: { get_resource: my_net }

      cidr: "10.8.1.0/24"

      dns_nameservers: ["8.8.8.8", "8.8.4.4"]

      ip_version: 4

  instances:

    type: OS::Heat::ResourceGroup

    update_policy: {

      rolling_update: { "min_in_service": 1, "max_batch_size": 2, "pause_time": 5}

    }

    properties:

      count: { get_param: instance_count }

      resource_def:

         type: OS::Nova::Server

         properties:

           name: foo_%index%

           key_name: r_takaishi

           image: cirros

           flavor: m1.tiny

           networks:

             - network: { get_resource: my_net }

update_pollicyとしてrolling_updateを追加。最初書き方が分からなくて四苦八苦してしまった。以下、実行の様子。

2台更新して、5秒待ってから次の2台…というような動きになっていることが分かる。これはいいね。

まとめ

HeatのResourceGroupを試した。思ったよりお手軽で、結構衝撃を受けている。Heatを管理するのが手間そうだなと思っていたけど、その手間をかけてもいいかもしれないと感じた。何でも試してみないと分からないなー。

参考リンク