Red Hat Training

A Red Hat training course is available for Red Hat OpenStack Platform

第15章 Load Balancing-as-a-Service (LBaaS) の設定

Load Balancing-as-a-Service (LBaaS) は、OpenStack Networking が指定のインスタンス間で受信要求を均等に分散できるようにします。このステップバイステップのガイドでは、OpenStack Networking が Open vSwitch (OVS) プラグインで LBaas を使用するように設定します。

Red Hat OpenStack Platform 5 で導入された Load Balancing-as-a-Service (LBaaS) は、OpenStack Networking が指定のインスタンス間で受信要求を均等に分散できるようにします。これにより、インスタンス間でのワークロードが予測可能な方法で共有されるようになり、システムリソースのより効率的な使用が可能となります。受信要求は、以下の負荷分散メソッドの 1 つを使用して分散されます。

  • ラウンドロビン: 複数のインスタンス間で要求を均等にローテーションします。
  • 送信元 IP アドレス: 同じ送信元 IP アドレスからの要求は常に一定のインスタンスへ送信されます。
  • 最小コネクション: アクティブな接続が最も少ないインスタンスに要求が割り当てられます。

表15.1 LBaaS の機能

機能説明

監視機能

LBaaS は、ping、TCP、HTTP、HTTPS の GET メソッドで可用性の監視を行います。監視機能は、プールメンバーが要求を処理できる状態かどうかを判断するために実装されています。

管理

LBaaS は、さまざまなツールセットを使用して管理されます。REST API は、プログラムベースの管理およびスクリプト作成に使用できます。ユーザーは、CLI (neutron) または OpenStack Dashboard のいずれかを使用して、ロードバランサーの管理タスクを行います。

接続制限

接続制限を使用して、受信トラフィックのシェーピングを行うことができます。この機能は、ワークロードを制御することも可能で、DoS (Denial of Service) 攻撃の緩和にも有効です。

セッションの永続化

LBaaS は、複数のインスタンスで構成されるプール内で同じインスタンスに受信要求がルーティングされるようにすることで、セッションの永続化をサポートします。LBaaS は、クッキーや送信元 IP アドレスに基づいたルーティングの決定をサポートします。

注記

LBaaS は現在 IPv4 アドレスのみサポートします。

注記

LBaaSv1 は Red Hat OpenStack Platform 11 (Ocata) で削除され、LBaaSv2 に置き換えられました。

15.1. OpenStack Networking および LBaaS トポロジー

OpenStack Networking (neutron) サービスは、大きく 2 つのカテゴリーに分類することができます。

1. Neutron API server: このサービスは、エンドユーザーとサービスが OpenStack Networking と対話できるように、主に API を提供する OpenStack Networking API サーバーを実行します。またこのサービスは、基盤のデータベースと対話して、テナントネットワーク、ルーター、ロードバランサーの詳細などを保存する役割も果たします。

2. Neutron エージェント: OpenStack Networking のさまざまな機能を提供するサービスです。

  • neutron-dhcp-agent: テナントプライベートネットワークの DHCP IP アドレスを管理します。
  • neutron-l3-agent: テナントプライベートネットワーク、外部ネットワークなどの間のレイヤー 3 ルーティングを容易化します。
  • neutron-lbaasv2-agent: テナントにより作成された LBaaS ルーターをプロビジョニングします。

以下の図には、HTTPS トラフィックからプールメンバーへのフローを示しています。

lbaas
15.1.1. LBaaS のサポートステータス
  • LBaaS v1 API は、バージョン 10 で削除されました。
  • LBaaS v2 API は Red Hat OpenStack Platform 7 で導入されました。これは、バージョン 10 で提供されている唯一の LBaaS API です。
  • LBaaS デプロイメントは現在 Red Hat OpenStack Platform director ではサポートされていません。
15.1.2. サービスの配置

OpenStack Networking Service は、同じ物理サーバーまたは別の専用サーバーで実行することができます。

注記

Red Hat OpenStack Platform 11 では、コンポーザブルロールのサポートが追加され、ネットワークサービスをカスタムロール別に分類することができます。ただし、本ガイドでは、内容をわかりやすくするために、デプロイメントにはデフォルトのコントローラーノードを使用することを前提とします。

API サーバーを実行するサーバーは通常、コントローラーノード と呼ばれ、OpenStack Networking エージェントを実行するサーバーは Network node と呼ばれます。理想的な実稼動環境では、パフォーマンスやスケーラビリティーの理由により、コンポーネントを専用のノードに分類しますが、テストまたは PoC デプロイメントではすべてのコンポーネントを 1 つの同じノードで実行します。本章では、どちらのシナリオにも対応しますが、コントローラーノードの設定のセクションは API サーバーで、ネットワークノードのセクションは LBaaS エージェントを実行するサーバーで行う必要があります。

