DHCP の高可用性

DHCP の高可用性

このセクションでは、エージェント管理 API 拡張 (別名 agent) とスケジューラー API 拡張 (別名 agent_scheduler) を使って DHCP エージェントのスケーラビリティーと HA (高可用性) を行う方法を説明します。

注釈

これらの API 拡張が有効になっているかを確認するには neutron ext-list コマンドを使用します。出力に agentagent_scheduler が含まれていることを確認します。

$ neutron ext-list -c name -c alias
+-----------------+--------------------------+
| alias           | name                     |
+-----------------+--------------------------+
| agent_scheduler | Agent Schedulers         |
| binding         | Port Binding             |
| quotas          | Quota management support |
| agent           | agent                    |
| provider        | Provider Network         |
| router          | Neutron L3 Router        |
| lbaas           | Load Balancing service   |
| extraroute      | Neutron Extra Route      |
+-----------------+--------------------------+

デモ環境の構成

_images/demo_multiple_dhcp_agents.png

この構成では 3 つのホストがあります。

ホスト

説明

OpenStack コントローラーホスト - controlnode

VM をデプロイするのに必要な Networking, Identity, Compute サービスが動作します。このノードにはネットワークインターフェースが 少なくとも 1 つ必要で、管理ネットワークに接続します。 nova-network は Neutron で置き換えられるので、このノードで nova-network は動作させないでください。

HostA

nova-compute と Neutron L2 エージェント、 DHCP エージェントが動作します。

HostB

HostA と同じ。

設定

controlnode: neutron サーバー

  1. neutron 設定ファイル /etc/neutron/neutron.conf:

    [DEFAULT]
    core_plugin = linuxbridge
    rabbit_host = controlnode
    allow_overlapping_ips = True
    host = controlnode
    agent_down_time = 5
    dhcp_agents_per_network = 1
    

    注釈

    上記の設定では、デモ用に dhcp_agents_per_network = 1 を使用しています。通常の環境では、 dhcp_agents_per_network をお使いの環境の DHCP エージェント数に合うように複数に設定することをお薦めします。 デフォルトで DHCP の高可用性を有効にする を参照してください。

  2. プラグイン設定ファイル /etc/neutron/plugins/linuxbridge/linuxbridge_conf.ini を更新します。

    [vlans]
    tenant_network_type = vlan
    network_vlan_ranges = physnet1:1000:2999
    [database]
    connection = mysql://root:root@127.0.0.1:3306/neutron_linux_bridge
    retry_interval = 2
    [linux_bridge]
    physical_interface_mappings = physnet1:eth0
    

HostA、HostB: L2 エージェント

  1. neutron 設定ファイル /etc/neutron/neutron.conf:

    [DEFAULT]
    rabbit_host = controlnode
    rabbit_password = openstack
    # host = HostB on hostb
    host = HostA
    
  2. プラグイン設定ファイル /etc/neutron/plugins/linuxbridge/linuxbridge_conf.ini を更新します。

    [vlans]
    tenant_network_type = vlan
    network_vlan_ranges = physnet1:1000:2999
    [database]
    connection = mysql://root:root@127.0.0.1:3306/neutron_linux_bridge
    retry_interval = 2
    [linux_bridge]
    physical_interface_mappings = physnet1:eth0
    
  3. nova 設定ファイル /etc/nova/nova.conf を更新します。

    [DEFAULT]
    use_neutron=True
    firewall_driver=nova.virt.firewall.NoopFirewallDriver
    
    [neutron]
    admin_username=neutron
    admin_password=servicepassword
    admin_auth_url=http://controlnode:35357/v2.0/
    auth_strategy=keystone
    admin_tenant_name=servicetenant
    url=http://100.1.1.10:9696/
    

HostA、HostB: DHCP エージェント

  • DHCP 設定ファイル /etc/neutron/dhcp_agent.ini を更新します。

    [DEFAULT]
    interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
    

デモの前提条件

