検索

9.6. HTTP/2 リスナーを使用した TLS 終端ロードバランサーの作成

download PDF

TLS 終端 HTTPS ロードバランサーを使用することで、CPU 負荷の高い暗号化操作をロードバランサーにオフロードし、これによりロードバランサーはレイヤー 7 インスペクション等の高度な機能を使用することができます。HTTP/2 リスナーを追加すると、HTTP/2 プロトコルを利用してページをより速く読み込み、パフォーマンスを向上させることができます。ロードバランサーは、Application-Layer Protocol Negotiation (ALPN) TLS 拡張機能を使用してクライアントと HTTP/2 をネゴシエートします。

負荷分散サービス (octavia) は、エンドツーエンドの HTTP/2 トラフィックをサポートします。つまり、HTTP2 トラフィックは、リクエストがリスナーに到達してからロードバランサーから応答が返されるまで、HAProxy で変換されません。エンドツーエンドの HTTP/2 トラフィックを実現するには、バックエンド再暗号化を備えた HTTP プール、つまり安全なポートでリッスンしているプールメンバーと、HTTPS トラフィック用に設定された Web アプリケーションが必要です。

バックエンドの再暗号化なしで、HTTP/2 トラフィックを HTTP プールに送信できます。この状況では、HAProxy はトラフィックがプールに到達する前にそのトラフィックを変換し、応答はロードバランサーから返される前に HTTP/2 に変換されます。

Red Hat では、バックエンドメンバーが利用可能な状態を維持できるようにヘルスモニターを作成することを推奨します。

注記

現在、負荷分散サービスは、HTTP/2 リスナーを使用する TLS で終了するロードバランサーの健全性監視をサポートしていません。

前提条件

  • TLS 公開鍵暗号化は、次の特性で設定されています。

    • ロードバランサーの仮想 IP アドレス (例: www.example.com) に割り当てられた DNS 名用に、TLS 証明書、鍵、および中間証明書チェーンが外部認証局 (CA) から取得される。
    • 証明書、鍵、および中間証明書チェーンが、現在のディレクトリー内の個別ファイルに保存される。
    • 鍵および証明書は PEM 形式でエンコードされる。
    • 中間証明書チェーンには PEM 形式でエンコードされた複数の証明書が含まれ、チェーンを形成する。
  • Key Manager サービス (barbican) を使用するように Load-balancing サービス (octavia) が設定されている。詳細は、Key Manager サービスによるシークレットの管理 ガイドを参照してください。

手順

  1. 鍵 (server.key)、証明書 (server.crt)、および中間証明書チェーン (ca-chain.crt) を 1 つの PKCS12 ファイル (server.p12) に組み合わせます。

    注記

    丸かっこ内の値は、この手順のコマンド例で使用されるサンプルの値です。これらのサンプル値を、実際のサイトに適した値に置き換えてください。

    重要

    PKCS12 ファイルの作成時は、ファイルをパスワードで保護しないでください。

    この例では、PKCS12 ファイルはパスワードなしで作成されます。

    $ openssl pkcs12 -export -inkey server.key -in server.crt \
    -certfile ca-chain.crt -passout pass: -out server.p12
  2. Source コマンドで認証情報ファイルを読み込みます。

    $ source ~/overcloudrc

  3. Key Manager サービスを使用して、PKCS12 ファイルのシークレットリソース (tls_secret1) を作成します。

    $ openstack secret store --name='tls_secret1' \
    -t 'application/octet-stream' -e 'base64' \
    --payload="$(base64 < server.p12)"

  4. パブリックサブネット (public_subnet) にロードバランサー (lb1) を作成します。

    $ openstack loadbalancer create --name lb1 --vip-subnet-id \
    public_subnet --wait

  5. TERMINATED_HTTPS リスナー (listener1) を作成し、次の操作を実行します。

    • シークレットリソース (tls_secret1) をリスナーのデフォルトの TLS コンテナーとして参照します。
    • ALPN プロトコル (h2) を設定します。
    • クライアントが HTTP/2 (http/1.1) をサポートしていない場合は、フォールバックプロトコルを設定します。

      $ openstack loadbalancer listener create --name listener1 \
      --protocol-port 443 --protocol TERMINATED_HTTPS --alpn-protocol h2 \
      --alpn-protocol http/1.1 --default-tls-container=\
      $(openstack secret list | awk '/ tls_secret1 / {print $2}') lb1

  6. プール (pool1) を作成し、リスナーのデフォルトプールに設定します。

    この例のコマンドは、TCP ポート 80 上の Web アプリケーションで設定された HTTP アプリケーションをホストするバックエンドサーバーを含めて HTTP プールを作成します。

    $ openstack loadbalancer pool create --name pool1 \
    --lb-algorithm ROUND_ROBIN --listener listener1 --protocol HTTP
  7. バックエンドサーバーに接続するプール (pool1) 上に、タイプ (TCP) のヘルスモニター (healthmon1) を作成します。

    ヘルスチェックは推奨されていますが、必須ではありません。ヘルスモニターが定義されていない場合、メンバーサーバーは ONLINE とみなされます。

    $ openstack loadbalancer healthmonitor create --name healthmon1 \
    --delay 15  --max-retries 4 --timeout 10 --type TCP pool1

  8. プライベートサブネット (private_subnet) 上の HTTP バックエンドサーバー (192.0.2.10 および 192.0.2.11) をプールに追加します。

    この例では、バックエンドサーバー 192.0.2.10 および 192.0.2.11 の名前は、それぞれ member1 および member2 です。

    $ openstack loadbalancer member create --name member1 --subnet-id \
    private_subnet --address 192.0.2.10 --protocol-port 80 pool1
    
    $ openstack loadbalancer member create --name member2 --subnet-id \
    private_subnet --address 192.0.2.11 --protocol-port 80 pool1

