第16章 Octavia を使用した Load Balancing-as-a-Service (LBaaS)

OpenStack Load-balancing サービス (Octavia) は、Red Hat OpenStack platform director ベースのインストール環境で、Load Balancing-as-a-Service (LBaaS) バージョン 2 の実装を提供します。本項では、Octavia を有効化する方法について説明します。Octavia サービスは、Networking API サーバーと同じノードでホストされていることを前提とします。デフォルトでは、ロードバランシングサービスはコントローラーノード上で実行されます。

注記

Octavia を使用した LBaaSv2 では、現在プラグインをサポートしていません。商用の OpenStack ロードバランシングソリューションを利用の場合には、引き続き LBaaSv2 API を使用する必要があります。詳しくは、「15章Neutron LBaaSv2 API を使用した Load Balancing-as-a-Service の設定」を参照してください。

16.1. Octavia の概要

Octavia は、amphora と呼ばれるコンピュートノード上の一式のインスタンスを使用します。amphora との通信は、ロードバランシングの管理ネットワーク (lb-mgmt-net) 上で行われます。

Octavia には以下が含まれています。

API コントローラー (octavia_api container)
設定更新および amphora インスタンスのデプロイ、モニタリング、削除でコントローラーワーカーと通信します。
コントローラーワーカー (octavia_worker container)
LB ネットワーク上で設定および設定の更新を amphora に送信します。
ヘルスマネージャー
個々の amphora の正常性をモニタリングし、amphora で予期せずにエラーが発生した場合にフェイルオーバーイベントを処理します。
ハウスキーピングマネージャー
古い (削除済みの) データベースレコードのクリーンアップ、spares プールの管理、amphora の証明書のローテーションの管理を行います。
ロードバランサー
ロードバランシングエンティティーを表す最上位の API オブジェクト。仮想 IP アドレスは、ロードバランサーの作成時に確保されます。ロードバランサーの作成時には、amphora インスタンスがコンピュートノードで起動されます。
Amphora
ロードバランシングを行うインスタンス。Amphora は通常、コンピュートノード上で実行されるインスタンスで、リスナー、プール、ヘルスモニター、L7 ポリシー、メンバーで設定されます。Amphora はヘルスマネージャーに定期的なハートビートを送信します。
リスナー
ロードバランシングされるサービスのリスニングエンドポイント (例: HTTP)。リスナーは、複数のプールを参照する場合があります (レイヤー 7 ルールを使用してそれらのプールを切り替えます)。
プール
ロードバランサー (amphora) からのクライアント要求を処理するメンバーのグループ。1 つのプールは 1 つのリスナーにのみ関連付けられます。
メンバー
プール内のロードバランサー (amphora) の背後で、トラフィックを処理する Compute インスタンス

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

OpenStack Networking Guide 471659 0518 LBaaS Topology

16.2. ソフトウェア要件

Octavia には、以下の OpenStack コアコンポーネントを設定する必要があります。

  • Compute (nova)
  • Networking (allowed_address_pairs を有効化)
  • Image (glance)
  • Key Manager (barbican) TLS オフロード機能が有効化されている場合
  • Identity (keystone)
  • RabbitMQ
  • MySQL

16.3. アンダークラウドの前提条件

本項では、アンダークラウドがインストール済みで、Octavia を有効化してオーバークラウドをデプロイする準備が整っていることを前提としています。コンテナーベースのデプロイメントのみがサポートされています。Octavia はコントローラーノードで実行されます。

注記

既存のオーバークラウドデプロイメントで Octavia サービスを有効にする場合には、アンダークラウドを準備する必要があります。準備を行わないと、Octavia が動作していない状態でオーバークラウドのインストールは成功と報告されます。アンダークラウドを準備するには、『Transitioning to Containerized Services』を参照してください。

16.4. Octavia デプロイメントのプランニング

Red Hat OpenStack Platform は、ロードバランシングサービスのデプロイ後のステップを簡素化するためのワークフロータスクを提供しています。tripleo-common/workbooks/octavia_post.yaml ワークブックは、tripleo-heat-templates/docker/services/octavia/octavia-deployment-config.yaml ファイルから設定されます。

この Octavia ワークフローは、Ansible Playbook のセットを実行して、オーバークラウドのデプロイの最終段階として、以下のデプロイ後のステップを提供します。

  • 証明書とキーを設定します。
  • amphora、Octavia コントローラーワーカー、ヘルスマネージャーの間のロードバランシング管理ネットワークを設定します。
注記