注記

コントローラーおよびネットワークロールの両方が同じ物理ノードに存在する場合には、この物理ノード (サーバー) で手順を実行する必要があります。

15.2. LBaaS の設定

以下の手順では、OpenStack Networking (neutron) で LBaaS を Open vSwitch (OVS) プラグインと共に使用するための設定方法を説明します。これらのステップは、neutron-server サービスを実行するノードで実行してください。

注記

これらのステップは、Octavia をベースとするデプロイメント向けではありません。https://access.redhat.com/documentation/ja-jp/red_hat_openstack_platform/11/html-single/advanced_overcloud_customization/#Composable_Service_Reference-New_Services を参照してください。

コントローラーノード (API サーバー) の場合:

  1. HAProxy をインストールします。

    # yum install haproxy
  2. LBaaS テーブルを neutron データベースに追加します。

    $ neutron-db-manage --subproject neutron-lbaas --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head
  3. /etc/neutron/neutron_lbaas.conf でサービスプロバイダーを変更します。[service providers] セクションで、以下を除く全エントリーをコメントアウト (#) します。

    service_provider=LOADBALANCERV2:Haproxy:neutron_lbaas.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
  4. /etc/neutron/neutron.conf で、service_plugins に LBaaS v2 プラグインが設定されていることを確認します。

    service_plugins=neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2

    以前に追加した他のプラグインも設定されているはずです。

    注記

    lbaasv1 が設定されている場合には、上記の lbaasv2 用の設定に置き換えます。

  5. /etc/neutron/lbaas_agent.ini で、以下の設定を [DEFAULT] セクションに追加します。

    ovs_use_veth = False
    interface_driver =neutron.agent.linux.interface.OVSInterfaceDriver
  6. /etc/neutron/services_lbaas.conf で、以下の設定を [haproxy] セクションに追加します。

    user_group = haproxy
    1. その他の device driver のエントリーはコメントアウトしてください。

      注記

      l3-agent が失敗のモードに入っている場合は、l3_agent のログファイルを確認してください。ログファイルに記載されているとおりに/etc/neutron/neutron.conf を編集して [DEFAULT] の特定の値をコメントアウトしたり、oslo_messaging_rabbit の対応する値をコメント解除する必要がある場合があります。

  7. LbaaS サービスを設定して、以下のステータスを確認します。

    1. lbaasv1 サービスを停止して lbaasv2 サービスを起動します。

      # systemctl disable neutron-lbaas-agent.service
      # systemctl stop neutron-lbaas-agent.service
      # systemctl mask neutron-lbaas-agent.service
      # systemctl enable neutron-lbaasv2-agent.service
      # systemctl start neutron-lbaasv2-agent.service
    2. lbaasv2 のステータスを確認します。

      # systemctl status neutron-lbaasv2-agent.service
    3. neutron-server を再起動してステータスを確認します。

      # systemctl restart neutron-server.service
      # systemctl status neutron-server.service
    4. Loadbalancerv2 エージェントを確認します。

      $ neutron agent-list

15.3. ロードバランサーの自動再スケジュール

失敗した LBaaS エージェントからロードバランサーを自動的に再スケジュールするように neutron を設定することが可能です。以前のリリースでは、ロードバランサーを複数の LBaaS エージェントでスケジュールできましたが、ハイパーバイザーが停止した場合には、そのノードに対してスケジュールされていたロードバランサーは、操作を停止していました。現在は、このようなロードバランサーは別のエージェントに自動的に再スケジュールできるようになりました。この機能は、デフォルトで無効になっており、allow_automatic_lbaas_agent_failover を使用して管理されます。

15.3.1. 自動フェイルオーバーの有効化
注記

Loadbalancerv2 エージェントを実行するノードが少なくとも 2 台必要です。

  1. Loadbalancerv2 エージェントを実行している全ノードで、/etc/neutron/neutron_lbaas.conf を編集します。

    allow_automatic_lbaas_agent_failover=True
  2. LBaaS エージェントと neutron-server を再起動します。

    systemctl restart neutron-lbaasv2-agent
    systemctl restart neuron-server.service
  3. エージェントの状態を確認します。

    $ neutron agent-list
    +--------------------------------------+----------------------+-------------------+-------------------+-------+----------------+---------------------------+
    | id                                   | agent_type           | host              | availability_zone | alive | admin_state_up | binary                    |
    +--------------------------------------+----------------------+-------------------+-------------------+-------+----------------+---------------------------+
    | 2af49b85-7a55-4420-97e0-186c233cce08 | Open vSwitch agent   | node1 |                   | :-)   | True           | neutron-openvswitch-agent |
    | 2d81c836-2f85-47c2-9cdc-665aa796e977 | DHCP agent           | node1 | nova              | :-)   | True           | neutron-dhcp-agent        |
    | 58fa7369-ea35-4663-ae34-97518e847741 | Open vSwitch agent   | node2 |                   | :-)   | True           | neutron-openvswitch-agent |
    | 7b665b9d-4c7e-4da1-a37a-1007af6444fc | Loadbalancerv2 agent | node1 |                   | :-)   | True           | neutron-lbaasv2-agent     |
    | 88f4c436-7152-4d30-a9e8-a793750bcbba | Loadbalancerv2 agent | node2 |                   | :-)   | True           | neutron-lbaasv2-agent     |
    | de6640a1-17a7-4ceb-986a-3b0de3b8845e | Metadata agent       | node1 |                   | :-)   | True           | neutron-metadata-agent    |
    | e4f77843-48e9-43af-a1af-884c07714416 | L3 agent             | node1 | nova              | :-)   | True           | neutron-l3-agent          |
    +--------------------------------------+----------------------+-------------------+-------------------+-------+----------------+---------------------------+
