Load Balancer as a Service (LBaaS)

Load Balancer as a Service (LBaaS)

Networking サービスは、 neutron-lbaas サービスプラグインとして 、LBaaS v2 と呼ばれるロードバランサー機能を提供しています。

LBaaS v2 adds the concept of listeners to the LBaaS v1 load balancers. LBaaS v2 allows you to configure multiple listener ports on a single load balancer IP address.

LBaaS v2 は 2 つのリファレンス実装があります。1 つは、HAProxy を用いたエージェントベースの実装です。エージェントが HAProxy 設定を処理し、HAProxy デーモンを管理します。もう 1 つの LBaaS v2 の実装である Octavia は、独立した API とワーカープロセスを持ち、 Compute サービスが管理するハイパーバイザー上の仮想マシンにロードバランサーを作成します。 Octavia 用のエージェントは必要ありません。

注釈

LBaaS v1 は Newton リリースで削除されました。LBaaS v1 の動作や設定方法の詳細については以下のリンクを参照してください。

警告

現在のところ、 v1 と v2 のロードバランサー間での移行方法は存在しません。 v1 から v2 に切り替える場合には、すべてのロードバランサー、プール、ヘルスモニターを作り直す必要があります。

LBaaS v2 の概念

LBaaS v2 には、理解しておくべき新しい概念がいくつかあります。

LBaaS v2 layout
ロードバランサー
ロードバランサーは neutron のネットワークポートを所有し、サブネットから割り当てられた IP アドレスを持ちます。
リスナー
ロードバランサーは複数のポートに対するリクエストをリッスンできます。それぞれのポートはリスナーで指定されます。
プール
プールは、ロードバランサーを通じてコンテンツを提供するメンバーのリストを保持します。
メンバー
メンバーは、ロードバランサーの裏でトラフィックを処理するサーバーです。各メンバーはトラフィックを処理するのに使われる IP アドレスとポート番号で指定されます。
ヘルスモニター
メンバーは時としてオフラインになることがあります。ヘルスモニターは、正常に応答していないメンバーにトラフィックが向かないようにします。ヘルスモニターはプールに関連付けされます。

LBaaS v2 には、異なるサービスプラグインにより複数の実装があります。最も一般的な 2 つの実装はエージェントや Octavia サービスを使用していますが、どちらの実装も LBaaS v2 API を使用しています。

設定

エージェントを用いた LBaaS v2 の設定

  1. LBaaS v2 サービスプラグインを /etc/neutron/neutron.conf の service_plugins 設定項目に追加します。プラグインリストはコンマ区切りです。

    service_plugins = [existing service plugins],neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2
    
  2. /etc/neutron/neutron_lbaas.conf の [service_providers] セクションの service_provider 設定項目に LBaaS v2 サービスプロバイダーを追加します。

    service_provider = LOADBALANCERV2:Haproxy:neutron_lbaas.drivers.haproxy.plugin_driver.HaproxyOnHostPluginDriver:default
    

    VPNaaS や FWaaS などの他のネットワークサービスプラグイン用のサービスプロバイダーをすでに設定している場合には、 service_provider 行を上記の [service_provider] セクションに新しい行として追加します。この設定項目は繰り返し指定することができ、コンマ区切りではありません。

  3. /etc/neutron/lbaas_agent.ini で仮想インターフェースを管理するドライバーを設定します。

    [DEFAULT]
    interface_driver = INTERFACE_DRIVER
    

    INTERFACE_DRIVER は、お使いの環境のレイヤー 2 エージェントが使用するインターフェースドライバーに置き換えます。例えば、 Open vSwitch の場合は openvswitch 、 Linux ブリッジの場合は linuxbridge です。

  4. neutron-lbaas のデータベース移行スクリプトを実行します。

    neutron-db-manage --subproject neutron-lbaas upgrade head
    
  5. LBaaS v1 をデプロイしていた場合には、 LBaaS v1 エージェントをこの時点で停止してください。 v1 と v2 のエージェントは同時には実行 できません。

  6. LBaaS v2 エージェントを起動します。

    neutron-lbaasv2-agent \
    --config-file /etc/neutron/neutron.conf \
    --config-file /etc/neutron/lbaas_agent.ini
    
  7. 新しい設定を有効にするために Network サービスを再起動してください。この時点で LBaaS v2 エージェントでロードバランサーを作成できるようになります。