エージェント管理およびスケジューラー拡張機能を使用するには管理ロールが必要です。以下のコマンドは管理ロールを持つプロジェクトで実行してください。

以下を試すには、VM と neutron ネットワークが必要です。

$ nova list
+--------------------------------------+-----------+--------+---------------+
| ID                                   | Name      | Status | Networks      |
+--------------------------------------+-----------+--------+---------------+
| c394fcd0-0baa-43ae-a793-201815c3e8ce | myserver1 | ACTIVE | net1=10.0.1.3 |
| 2d604e05-9a6c-4ddb-9082-8a1fbdcc797d | myserver2 | ACTIVE | net1=10.0.1.4 |
| c7c0481c-3db8-4d7a-a948-60ce8211d585 | myserver3 | ACTIVE | net1=10.0.1.5 |
+--------------------------------------+-----------+--------+---------------+

$ neutron net-list
+--------------------------------------+------+--------------------------------------+
| id                                   | name | subnets                              |
+--------------------------------------+------+--------------------------------------+
| 89dca1c6-c7d4-4f7a-b730-549af0fb6e34 | net1 | f6c832e3-9968-46fd-8e45-d5cf646db9d1 |
+--------------------------------------+------+--------------------------------------+

neutron 環境でのエージェントの管理

  1. 全エージェントを一覧表示します。

    $ neutron agent-list
    +--------------------------------------+--------------------+-------+-------+----------------+
    | id                                   | agent_type         | host  | alive | admin_state_up |
    +--------------------------------------+--------------------+-------+-------+----------------+
    | 1b69828d-6a9b-4826-87cd-1757f0e27f31 | Linux bridge agent | HostA | :-)   | True           |
    | a0c1c21c-d4f4-4577-9ec7-908f2d48622d | DHCP agent         | HostA | :-)   | True           |
    | ed96b856-ae0f-4d75-bb28-40a47ffd7695 | Linux bridge agent | HostB | :-)   | True           |
    | f28aa126-6edb-4ea5-a81e-8850876bc0a8 | DHCP agent         | HostB | :-)   | True           |
    +--------------------------------------+--------------------+-------+-------+----------------+
    

    これらの拡張機能に対応した全エージェントは、開始時に neutron サーバーに自身を登録します。

    この出力では 4 つのエージェントの情報が表示されています。 neutron.conf ファイルの agent_down_time オプションで定義された時間内にエージェントが自分の状態を報告した場合に、 alive フィールドに :-) が表示されます。そうでない場合 alivexxx になります。

  2. 特定のネットワークを扱っている DHCP エージェントの一覧を表示します。

    $ neutron dhcp-agent-list-hosting-net net1
    +--------------------------------------+-------+----------------+-------+
    | id                                   | host  | admin_state_up | alive |
    +--------------------------------------+-------+----------------+-------+
    | a0c1c21c-d4f4-4577-9ec7-908f2d48622d | HostA | True           | :-)   |
    +--------------------------------------+-------+----------------+-------+
    
  3. 指定した DHCP エージェントが扱っているネットワークの一覧を表示します。

    このコマンドは、指定した DHCP エージェントが管理しているネットワーク一覧を表示します。

    $ neutron net-list-on-dhcp-agent a0c1c21c-d4f4-4577-9ec7-908f2d48622d
    +--------------------------------------+------+--------------------------------------------------+
    | id                                   | name | subnets                                          |
    +--------------------------------------+------+--------------------------------------------------+
    | 89dca1c6-c7d4-4f7a-b730-549af0fb6e34 | net1 | f6c832e3-9968-46fd-8e45-d5cf646db9d1 10.0.1.0/24 |
    +--------------------------------------+------+--------------------------------------------------+
    
  4. エージェントの詳細を表示します。

    agent-show コマンドは、指定したエージェントの詳細を表示します。

    $ neutron agent-show a0c1c21c-d4f4-4577-9ec7-908f2d48622d
    +---------------------+--------------------------------------------------------+
    | Field               | Value                                                  |
    +---------------------+--------------------------------------------------------+
    | admin_state_up      | True                                                   |
    | agent_type          | DHCP agent                                             |
    | alive               | False                                                  |
    | binary              | neutron-dhcp-agent                                     |
    | configurations      | {                                                      |
    |                     |     "subnets": 1,                                      |
    |                     |     "dhcp_driver": "neutron.agent.linux.dhcp.Dnsmasq", |
    |                     |     "networks": 1,                                     |
    |                     |     "dhcp_lease_time": 120,                            |
    |                     |     "ports": 3                                         |
    |                     | }                                                      |
    | created_at          | 2013-03-16T01:16:18.000000                             |
    | description         |                                                        |
    | heartbeat_timestamp | 2013-03-17T01:37:22.000000                             |
    | host                | HostA                                                  |
    | id                  | 58f4ce07-6789-4bb3-aa42-ed3779db2b03                   |
    | started_at          | 2013-03-16T06:48:39.000000                             |
    | topic               | dhcp_agent                                             |
    +---------------------+--------------------------------------------------------+
    

    この出力で、 heartbeat_timestamp は neutron サーバーにおける時刻です。この拡張機能を正しく動作させるためには、すべてのエージェントが neutron サーバーに時刻が同期できている必要は特にありません。 configurations には、エージェントの静的な設定や実行時のデータが入ります。このエージェントは DHCP エージェントで、ネットワークを 1 つ、サブネットを 1 つ、ポートを 3 つ扱っています。

    別の種類のエージェントでは別の詳細が表示されます。以下は Linux ブリッジエージェントの情報を表示したものです。

    $ neutron agent-show ed96b856-ae0f-4d75-bb28-40a47ffd7695
    +---------------------+--------------------------------------+
    | Field               | Value                                |
    +---------------------+--------------------------------------+
    | admin_state_up      | True                                 |
    | binary              | neutron-linuxbridge-agent            |
    | configurations      | {                                    |
    |                     |      "physnet1": "eth0",             |
    |                     |      "devices": "4"                  |
    |                     | }                                    |
    | created_at          | 2013-03-16T01:49:52.000000           |
    | description         |                                      |
    | disabled            | False                                |
    | group               | agent                                |
    | heartbeat_timestamp | 2013-03-16T01:59:45.000000           |
    | host                | HostB                                |
    | id                  | ed96b856-ae0f-4d75-bb28-40a47ffd7695 |
    | topic               | N/A                                  |
    | started_at          | 2013-03-16T06:48:39.000000           |
    | type                | Linux bridge agent                   |
    +---------------------+--------------------------------------+
    

    出力には bridge-mapping とこの L2 エージェント上の仮想ネットワークデバイス数が表示されています。