15.3.2. フェイルオーバーの設定例
  1. 新規ロードバランサーを作成します。

    $ neutron lbaas-loadbalancer-create --name lb1 private-subnet
    Created a new loadbalancer:
    +---------------------+--------------------------------------+
    | Field               | Value                                |
    +---------------------+--------------------------------------+
    | admin_state_up      | True                                 |
    | description         |                                      |
    | id                  | b130e956-b8d1-4290-ab83-febc19797683 |
    | listeners           |                                      |
    | name                | lb1                                  |
    | operating_status    | OFFLINE                              |
    | pools               |                                      |
    | provider            | haproxy                              |
    | provisioning_status | PENDING_CREATE                       |
    | tenant_id           | 991b8c905d644900948b4540d9815fa9     |
    | vip_address         | 10.0.0.3                             |
    | vip_port_id         | 89f05da4-f820-470d-95c7-d13fe09a2b6f |
    | vip_subnet_id       | 6c8f7812-7fd2-4e79-bf96-0b85f47bea49 |
    +---------------------+--------------------------------------+
  2. haproxy が起動されるようにリスナーを作成します。

    $ neutron lbaas-listener-create --loadbalancer lb1 --protocol HTTP --protocol-port 80 --name listener1
    Created a new listener:
    +---------------------------+------------------------------------------------+
    | Field                     | Value                                          |
    +---------------------------+------------------------------------------------+
    | admin_state_up            | True                                           |
    | connection_limit          | -1                                             |
    | default_pool_id           |                                                |
    | default_tls_container_ref |                                                |
    | description               |                                                |
    | id                        | 538c13bf-6b27-441d-8ac7-d54ef6b7a503           |
    | loadbalancers             | {"id": "b130e956-b8d1-4290-ab83-febc19797683"} |
    | name                      | listener1                                      |
    | protocol                  | HTTP                                           |
    | protocol_port             | 80                                             |
    | sni_container_refs        |                                                |
    | tenant_id                 | 991b8c905d644900948b4540d9815fa9               |
    +---------------------------+------------------------------------------------+
  3. どの LBaaS エージェントがロードバランサーのスケジュール先となっていたかをチェックします。

    $ neutron lbaas-agent-hosting-loadbalancer lb1
    +--------------------------------------+-------------------+----------------+-------+
    | id                                   | host              | admin_state_up | alive |
    +--------------------------------------+-------------------+----------------+-------+
    | 88f4c436-7152-4d30-a9e8-a793750bcbba | node2 | True           | :-)   |
    +--------------------------------------+-------------------+----------------+-------+
  4. haproxy がそのノードで実行されていることを確認します。また、他のノードでは現在実行されていないことも確認してください。

    stack@node2:~/$ ps -ef | grep "haproxy -f" | grep lbaas
    nobody   14503     1  0 17:14 ?        00:00:00 haproxy -f /opt/openstack/data/neutron/lbaas/v2/b130e956-b8d1-4290-ab83-febc19797683/haproxy.conf -p /opt/openstack/data/neutron/lbaas/v2/b130e956-b8d1-4290-ab83-febc19797683/haproxy.pid
    
    stack@node1:~/$ ps -ef | grep "haproxy -f" | grep lbaas
    stack@node1:~/$
  5. ホストしている lbaas エージェントのプロセスを強制終了して、neutron-server がこのイベントを認識するのを待ってから、loadbalancer を再スケジュールします。

    $ neutron lbaas-agent-hosting-loadbalancer lb1
    +--------------------------------------+-------------------+----------------+-------+
    | id                                   | host              | admin_state_up | alive |
    +--------------------------------------+-------------------+----------------+-------+
    | 88f4c436-7152-4d30-a9e8-a793750bcbba | node2 | True           | xxx   |
    +--------------------------------------+-------------------+----------------+-------+
    • q-svc log を確認します。

      2016-12-08 17:17:48.427 WARNING neutron.db.agents_db [req-1518b1ee-1ce3-4813-9999-9e9323666df7 None None] Agent healthcheck: found 1 dead agents out of 7:
                      Type       Last heartbeat host
      Loadbalancerv2 agent  2016-12-08 17:15:11 node2
      2016-12-08 17:18:06.000 WARNING neutron.db.agentschedulers_db [req-d0c689d4-434b-4db7-8140-27d3d3442dec None None] Rescheduling loadbalancer b130e956-b8d1-4290-ab83-febc19797683 from agent 88f4c436-7152-4d30-a9e8-a793750bcbba because the agent did not report to the server in the last 150 seconds.
  6. 稼働中の lbaas エージェントに対して、loadbalancer が実際に再スケジュールされたことと、haproxy が実行中であることを確認します。

    $ neutron lbaas-agent-hosting-loadbalancer lb1
    +--------------------------------------+-------------------+----------------+-------+
    | id                                   | host              | admin_state_up | alive |
    +--------------------------------------+-------------------+----------------+-------+
    | 7b665b9d-4c7e-4da1-a37a-1007af6444fc | node1 | True           | :-)   |
    +--------------------------------------+-------------------+----------------+-------+
    • haproxy プロセスの状態を確認します。

      stack@node1:~/$ ps -ef | grep "haproxy -f" | grep lbaas
      nobody     768     1  0 17:18 ?        00:00:00 haproxy -f /opt/openstack/data/neutron/lbaas/v2/b130e956-b8d1-4290-ab83-febc19797683/haproxy.conf -p /opt/openstack/data/neutron/lbaas/v2/b130e956-b8d1-4290-ab83-febc19797683/haproxy.pid
  7. ステップ 4 で強制終了した labaas エージェントを再度有効にします。haproxy がそのノードでは実行されなくなったことと、neutron-server がエージェントを認識していることを確認します。

    stack@node2:~/$ ps -ef | grep "haproxy -f" | grep lbaas
    stack@node2:~/$
  8. エージェントの一覧を確認します。

    $ neutron agent-list
    +--------------------------------------+----------------------+-------------------+-------------------+-------+----------------+---------------------------+
    | id                                   | agent_type           | host              | availability_zone | alive | admin_state_up | binary                    |
    +--------------------------------------+----------------------+-------------------+-------------------+-------+----------------+---------------------------+
    | 2af49b85-7a55-4420-97e0-186c233cce08 | Open vSwitch agent   | node1 |                   | :-)   | True           | neutron-openvswitch-agent |
    | 2d81c836-2f85-47c2-9cdc-665aa796e977 | DHCP agent           | node1 | nova              | :-)   | True           | neutron-dhcp-agent        |
    | 58fa7369-ea35-4663-ae34-97518e847741 | Open vSwitch agent   | node2 |                   | :-)   | True           | neutron-openvswitch-agent |
    | 7b665b9d-4c7e-4da1-a37a-1007af6444fc | Loadbalancerv2 agent | node1 |                   | :-)   | True           | neutron-lbaasv2-agent     |
    | 88f4c436-7152-4d30-a9e8-a793750bcbba | Loadbalancerv2 agent | node2 |                   | :-)   | True           | neutron-lbaasv2-agent     |
    | de6640a1-17a7-4ceb-986a-3b0de3b8845e | Metadata agent       | node1 |                   | :-)   | True           | neutron-metadata-agent    |
    | e4f77843-48e9-43af-a1af-884c07714416 | L3 agent             | node1 | nova              | :-)   | True           | neutron-l3-agent          |
    +--------------------------------------+----------------------+-------------------+-------------------+-------+----------------+---------------------------+