検証

  1. ロードバランサー (lb1) の設定を表示して確認します。

    $ openstack loadbalancer status show lb1

    出力例

    {
        "loadbalancer": {
            "id": "936dad29-4c3f-4f24-84a8-c0e6f10ed810",
            "name": "lb1",
            "operating_status": "ONLINE",
            "provisioning_status": "ACTIVE",
            "listeners": [
                {
                    "id": "708b82c6-8a6b-4ec1-ae53-e619769821d4",
                    "name": "listener1",
                    "operating_status": "ONLINE",
                    "provisioning_status": "ACTIVE",
                    "pools": [
                        {
                            "id": "5ad7c678-23af-4422-8edb-ac3880bd888b",
                            "name": "pool1",
                            "provisioning_status": "ACTIVE",
                            "operating_status": "ONLINE",
                            "health_monitor": {
                                "id": "4ad786ef-6661-4e31-a325-eca07b2b3dd1",
                                "name": "healthmon1",
                                "type": "TCP",
                                "provisioning_status": "ACTIVE",
                                "operating_status": "ONLINE"
                            },
                            "members": [
                                {
                                    "id": "facca0d3-61a7-4b46-85e8-da6994883647",
                                    "name": "member1",
                                    "operating_status": "ONLINE",
                                    "provisioning_status": "ACTIVE",
                                    "address": "192.0.2.10",
                                    "protocol_port": 80
                                },
                                {
                                    "id": "2b0d9e0b-8e0c-48b8-aa57-90b2fde2eae2",
                                    "name": "member2",
                                    "operating_status": "ONLINE",
                                    "provisioning_status": "ACTIVE",
                                    "address": "192.0.2.11",
                                    "protocol_port": 80
                                }
    ...

  2. ヘルスモニターが存在し正常に機能する場合は、各メンバーのステータスを確認することができます。

    $ openstack loadbalancer member show pool1 member1

    出力例

    動作中のメンバー (member1) の operating_status 値は ONLINE です。

    +---------------------+--------------------------------------+
    | Field               | Value                                |
    +---------------------+--------------------------------------+
    | address             | 192.0.2.10                           |
    | admin_state_up      | True                                 |
    | created_at          | 2023-11-16T20:08:01                  |
    | id                  | facca0d3-61a7-4b46-85e8-da6994883647 |
    | name                | member1                              |
    | operating_status    | ONLINE                               |
    | project_id          | 9b29c91f67314bd09eda9018616851cf     |
    | protocol_port       | 80                                   |
    | provisioning_status | ACTIVE                               |
    | subnet_id           | 3b459c95-64d2-4cfa-b348-01aacc4b3fa9 |
    | updated_at          | 2023-11-16T20:08:42                  |
    | weight              | 1                                    |
    | monitor_port        | None                                 |
    | monitor_address     | None                                 |
    | backup              | False                                |
    | tags                |                                      |
    +---------------------+--------------------------------------+

関連情報

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.