Load Balancer as a Service (LBaaS)

Load Balancer as a Service (LBaaS)

Networking サービスは、 neutron-lbaas サービスプラグインとして 2 つのロードバランサー実装を提供しています。

  • LBaaS v1: Juno で追加されました (Liberty で廃止予定扱いになりました)

  • LBaaS v2: Kilo で追加されました

どちらの実装もエージェントを使用します。エージェントは、 HAProxy の設定を用意し、HAProxy デーモンの管理を行います。 LBaaS v2 では、 LBaaS v1 ロードバランサーにリスナーの概念が追加されています。 LBaaS v2 では、 1 つのロードバランサー IP アドレスに対して複数のリスナーを設定できます。

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

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

LBaaS v1

LBaaS v1 は Liberty リリースで廃止予定扱いになりました。 LBaaS v1 の動作や設定方法の詳細については以下のリンクを参照してください。

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.confservice_plugins 設定項目に追加します。プラグインリストはコンマ区切りです。

    service_plugins = [existing service plugins],neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2
    
  2. /etc/neutron/neutron.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. neutron-lbaas のデータベース移行スクリプトを実行します。

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

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

    neutron-lbaasv2-agent \
    --config-file /etc/neutron/neutron.conf \
    --config-file /etc/neutron/lbaas_agent.ini
    
  6. 新しい設定を有効にするために 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.confservice_plugins 設定項目に追加します。プラグインリストはコンマ区切りです。

    service_plugins = [existing service plugins],neutron_lbaas.services.loadbalancer.plugin.LoadBalancerPluginv2
    
  2. /etc/neutron/neutron.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 v2 の操作

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

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

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

    $ neutron lbaas-loadbalancer-create --name test-lb private-subnet
    
  2. 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.168.1.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
    $ security-group-rule-create \
      --direction ingress \
      --protocol icmp \
      lbaas
    

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

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

    このロードバランサーは有効で、 192.168.1.22 へのトラフィックに応答できる状態になっています。

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

    $ ping -c 4 192.168.1.22
    PING 192.168.1.22 (192.168.1.22) 56(84) bytes of data.
    64 bytes from 192.168.1.22: icmp_seq=1 ttl=62 time=0.410 ms
    64 bytes from 192.168.1.22: icmp_seq=2 ttl=62 time=0.407 ms
    64 bytes from 192.168.1.22: icmp_seq=3 ttl=62 time=0.396 ms
    64 bytes from 192.168.1.22: icmp_seq=4 ttl=62 time=0.397 ms
    
    --- 192.168.1.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
    

HTTP リスナーの追加

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

    $ neutron lbaas-listener-create \
      --name test-lb-http \
      --loadbalancer test-lb \
      --protocol HTTP \
      --protocol-port 80
    
  2. プールを作成し、ポート 80 で HTTP コンテンツを返すメンバーをプールに追加します。この例では、ウェブサーバーは 192.168.1.16192.168.1.17 です。

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

    $ curl 192.168.1.22
    web2
    $ curl 192.168.1.22
    web1
    $ curl 192.168.1.22
    web2
    $ curl 192.168.1.22
    web1
    

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

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

    $ neutron lbaas-healthmonitor-create \
      --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 \
      --subnet private-subnet \
      --address 192.168.1.16 \
      --protocol-port 443 \
      test-lb-pool-https
    $ neutron lbaas-member-create \
      --subnet private-subnet \
      --address 192.168.1.17 \
      --protocol-port 443 \
      test-lb-pool-https
    
  2. HTTPS プールに対してもヘルスモニターを追加できます。

    $ neutron lbaas-healthmonitor-create \
      --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 アドレスが必要です。

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

$ neutron floatingip-associate FLOATINGIP_ID LOAD_BALANCER_PORT_ID

LBaaS v2 のクォータの設定

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

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 種類の統計情報を収集します。ユーザーはこれらの統計情報を 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.