DHCP の高可用性

DHCP の高可用性

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

注釈

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

$ openstack extension list --network -c Name -c Alias
+-------------------------------------------------------------+---------------------------+
| Name                                                        | Alias                     |
+-------------------------------------------------------------+---------------------------+
| Default Subnetpools                                         | default-subnetpools       |
| Network IP Availability                                     | network-ip-availability   |
| Network Availability Zone                                   | network_availability_zone |
| Auto Allocated Topology Services                            | auto-allocated-topology   |
| Neutron L3 Configurable external gateway mode               | ext-gw-mode               |
| Port Binding                                                | binding                   |
| Neutron Metering                                            | metering                  |
| agent                                                       | agent                     |
| Subnet Allocation                                           | subnet_allocation         |
| L3 Agent Scheduler                                          | l3_agent_scheduler        |
| Tag support                                                 | tag                       |
| Neutron external network                                    | external-net              |
| Neutron Service Flavors                                     | flavors                   |
| Network MTU                                                 | net-mtu                   |
| Availability Zone                                           | availability_zone         |
| Quota management support                                    | quotas                    |
| HA Router extension                                         | l3-ha                     |
| Provider Network                                            | provider                  |
| Multi Provider Network                                      | multi-provider            |
| Address scope                                               | address-scope             |
| Neutron Extra Route                                         | extraroute                |
| Subnet service types                                        | subnet-service-types      |
| Resource timestamps                                         | standard-attr-timestamp   |
| Neutron Service Type Management                             | service-type              |
| Router Flavor Extension                                     | l3-flavors                |
| Tag support for resources: subnet, subnetpool, port, router | tag-ext                   |
| Neutron Extra DHCP opts                                     | extra_dhcp_opt            |
| Resource revision numbers                                   | standard-attr-revisions   |
| Pagination support                                          | pagination                |
| Sorting support                                             | sorting                   |
| security-group                                              | security-group            |
| DHCP Agent Scheduler                                        | dhcp_agent_scheduler      |
| Router Availability Zone                                    | router_availability_zone  |
| RBAC Policies                                               | rbac-policies             |
| standard-attr-description                                   | standard-attr-description |
| Neutron L3 Router                                           | router                    |
| Allowed Address Pairs                                       | allowed-address-pairs     |
| project_id field enabled                                    | project-id                |
| Distributed Virtual Router                                  | dvr                       |
+-------------------------------------------------------------+---------------------------+

デモ環境の構成

_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://203.0.113.10:9696/
    

HostA、HostB: DHCP エージェント

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

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

デモの前提条件

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

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

$ openstack server list
+--------------------------------------+-----------+--------+----------------+------------+
| ID                                   | Name      | Status | Networks       | Image Name |
+--------------------------------------+-----------+--------+----------------+------------+
| c394fcd0-0baa-43ae-a793-201815c3e8ce | myserver1 | ACTIVE | net1=192.0.2.3 | cirros     |
| 2d604e05-9a6c-4ddb-9082-8a1fbdcc797d | myserver2 | ACTIVE | net1=192.0.2.4 | ubuntu     |
| c7c0481c-3db8-4d7a-a948-60ce8211d585 | myserver3 | ACTIVE | net1=192.0.2.5 | centos     |
+--------------------------------------+-----------+--------+----------------+------------+