DHCP エージェントへのネットワーク割り当ての管理

1 つのネットワークを複数の DHCP エージェントに割り当てることもできますし、 1 つの DHCP エージェントで複数のネットワークを担当することもできます。ネットワークを DHCP エージェントに追加したり、DHCP エージェントから削除したりできます。

  1. デフォルトのスケジューリング。

    ネットワークにポートを 1 つ作成すると、そのネットワークは稼働中の DHCP エージェントに割り当てられます。複数の稼働中のエージェントがある場合は、 1 つがランダムに選択されます。 nova-scheduler と同様、もっと洗練されたスケジューリングアルゴリズムを設計することもできるでしょう。

    $ neutron net-create net2
    $ neutron subnet-create net2 9.0.1.0/24 --name subnet2
    $ neutron port-create net2
    $ neutron dhcp-agent-list-hosting-net net2
    +--------------------------------------+-------+----------------+-------+
    | id                                   | host  | admin_state_up | alive |
    +--------------------------------------+-------+----------------+-------+
    | a0c1c21c-d4f4-4577-9ec7-908f2d48622d | HostA | True           | :-)   |
    +--------------------------------------+-------+----------------+-------+
    

    ネットワークは HostA の DHCP エージェントに割り当てられています。 dnsmasq コマンドにより動作を検証する場合、そのネットワークにサブネットを作成しなければいけません。 DHCP エージェントは DHCP が有効な場合にのみ dnsmasq サービスを開始するからです。

  2. ネットワークを指定した DHCP エージェントに割り当てます。

    ネットワークを別の DHCP エージェントに追加するには、以下のコマンドを実行します。

    $ neutron dhcp-agent-network-add f28aa126-6edb-4ea5-a81e-8850876bc0a8 net2
    Added network net2 to dhcp agent
    $ neutron dhcp-agent-list-hosting-net net2
    +--------------------------------------+-------+----------------+-------+
    | id                                   | host  | admin_state_up | alive |
    +--------------------------------------+-------+----------------+-------+
    | a0c1c21c-d4f4-4577-9ec7-908f2d48622d | HostA | True           | :-)   |
    | f28aa126-6edb-4ea5-a81e-8850876bc0a8 | HostB | True           | :-)   |
    +--------------------------------------+-------+----------------+-------+
    

    両方の DHCP エージェントが net2 ネットワークを担当しています。

  3. ネットワークを指定した DHCP エージェントから削除します。

    このコマンドは上記のコマンドの対となるコマンドです。 HostA の DHCP から net2 を削除します。

    $ neutron dhcp-agent-network-remove a0c1c21c-d4f4-4577-9ec7-908f2d48622d \
      net2
    Removed network net2 to dhcp agent
    $ neutron dhcp-agent-list-hosting-net net2
    +--------------------------------------+-------+----------------+-------+
    | id                                   | host  | admin_state_up | alive |
    +--------------------------------------+-------+----------------+-------+
    | f28aa126-6edb-4ea5-a81e-8850876bc0a8 | HostB | True           | :-)   |
    +--------------------------------------+-------+----------------+-------+
    

    HostB の DHCP エージェントだけが net2 ネットワークを担当していることが分かります。