Octavia を用いた LBaaS v2 の設定

Octavia はロードバランサーに関する追加の機能を提供します。例えば、コンピュートドライバーを使って、ロードバランサーとして機能するインスタンスを作成するといったことです。 Octavia の概要については、東京の OpenStack Summit でのセッション Hands on Lab - Install and Configure OpenStack Octavia (ハンズオンラボ - OpenStack Octavia のインストールと設定) を見てください。

DevStack のドキュメントには、 Octavia をデプロイする簡単な方法 と冗長化したロードバランサーインスタンスを使ったサービスのテストについて書かれています。 Octavia をお使いの環境にすでにインストールして設定している場合は、 Octavia を使うように Network サービスを設定できます。

  1. LBaaS v2 サービスプラグインを /etc/neutron/neutron.conf の service_plugins 設定項目に追加します。プラグインリストはコンマ区切りです。

    service_plugins = [existing service plugins],neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2
    
  2. /etc/neutron/neutron_lbaas.conf の [service_providers] セクションの service_provider 設定項目に Octavia サービスプロバイダーを追加します。

    service_provider = LOADBALANCERV2:Octavia:neutron_lbaas.drivers.octavia.driver.OctaviaDriver:default
    

    LBaaS v1 と v2 のサービスプロバイダーは [service_provider] セクションから必ず削除してください。これらは Octavia の場合には使用されません。 すべての LBaaS エージェントが停止していることを確認してください。

  3. 新しい設定を有効にするために Network サービスを再起動してください。この時点で Octavia でロードバランサーを作成できるようになります。

ダッシュボードへの LBaaS パネルの追加

Mitaka リリース以降では、 LBaaSv2 を管理するためのダッシュボードパネルが利用できます。

  1. neutron-lbaas-dashboard リポジトリー をクローンし、インストールされているダッシュボードのバージョンに合致するリリースブランチをチェックアウトします。

    $ git clone https://git.openstack.org/openstack/neutron-lbaas-dashboard
    $ cd neutron-lbaas-dashboard
    $ git checkout OPENSTACK_RELEASE
    
  2. ダッシュボードパネルのプラグインをインストールします。

    $ python setup.py install
    
  3. neutron-lbaas-dashboard/enabled ディレクトリーの _1481_project_ng_loadbalancersv2_panel.py ファイルをダッシュボードの openstack_dashboard/local/enabled ディレクトリーにコピーします。

    この手順を行うことで、ダッシュボードが利用可能なパネルを探す際に LBaaSv2 プラグインを認識するようになります。

  4. local_settings.py ファイルを編集し、 OPENSTACK_NEUTRON_NETWORK の enable_lb を True にすることで、ダッシュボードでこのプラグインを有効化します。

  5. 性能向上のため、ダッシュボードが静的ファイルを圧縮するように設定されている場合 (通常は local_settings.py の COMPRESS_OFFLIME により設定されます)、静的ファイルの最適化をもう一度行います。

    $ ./manage.py collectstatic
    $ ./manage.py compress
    
  6. Apache を再起動して、新しいパネルを有効にします。

    $ sudo service apache2 restart
    

このパネルを開くには、 ダッシュボードの プロジェクト 、 ネットワーク ドロップダウンメニューをクリックし、 ロードバランサー を選択します。

LBaaS v2 の操作

エージェントを用いた LBaaS v2 でも Octavia を用いた LBaaS v2 でも同じ neutron コマンドを使用します。