OpenStack Heat テンプレートは直接編集しないでください。カスタムの環境ファイル (例: octavia-environment.yaml) を作成して、デフォルトのパラメーター値をオーバーライドしてください。

Amphora イメージ

director はデフォルトの amphora イメージを自動的にダウンロードして、オーバークラウドの Image サービスにアップロードし、Octavia がその amphora イメージを使用するように設定します。director は、スタックの更新またはアップグレード中に、このイメージを最新の amphora イメージに更新します。

注記

カスタムの amphora イメージはサポートされていません。

16.4.1. Octavia の証明書とキーの設定

Octavia のコンテナーでは、ロードバランサーとの通信、および相互の通信をセキュアに実行する必要があります。独自の証明書とキーを指定することができます。適切なパラメーターをカスタムの環境ファイル (例: octavia-environment.yaml) に追加します。

ユーザーが提供する証明書とキーの設定

OctaviaGenerateCerts パラメーターを false に設定して、独自の証明書とキーを Octavia に指定することができます。

以下の例は、証明書とキーを自分で指定するためのパラメーターの設定値を示しています。

parameter_defaults:
    OctaviaCaCert: |
      -----BEGIN CERTIFICATE-----
      MIIDgzCCAmugAwIBAgIJAKk46qw6ncJaMA0GCSqGSIb3DQEBCwUAMFgxCzAJBgNV
      [snip]
      sFW3S2roS4X0Af/kSSD8mlBBTFTCMBAj6rtLBKLaQbIxEpIzrgvp
      -----END CERTIFICATE-----

    OctaviaCaKey: |
      -----BEGIN RSA PRIVATE KEY-----
      Proc-Type: 4,ENCRYPTED
      [snip]
      -----END RSA PRIVATE KEY-----[

    OctaviaClient: |
      Certificate:
        Data:
            Version: 3 (0x2)
            Serial Number: 3 (0x3)
      [snip]
      -----END PRIVATE KEY-----

    OctaviaCaKeyPassphrase:
        b28c519a-5880-4e5e-89bf-c042fc75225d

    OctaviaGenerateCerts: false
[rest of file snipped]
注記

証明書とキーは、複数行の値で、すべての行を同じレベルにインデントする必要があります。

16.5. Octavia のデプロイ

Octavia をデプロイするには、Octavia のパラメーターの適切な値を判断して、オーバーライドする値をカスタムの環境ファイル (例: octavia-environment.yaml) で設定します。

16.5.1. ロードバランシングネットワークの設定

以下のデフォルト値を使用してロードバランシングネットワークを設定することができます。

  OctaviaControlNetwork: 'lb-mgmt-net'
  OctaviaControlSubnet: 'lb-mgmt-subnet'
  OctaviaControlSecurityGroup: 'lb-mgmt-sec-group'
  OctaviaControlSubnetCidr: '172.24.0.0/16'
  OctaviaControlSubnetGateway: '172.24.0.1'
  OctaviaControlSubnetPoolStart: '172.24.0.2'
  OctaviaControlSubnetPoolEnd: '172.24.255.254'

16.5.2. 管理ポートの設定

この手順はオプションです。デフォルトの設定値を使用しない場合には、カスタムの環境ファイル (例: octavia-environment.yaml) を使用して以下のパラメーターをオーバーライドします。

OctaviaMgmtPortDevName: "o-hm0"

16.5.3. director を使用した Octavia のデプロイ

お使いの環境が Octavia のイメージにアクセスできることを確認してください。イメージの登録方法に関する詳しい情報は、『director のインストールと使用方法』の「コンテナー化」を参照してください。

オーバークラウドで Octavia をデプロイする手順

    openstack overcloud deploy --templates \
    -e /usr/share/openstack-tripleo-heat-templates/environments/services/octavia.yaml
注記

director は、スタックの更新またはアップグレード中に amphora イメージを最新の amphora イメージに更新します。

16.6. HTTP ロードバランサーの設定

簡単な HTTP ロードバランサーを設定する手順

  1. サブネット上にロードバランサーを作成します。

    $ openstack loadbalancer create --name lb1 --vip-subnet-id private-subnet

    ロードバランサーが作成されるまで待ちます。オプションで openstack loadbalancer show lb1 コマンドを使用して、ロードバランスのステータスが Active および ONLINE になるのを確認することができます。仮想 IP のポート ID は、後のステップで使用します。

  2. リスナーを作成します。

    $ openstack loadbalancer listener create --name listener1 --protocol HTTP --protocol-port 80 lb1
  3. リスナーのデフォルトプールを作成します。

    $ openstack loadbalancer pool create --name pool1 --lb-algorithm ROUND_ROBIN --listener listener1 --protocol HTTP
  4. プール上にヘルスモニターを作成して、“/healthcheck” パスをテストします。

    $ openstack loadbalancer healthmonitor create --delay 5 --max-retries 4 --timeout 10 --type HTTP --url-path /healthcheck pool1
  5. プールにロードバランサーのメンバーを追加します。

    $ openstack loadbalancer member create --subnet-id private-subnet --address 192.0.2.10 --protocol-port 80 pool1
    $ openstack loadbalancer member create --subnet-id private-subnet --address 192.0.2.11 --protocol-port 80 pool1
  6. パブリックのサブネットに Floating IP アドレスを作成します。

    $ openstack floating ip create public
  7. この Floating IP をロードバランサーの仮想 IP ポートに割り当てます。

    $ openstack floating ip set --port `_LOAD_BALANCER_VIP_PORT_` `_FLOATING_IP_`

16.7. ロードバランサーの検証

ロードバランサーを検証する手順

  1. ロードバランサーの設定を確認するには、openstack loadbalancer show コマンドを使用します。

    (overcloud) [stack@undercloud-0 ~]$ openstack loadbalancer show lb1
    +---------------------+--------------------------------------+
    | Field               | Value                                |
    +---------------------+--------------------------------------+
    | admin_state_up      | True                                 |
    | created_at          | 2018-04-18T12:28:34                  |
    | description         |                                      |
    | flavor              |                                      |
    | id                  | 788fe121-3dec-4e1b-8360-4020642238b0 |
    | listeners           | 09f28053-fde8-4c78-88b9-0f191d84120e |
    | name                | lb1                                  |
    | operating_status    | ONLINE                               |
    | pools               | 627842b3-eed8-4f5f-9f4a-01a738e64d6a |
    | project_id          | dda678ca5b1241e7ad7bf7eb211a2fd7     |
    | provider            | octavia                              |
    | provisioning_status | ACTIVE                               |
    | updated_at          | 2018-04-18T14:03:09                  |
    | vip_address         | 192.168.0.11                         |
    | vip_network_id      | 9bca13be-f18d-49a5-a83d-9d487827fd16 |
    | vip_port_id         | 69a85edd-5b1c-458f-96f2-b4552b15b8e6 |
    | vip_qos_policy_id   | None                                 |
    | vip_subnet_id       | 5bd7334b-49b3-4849-b3a2-b0b83852dba1 |
    +---------------------+--------------------------------------+
  2. ロードバランサー lb1 に関連付けられた amphora の UUID を確認するには、amphora list コマンドを使用します。

    (overcloud) [stack@undercloud-0 ~]$ openstack loadbalancer amphora list | grep <UUID of loadbalancer lb1>
  3. amphora の情報を確認するには、amphora の UUID と共に amphora show コマンドを使用します。

    (overcloud) [stack@undercloud-0 ~]$ openstack loadbalancer amphora show 62e41d30-1484-4e50-851c-7ab6e16b88d0
    +-----------------+--------------------------------------+
    | Field           | Value                                |
    +-----------------+--------------------------------------+
    | id              | 62e41d30-1484-4e50-851c-7ab6e16b88d0 |
    | loadbalancer_id | 53a497b3-267d-4abc-968f-94237829f78f |
    | compute_id      | 364efdb9-679c-4af4-a80c-bfcb74fc0563 |
    | lb_network_ip   | 192.168.0.13                         |
    | vrrp_ip         | 10.0.0.11                            |
    | ha_ip           | 10.0.0.10                            |
    | vrrp_port_id    | 74a5c1b4-a414-46b8-9263-6328d34994d4 |
    | ha_port_id      | 3223e987-5dd6-4ec8-9fb8-ee34e63eef3c |
    | cert_expiration | 2020-07-16T12:26:07                  |
    | cert_busy       | False                                |
    | role            | BACKUP                               |
    | status          | ALLOCATED                            |
    | vrrp_interface  | eth1                                 |
    | vrrp_id         | 1                                    |
    | vrrp_priority   | 90                                   |
    | cached_zone     | nova                                 |
    | created_at      | 2018-07-17T12:26:07                  |
    | updated_at      | 2018-07-17T12:30:36                  |
    +-----------------+--------------------------------------+
  4. リスナーの情報を確認するには、openstack loadbalancer listener show コマンドを使用します。

    (overcloud) [stack@undercloud-0 ~]$ openstack loadbalancer listener show listener1
    +---------------------------+------------------------------------------------------------------------+
    | Field                     | Value                                                                  |
    +---------------------------+------------------------------------------------------------------------+
    | admin_state_up            | True                                                                   |
    | connection_limit          | -1                                                                     |
    | created_at                | 2018-04-18T12:51:25                                                    |
    | default_pool_id           | 627842b3-eed8-4f5f-9f4a-01a738e64d6a                                   |
    | default_tls_container_ref | http://10.0.0.101:9311/v1/secrets/7eafeabb-b4a1-4bc4-8098-b6281736bfe2 |
    | description               |                                                                        |
    | id                        | 09f28053-fde8-4c78-88b9-0f191d84120e                                   |
    | insert_headers            | None                                                                   |
    | l7policies                |                                                                        |
    | loadbalancers             | 788fe121-3dec-4e1b-8360-4020642238b0                                   |
    | name                      | listener1                                                              |
    | operating_status          | ONLINE                                                                 |
    | project_id                | dda678ca5b1241e7ad7bf7eb211a2fd7                                       |
    | protocol                  | TERMINATED_HTTPS                                                       |
    | protocol_port             | 443                                                                    |
    | provisioning_status       | ACTIVE                                                                 |
    | sni_container_refs        | []                                                                     |
    | updated_at                | 2018-04-18T14:03:09                                                    |
    +---------------------------+------------------------------------------------------------------------+
  5. プールとロードバランサーのメンバーを確認するには、openstack loadbalancer pool show コマンドを使用します。

    (overcloud) [stack@undercloud-0 ~]$ openstack loadbalancer pool show pool1
    +---------------------+--------------------------------------+
    | Field               | Value                                |
    +---------------------+--------------------------------------+
    | admin_state_up      | True                                 |
    | created_at          | 2018-04-18T12:53:49                  |
    | description         |                                      |
    | healthmonitor_id    |                                      |
    | id                  | 627842b3-eed8-4f5f-9f4a-01a738e64d6a |
    | lb_algorithm        | ROUND_ROBIN                          |
    | listeners           | 09f28053-fde8-4c78-88b9-0f191d84120e |
    | loadbalancers       | 788fe121-3dec-4e1b-8360-4020642238b0 |
    | members             | b85c807e-4d7c-4cbd-b725-5e8afddf80d2 |
    |                     | 40db746d-063e-4620-96ee-943dcd351b37 |
    | name                | pool1                                |
    | operating_status    | ONLINE                               |
    | project_id          | dda678ca5b1241e7ad7bf7eb211a2fd7     |
    | protocol            | HTTP                                 |
    | provisioning_status | ACTIVE                               |
    | session_persistence | None                                 |
    | updated_at          | 2018-04-18T14:03:09                  |
    +---------------------+--------------------------------------+
  6. Floating IP アドレスを確認するには、openstack floating ip list コマンドを使用します。

    (overcloud) [stack@undercloud-0 ~]$ openstack floating ip list
    +--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+
    | ID                                   | Floating IP Address | Fixed IP Address | Port                                 | Floating Network                     | Project                          |
    +--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+
    | 89661971-fa65-4fa6-b639-563967a383e7 | 10.0.0.213          | 192.168.0.11     | 69a85edd-5b1c-458f-96f2-b4552b15b8e6 | fe0f3854-fcdc-4433-bc57-3e4568e4d944 | dda678ca5b1241e7ad7bf7eb211a2fd7 |
    +--------------------------------------+---------------------+------------------+--------------------------------------+--------------------------------------+----------------------------------+
  7. HTTPS トラフィックがロードバランサー全体に流れることを確認します。

    (overcloud) [stack@undercloud-0 ~]$ curl -v https://10.0.0.213 --insecure
    * About to connect() to 10.0.0.213 port 443 (#0)
    *   Trying 10.0.0.213...
    * Connected to 10.0.0.213 (10.0.0.213) port 443 (#0)
    * Initializing NSS with certpath: sql:/etc/pki/nssdb
    * skipping SSL peer certificate verification
    * SSL connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
    * Server certificate:
    * 	subject: CN=www.example.com,O=Dis,L=Springfield,ST=Denial,C=US
    * 	start date: Apr 18 09:21:45 2018 GMT
    * 	expire date: Apr 18 09:21:45 2019 GMT
    * 	common name: www.example.com
    * 	issuer: CN=www.example.com,O=Dis,L=Springfield,ST=Denial,C=US
    > GET / HTTP/1.1
    > User-Agent: curl/7.29.0
    > Host: 10.0.0.213
    > Accept: */*
    >
    < HTTP/1.1 200 OK
    < Content-Length: 30
    <
    * Connection #0 to host 10.0.0.213 left intact