DHCP エージェントの HA

net2 に VM を起動して、両方の DHCP エージェントに net2 を担当させます。これらのエージェントを順番に故障させて、 エージェントが故障した場合でも VM が所望の IP アドレスを取得できることを確認します。

  1. VM を net2 上に起動します。

    $ neutron net-list
    +--------------------------------------+------+--------------------------------------------------+
    | id                                   | name | subnets                                          |
    +--------------------------------------+------+--------------------------------------------------+
    | 89dca1c6-c7d4-4f7a-b730-549af0fb6e34 | net1 | f6c832e3-9968-46fd-8e45-d5cf646db9d1 10.0.1.0/24 |
    | 9b96b14f-71b8-4918-90aa-c5d705606b1a | net2 | 6979b71a-0ae8-448c-aa87-65f68eedcaaa 9.0.1.0/24  |
    +--------------------------------------+------+--------------------------------------------------+
    $ nova boot --image tty --flavor 1 myserver4 \
      --nic net-id=9b96b14f-71b8-4918-90aa-c5d705606b1a
    ...
    $ nova list
    +--------------------------------------+-----------+--------+---------------+
    | ID                                   | Name      | Status | Networks      |
    +--------------------------------------+-----------+--------+---------------+
    | c394fcd0-0baa-43ae-a793-201815c3e8ce | myserver1 | ACTIVE | net1=10.0.1.3 |
    | 2d604e05-9a6c-4ddb-9082-8a1fbdcc797d | myserver2 | ACTIVE | net1=10.0.1.4 |
    | c7c0481c-3db8-4d7a-a948-60ce8211d585 | myserver3 | ACTIVE | net1=10.0.1.5 |
    | f62f4731-5591-46b1-9d74-f0c901de567f | myserver4 | ACTIVE | net2=9.0.1.2  |
    +--------------------------------------+-----------+--------+---------------+
    
  2. 両方の DHCP エージェントが net2 を担当するようにします。

    上述のコマンドを使って、ネットワークをエージェントに割り当てます。

    $ neutron dhcp-agent-list-hosting-net net2
    +--------------------------------------+-------+----------------+-------+
    | id                                   | host  | admin_state_up | alive |
    +--------------------------------------+-------+----------------+-------+
    | a0c1c21c-d4f4-4577-9ec7-908f2d48622d | HostA | True           | :-)   |
    | f28aa126-6edb-4ea5-a81e-8850876bc0a8 | HostB | True           | :-)   |
    +--------------------------------------+-------+----------------+-------+
    