LBaaS v2 ロードバランサーの作成

  1. まず、ネットワークにロードバランサーを作成します。この例では、 private ネットワークは分離されたネットワークで、このネットワークには 2 つのサーバーインスタンスがあります。

    $ neutron lbaas-loadbalancer-create --name test-lb private-subnet
    
  2. neutron lbaas-loadbalancer-show コマンドでロードバランサーの状態と IP アドレスを確認できます。

    $ neutron lbaas-loadbalancer-show test-lb
    +---------------------+------------------------------------------------+
    | Field               | Value                                          |
    +---------------------+------------------------------------------------+
    | admin_state_up      | True                                           |
    | description         |                                                |
    | id                  | 7780f9dd-e5dd-43a9-af81-0d2d1bd9c386           |
    | listeners           | {"id": "23442d6a-4d82-40ee-8d08-243750dbc191"} |
    |                     | {"id": "7e0d084d-6d67-47e6-9f77-0115e6cf9ba8"} |
    | name                | test-lb                                        |
    | operating_status    | ONLINE                                         |
    | provider            | haproxy                                        |
    | provisioning_status | ACTIVE                                         |
    | tenant_id           | fbfce4cb346c4f9097a977c54904cafd               |
    | vip_address         | 192.0.2.22                                     |
    | vip_port_id         | 9f8f8a75-a731-4a34-b622-864907e1d556           |
    | vip_subnet_id       | f1e7827d-1bfe-40b6-b8f0-2d9fd946f59b           |
    +---------------------+------------------------------------------------+
    
  3. 新しいロードバランサーにトラフィックが到達できるようにセキュリティーグループを更新します。新しいセキュリティーグループを作成し、新しいロードバランサーへのトラフィックを許可する受信ルールを追加します。ロードバランサーの neutron ポートは上記では vip_port_id として表示されます。

    セキュリティーグループを作成し、 TCP ポート 80、 TCP ポート 443 とすべての ICMP トラフィックを許可するルールを作成します。

    $ neutron security-group-create lbaas
    $ neutron security-group-rule-create \
      --direction ingress \
      --protocol tcp \
      --port-range-min 80 \
      --port-range-max 80 \
      --remote-ip-prefix 0.0.0.0/0 \
      lbaas
    $ neutron security-group-rule-create \
      --direction ingress \
      --protocol tcp \
      --port-range-min 443 \
      --port-range-max 443 \
      --remote-ip-prefix 0.0.0.0/0 \
      lbaas
    $ neutron security-group-rule-create \
      --direction ingress \
      --protocol icmp \
      lbaas
    

    そのセキュリティーグループをロードバランサーのポートに適用します。ロードバランサーのポートは neutron lbaas-loadbalancer-show コマンドの vip_port_id に表示されたものを使用します。

    $ neutron port-update \
      --security-group lbaas \
      9f8f8a75-a731-4a34-b622-864907e1d556
    

HTTP リスナーの追加

  1. オンラインのロードバランサーに、平文の HTTP トラフィックに対するポート 80 のリスナーを追加します。

    $ neutron lbaas-listener-create \
      --name test-lb-http \
      --loadbalancer test-lb \
      --protocol HTTP \
      --protocol-port 80
    

    This load balancer is active and ready to serve traffic on 192.0.2.22.

  2. 次に進む前にロードバランサーが ping に応答しているかを確認します。

    $ ping -c 4 192.0.2.22
    PING 192.0.2.22 (192.0.2.22) 56(84) bytes of data.
    64 bytes from 192.0.2.22: icmp_seq=1 ttl=62 time=0.410 ms
    64 bytes from 192.0.2.22: icmp_seq=2 ttl=62 time=0.407 ms
    64 bytes from 192.0.2.22: icmp_seq=3 ttl=62 time=0.396 ms
    64 bytes from 192.0.2.22: icmp_seq=4 ttl=62 time=0.397 ms
    
    --- 192.0.2.22 ping statistics ---
    4 packets transmitted, 4 received, 0% packet loss, time 2997ms
    rtt min/avg/max/mdev = 0.396/0.402/0.410/0.020 ms
    
  3. You can begin building a pool and adding members to the pool to serve HTTP content on port 80. For this example, the web servers are 192.0.2.16 and 192.0.2.17:

    $ neutron lbaas-pool-create \
      --name test-lb-pool-http \
      --lb-algorithm ROUND_ROBIN \
      --listener test-lb-http \
      --protocol HTTP
    $ neutron lbaas-member-create \
      --name test-lb-http-member-1 \
      --subnet private-subnet \
      --address 192.0.2.16 \
      --protocol-port 80 \
      test-lb-pool-http
    $ neutron lbaas-member-create \
      --name test-lb-http-member-2 \
      --subnet private-subnet \
      --address 192.0.2.17 \
      --protocol-port 80 \
      test-lb-pool-http
    
  4. curl を使って、ロードバランサー経由でのウェブサーバーへの接続性を検証します。

    $ curl 192.0.2.22
    web2
    $ curl 192.0.2.22
    web1
    $ curl 192.0.2.22
    web2
    $ curl 192.0.2.22
    web1
    

    この例では、ロードバランサーはラウンドロビン方式を使用しており、トラフィックはバックエンドのサーバー間に交互に渡されます。

  5. ヘルスモニターを追加し、反応のないサーバーをプールから削除できるようにします。

    $ neutron lbaas-healthmonitor-create \
      --name test-lb-http-monitor \
      --delay 5 \
      --max-retries 2 \
      --timeout 10 \
      --type HTTP \
      --pool test-lb-pool-http
    

    この例では、ヘルスモニターは、 5 秒間隔で 2 回ヘルスチェックに失敗すると、そのサーバーをプールから削除します。サーバーが復活しヘルスチェックに再び応答し始めると、そのサーバーはプールにもう一度追加されます。