$ openstack network list
+--------------------------------------+------+--------------------------------------+
| ID                                   | Name | Subnets                              |
+--------------------------------------+------+--------------------------------------+
| 89dca1c6-c7d4-4f7a-b730-549af0fb6e34 | net1 | f6c832e3-9968-46fd-8e45-d5cf646db9d1 |
+--------------------------------------+------+--------------------------------------+

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

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

    $ openstack network agent list
    +--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
    | ID                                   | Agent Type         | Host  | Availability Zone | Alive | State | Binary                    |
    +--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
    | 22467163-01ea-4231-ba45-3bd316f425e6 | Linux bridge agent | HostA | None              | True  | UP    | neutron-metering-agent    |
    | 2444c54d-0d28-460c-ab0f-cd1e6b5d3c7b | DHCP agent         | HostA | None              | True  | UP    | neutron-openvswitch-agent |
    | 3066d20c-9f8f-440c-ae7c-a40ffb4256b6 | Linux bridge agent | HostB | nova              | True  | UP    | neutron-l3-agent          |
    | 55569f4e-6f31-41a6-be9d-526efce1f7fe | DHCP agent         | HostB | nova              | True  | UP    | neutron-l3-agent          |
    +--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
    

    これらの拡張機能に対応した全エージェントは、開始時に 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 192.0.2.0/24 |
    +--------------------------------------+------+---------------------------------------------------+
    
  4. エージェントの詳細を表示します。

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

    $ openstack network agent show 22467163-01ea-4231-ba45-3bd316f425e6
    +---------------------+-------------------------------------------------------------------------+
    | Field               | Value                                                                   |
    +---------------------+-------------------------------------------------------------------------+
    | admin_state_up      | UP                                                                      |
    | agent_type          | Metering agent                                                          |
    | alive               | False                                                                   |
    | availability_zone   | None                                                                    |
    | binary              | neutron-metering-agent                                                  |
    | configurations      | measure_interval='30', metering_driver='neutron.services.metering.drive |
    |                     | rs.noop.noop_driver.NoopMeteringDriver', report_interval='300'          |
    | created_at          | 2016-10-08 15:17:14                                                     |
    | description         | None                                                                    |
    | heartbeat_timestamp | 2016-10-24 13:53:35                                                     |
    | host                | HostA                                                                   |
    | id                  | 22467163-01ea-4231-ba45-3bd316f425e6                                    |
    | started_at          | 2016-10-08 15:17:14                                                     |
    | topic               | dhcp_agent                                                              |
    +---------------------+-------------------------------------------------------------------------+
    

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

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

    $ openstack network agent show 22467163-01ea-4231-ba45-3bd316f425e6
    +---------------------+-------------------------------------------------------------------------+
    | Field               | Value                                                                   |
    +---------------------+-------------------------------------------------------------------------+
    | admin_state_up      | UP                                                                      |
    | agent_type          | Metering agent                                                          |
    | alive               | False                                                                   |
    | availability_zone   | None                                                                    |
    | binary              | neutron-linuxbridge-agent                                               |
    | configurations      | measure_interval='30', metering_driver='neutron.services.metering.drive |
    |                     | rs.noop.noop_driver.NoopMeteringDriver', report_interval='300'          |
    | created_at          | 2016-10-08 15:17:14                                                     |
    | description         | None                                                                    |
    | heartbeat_timestamp | 2016-10-24 13:53:35                                                     |
    | host                | HostB                                                                   |
    | id                  | 22467163-01ea-4231-ba45-3bd316f425e6                                    |
    | started_at          | 2016-10-08 15:17:14                                                     |
    | topic               | dhcp_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 198.51.100.0/24 --name subnet2
    $ neutron port-create net2
    $ openstack network agent list --agent-type dhcp --host qiaomin-free
    +--------------------------------------+------------+-------+-------------------+-------+-------+--------------------+
    | ID                                   | Agent Type | Host  | Availability Zone | Alive | State | Binary             |
    +--------------------------------------+------------+-------+-------------------+-------+-------+--------------------+
    | e838ef5c-75b1-4b12-84da-7bdbd62f1040 | DHCP agent | HostA | nova              | True  | UP    | neutron-dhcp-agent |
    +--------------------------------------+------------+-------+-------------------+-------+-------+--------------------+
    

    ネットワークは 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
    $ openstack network agent list --agent-type dhcp --host qiaomin-free
    +--------------------------------------+------------+-------+-------------------+-------+-------+--------------------+
    | ID                                   | Agent Type | Host  | Availability Zone | Alive | State | Binary             |
    +--------------------------------------+------------+-------+-------------------+-------+-------+--------------------+
    | e838ef5c-75b1-4b12-84da-7bdbd62f1040 | DHCP agent | HostA | nova              | True  | UP    | neutron-dhcp-agent |
    | f28aa126-6edb-4ea5-a81e-8850876bc0a8 | DHCP agent | HostB | nova              | True  | UP    | neutron-dhcp-agent |
    +--------------------------------------+------------+-------+-------------------+-------+-------+--------------------+
    

    両方の 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 上に起動します。

    $ openstack network list
    +--------------------------------------+------+--------------------------------------+
    | ID                                   | Name | Subnets                              |
    +--------------------------------------+------+--------------------------------------+
    | 89dca1c6-c7d4-4f7a-b730-549af0fb6e34 | net1 | f6c832e3-9968-46fd-8e45-d5cf646db9d1 |
    | 9b96b14f-71b8-4918-90aa-c5d705606b1a | net2 | 6979b71a-0ae8-448c-aa87-65f68eedcaaa |
    +--------------------------------------+------+--------------------------------------+
    $ openstack server create --image tty  --flavor 1 myserver4 \
      --nic net-id=9b96b14f-71b8-4918-90aa-c5d705606b1a
    ...
    $ openstack server list
    +--------------------------------------+-----------+--------+-------------------+------------+
    | ID                                   | Name      | Status | Networks          | Image Name |
    +--------------------------------------+-----------+--------+-------------------+------------+
    | c394fcd0-0baa-43ae-a793-201815c3e8ce | myserver1 | ACTIVE | net1=192.0.2.3    | cirros     |
    | 2d604e05-9a6c-4ddb-9082-8a1fbdcc797d | myserver2 | ACTIVE | net1=192.0.2.4    | ubuntu     |
    | c7c0481c-3db8-4d7a-a948-60ce8211d585 | myserver3 | ACTIVE | net1=192.0.2.5    | centos     |
    | f62f4731-5591-46b1-9d74-f0c901de567f | myserver4 | ACTIVE | net2=198.51.100.2 | cirros1    |
    +--------------------------------------+-----------+--------+-------------------+------------+
    
  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
$ openstack network agent list
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host  | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
| 22467163-01ea-4231-ba45-3bd316f425e6 | Linux bridge agent | HostA | None              | True  | UP    | neutron-metering-agent    |
| 2444c54d-0d28-460c-ab0f-cd1e6b5d3c7b | DHCP agent         | HostA | None              | True  | UP    | neutron-openvswitch-agent |
| 3066d20c-9f8f-440c-ae7c-a40ffb4256b6 | Linux bridge agent | HostB | nova              | True  | UP    | neutron-l3-agent          |
| 55569f4e-6f31-41a6-be9d-526efce1f7fe | DHCP agent         | HostB | nova              | True  | UP    | neutron-l3-agent          |
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+

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

$ openstack network agent delete 2444c54d-0d28-460c-ab0f-cd1e6b5d3c7b
$ openstack network agent list
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host  | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+
| 22467163-01ea-4231-ba45-3bd316f425e6 | Linux bridge agent | HostA | None              | True  | UP    | neutron-metering-agent    |
| 3066d20c-9f8f-440c-ae7c-a40ffb4256b6 | Linux bridge agent | HostB | nova              | True  | UP    | neutron-l3-agent          |
| 55569f4e-6f31-41a6-be9d-526efce1f7fe | DHCP agent         | HostB | nova              | True  | UP    | neutron-l3-agent          |
+--------------------------------------+--------------------+-------+-------------------+-------+-------+---------------------------+

削除した後で、 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.