DHCP エージェントの HA を試験するには以下のようにします。

  1. myserver4 VM にログインして、 udhcpcdhclient もしくはその他の DHCP クライアントを実行します。

  2. HostA の DHCP エージェントを停止します。 neutron-dhcp-agent バイナリーを停止するだけでなく、 dnsmasq プロセスも停止する必要があります。

  3. VM で DHCP クライアントを実行し、所望の IP が取得できるかを確認します。

  4. HostB の DHCP エージェントも停止します。

  5. VM 内で udhcpc を実行します。 VM は所望の IP を取得できません。

  6. HostB で DHCP エージェントを開始します。 VM は所望の IP アドレスを再び取得できます。

エージェントの無効化と削除

管理者は、システムのハードウェアやソフトウェアのアップグレードを計画している場合、エージェントを無効化したいことでしょう。 L3 エージェントや DHCP エージェントなど、スケジューリングに対応しているエージェントのいくつかでは、エージェントの有効化、無効化ができます。エージェントを無効にすると、スケジューラーはそれ以降はそのエージェントに新たにリソースをスケジューリングしません。

エージェントを無効にした後、そのエージェントは安全に削除できます。エージェントを無効化した後も、そのエージェント上のリソースは割り当てられたままです。エージェントを削除する前に、エージェント上のリソースを削除してください。

HostA のエージェントを停止する前に無効化します。

$ neutron agent-update a0c1c21c-d4f4-4577-9ec7-908f2d48622d --admin-state-up False
$ neutron agent-list
+--------------------------------------+--------------------+-------+-------+----------------+
| id                                   | agent_type         | host  | alive | admin_state_up |
+--------------------------------------+--------------------+-------+-------+----------------+
| 1b69828d-6a9b-4826-87cd-1757f0e27f31 | Linux bridge agent | HostA | :-)   | True           |
| a0c1c21c-d4f4-4577-9ec7-908f2d48622d | DHCP agent         | HostA | :-)   | False          |
| ed96b856-ae0f-4d75-bb28-40a47ffd7695 | Linux bridge agent | HostB | :-)   | True           |
| f28aa126-6edb-4ea5-a81e-8850876bc0a8 | DHCP agent         | HostB | :-)   | True           |
+--------------------------------------+--------------------+-------+-------+----------------+

HostA の DHCP エージェントを停止した後で、以下のコマンドでエージェントを削除できます。

$ neutron agent-delete a0c1c21c-d4f4-4577-9ec7-908f2d48622d
Deleted agent: a0c1c21c-d4f4-4577-9ec7-908f2d48622d
$ neutron agent-list
+--------------------------------------+--------------------+-------+-------+----------------+
| id                                   | agent_type         | host  | alive | admin_state_up |
+--------------------------------------+--------------------+-------+-------+----------------+
| 1b69828d-6a9b-4826-87cd-1757f0e27f31 | Linux bridge agent | HostA | :-)   | True           |
| ed96b856-ae0f-4d75-bb28-40a47ffd7695 | Linux bridge agent | HostB | :-)   | True           |
| f28aa126-6edb-4ea5-a81e-8850876bc0a8 | DHCP agent         | HostB | :-)   | True           |
+--------------------------------------+--------------------+-------+-------+----------------+

削除した後で、 DHCP エージェントを再起動すると、そのエージェントは再びエージェント一覧に登場します。

デフォルトで DHCP の高可用性を有効にする

/etc/neutron/neutron.conf ファイルの以下の設定オプションで、1 つのネットワークに割り当てるデフォルトの DHCP エージェント数を制御できます。

dhcp_agents_per_network = 3
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.