HTTPS リスナーの追加

HTTPS トラフィックに対するポート 443 のリスナーをさらに追加できます。 LBaaS v2 ではロードバランサーでの SSL/TLS 終端が提供されていますが、この例では簡単な方法を使用し、暗号化された接続は各メンバーサーバーで終端されます。

  1. リスナーを作成し、プールを接続し、メンバーを追加します。

    $ neutron lbaas-listener-create \
      --name test-lb-https \
      --loadbalancer test-lb \
      --protocol HTTPS \
      --protocol-port 443
    $ neutron lbaas-pool-create \
      --name test-lb-pool-https \
      --lb-algorithm LEAST_CONNECTIONS \
      --listener test-lb-https \
      --protocol HTTPS
    $ neutron lbaas-member-create \
      --name test-lb-https-member-1 \
      --subnet private-subnet \
      --address 192.0.2.16 \
      --protocol-port 443 \
      test-lb-pool-https
    $ neutron lbaas-member-create \
      --name test-lb-https-member-2 \
      --subnet private-subnet \
      --address 192.0.2.17 \
      --protocol-port 443 \
      test-lb-pool-https
    
  2. HTTPS プールに対してもヘルスモニターを追加できます。

    $ neutron lbaas-healthmonitor-create \
      --name test-lb-https-monitor \
      --delay 5 \
      --max-retries 2 \
      --timeout 10 \
      --type HTTPS \
      --pool test-lb-pool-https
    

    この時点で、ロードバランサーはポート 80 と 443 のトラフィックを処理します。

Floating IP アドレスの割り当て

ロードバランサーが外部のクライアントと通信可能なパブリックネットワークやプロバイダーネットワークに配備される場合は、 Floating IP アドレスを割り当てる必要がありません。外部のクライアントはロードバランサーの仮想 IP アドレス (VIP) に直接アクセスできます。

一方、ロードバランサーが分離されたプライベートネットワーク上に配備される場合は、外部のクライアントからアクセスできるようにするには Floating IP アドレスを割り当てる必要があります。 Floating IP アドレスを割り当てるためには、プライベートネットワークとパブリックネットワークを接続するルーターと、利用可能な Floating IP アドレスが必要です。

この節の最初に紹介した neutron lbaas-loadbalancer-show コマンドを使って vip_port_id を確認します。 vip_port_id はロードバランサーに割り当てられたネットワークポートの ID です。 neutron floatingip-associate を使って未使用の Floating IP アドレスをロードバランサーに割り当てます。

$ neutron floatingip-associate FLOATINGIP_ID LOAD_BALANCER_PORT_ID

LBaaS v2 のクォータの設定

クォータを使って、ロードバランサー数とロードバランサープール数を制限することができます。デフォルトでは、どちらのクォータも 10 に設定されます。

neutron quota-update コマンドを使ってクォータを調整できます。

$ neutron quota-update --tenant-id TENANT_UUID --loadbalancer 25
$ neutron quota-update --tenant-id TENANT_UUID --pool 50

-1 を設定すると、テナントのクォータが上限なしになります。

ロードバランサーの統計情報の取得

LBaaS v2 エージェントは、 6 秒毎に各ロードバランサーについて 4 種類の統計情報を収集します。ユーザーはこれらの統計情報を neutron lbaas-loadbalancer-stats コマンドを使って照会できます。

$ neutron lbaas-loadbalancer-stats test-lb
+--------------------+----------+
| Field              | Value    |
+--------------------+----------+
| active_connections | 0        |
| bytes_in           | 40264557 |
| bytes_out          | 71701666 |
| total_connections  | 384601   |
+--------------------+----------+

active_connections カウントは、エージェントがロードバランサーの情報を収集した時点でアクティブな接続の総数です。他の 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.