第4章 OpenStack でのフェデレーションの設定

4.1. IP アドレスと FQDN 設定の特定

以下のノードには、割り当てられた完全修飾ドメイン名(FQDN)が必要です。

  • Dashboard (horizon)を実行しているホスト。
  • Identity サービス(keystone)を実行中のホスト。本書では $FED_KEYSTONE_HOST として参照されています。複数のホストが高可用性環境でサービスを実行するため、IP アドレスはホストアドレスではなく、サービスにバインドされる IP アドレスであることに注意してください。
  • RH-SSO を実行するホスト。
  • IdM を実行するホスト。

Red Hat OpenStack Platform director のデプロイメントでは DNS が設定されていないか、FQDN をノードに割り当てます。ただし、認証プロトコル(および TLS)には FQDN を使用する必要があります。したがって、オーバークラウドの外部パブリック IP アドレスを確認する必要があります。オーバークラウドの IP アドレスが必要な点に注意してください。これは、オーバークラウドの個別ノード(controller- 0、controller -1 など)に割り当てられる IP アドレスと同じです

IP アドレスは個別のノードではなく高可用性クラスターに割り当てられるので、オーバークラウドの外部パブリック IP アドレスが必要です。Pacemaker と HAProxy は連携して、単一 IP アドレスの外観を提供します。この IP アドレスは、クラスター内の任意のノードの個別 IP アドレスとは全く異なります。そのため、OpenStack サービスの IP アドレスについて適切な方法は、サービスがどのノードで実行されているかを検討するのではありませんが、クラスターがそのサービスに対してアドバタイズする効果的な IP アドレスを考慮するのではなく(VIP など)、OpenStack サービスの IP アドレスについて適切な方法を検討することができます。

4.1.1. IP アドレスの取得

正しい IP アドレスを決定するには、DNS を使用する代わりに名前を割り当てる必要があります。これには 2 つの方法があります。

  1. Red Hat OpenStack Platform director は、全 OpenStack サービスに共通のパブリック IP アドレスを 1 つ使用し、それらのサービスをポート番号で 1 つのパブリック IP アドレスで分離します。OpenStack クラスター内の 1 つのサービスのパブリック IP アドレスを把握している場合は、それらすべてを確認できます(サービスのポート番号も通知されません)。アンダークラウドの ~stack ホームディレクトリーにある overcloudrc ファイルの Keystone URL を確認することができます。以下に例を示します。

    export OS_AUTH_URL=https://10.0.0.101:13000/v2.0

    これにより、パブリックの keystone IP アドレスが 10.0.0.101 で、keystone がポート 13000 で利用可能であることが分かります。拡張により、その他の OpenStack サービスはすべて、固有のポート番号を持つ 10.0.0.101 の IP アドレスでも利用できます。

  2. ただし、IP アドレスとポート番号の情報を判断するためのより正確な方法は、各オーバークラウドノードにある HAProxy 設定ファイル(/var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg)を調べることです。haproxy.cfg ファイルは、オーバークラウドの各コントローラーノード上の 同一 コピーです。これは、HAProxy に障害が発生した場合に、Pacemaker がクラスターに対して HAProxy を実行する責任を 1 つ割り当てるため、HAProxy の失敗 Pacemaker が別のオーバークラウドコントローラーを再割り当てしてしまうためです。どのコントローラーノードが 現在 HAProxy を実行しているかに関係なく、同じ動作状態でなければなりません。したがって、haproxy.cfg ファイルは同一でなければなりません。

    1. haproxy.cfg ファイルを検証するには、クラスターのコントローラーノードのいずれかに対して SSH を実行し、/var/lib/config-data/puppet-generated/haproxy/etc/haproxy/haproxy.cfg を確認します。前述のように、どのコントローラーノードを選択しても問題ありません。
    2. haproxy.cfg ファイルはセクションに分割され、各セクションには listen ステートメントで始まり、その後にサービス名が続きます。サービスセクションの直後には bind ステートメントです。これらは フロントエンド IP アドレスであり、一部がパブリックで、その他はクラスターの内部になります。サーバー の行は、サービスが実際に実行されている バック IP アドレスです。クラスター内の各コントローラーノードに 1 つの サーバー 行が必要です。
    3. セクションの複数の バインド エントリーからサービスのパブリック IP アドレスとポートを確認するには、以下を実行します。

      Red Hat OpenStack Platform director は、最初の バインド エントリーとしてパブリック IP アドレスを配置します。さらに、パブリック IP アドレスは TLS をサポートする必要があるため、バインド エントリーには ssl キーワードがあります。IP アドレスは、overstackrc ファイルにある OS_AUTH_URL に設定された IP アドレスにも一致する必要があります。たとえば、haproxy.cfgkeystone_public セクションの例を以下に示します。

      listen keystone_public
        bind 10.0.0.101:13000 transparent ssl crt /etc/pki/tls/private/overcloud_endpoint.pem
        bind 172.17.1.19:5000 transparent
        mode http
        http-request set-header X-Forwarded-Proto https if { ssl_fc }
        http-request set-header X-Forwarded-Proto http if !{ ssl_fc }
        option forwardfor
        redirect scheme https code 301 if { hdr(host) -i 10.0.0.101 } !{ ssl_fc }
        rsprep ^Location:\ http://(.*) Location:\ https://\1
        server controller-0.internalapi.localdomain 172.17.1.13:5000 check fall 5 inter 2000 rise 2 cookie controller-0.internalapi.localdomain
        server controller-1.internalapi.localdomain 172.17.1.22:5000 check fall 5 inter 2000 rise 2 cookie controller-1.internalapi.localdomain
    4. 最初の bind 行には ssl キーワードがあり、IP アドレスは overstackrc ファイルにある OS_AUTH_URL と一致します。これにより、keystone がポート 13000 の IP アドレス 10.0.0.101 で公開されているようにすることができます。
    5. 2 つ目の bind 行はクラスターの内部であり、クラスターで実行されている他の OpenStack サービスで使用されます(TLS は公開されないため、TLS を使用しないことに注意してください)。
    6. モード http 設定は、使用中のプロトコルが HTTP であることを示しています。これにより、HAProxy は他のタスクにおいて HTTP ヘッダーを検査できます。
    7. X-Forwarded-Proto 行:

      http-request set-header X-Forwarded-Proto https if { ssl_fc }
      http-request set-header X-Forwarded-Proto http if !{ ssl_fc }

      これらの設定には特別な注意が必要であり、「ホスト変数の設定とホスト名」 で詳細を説明します。HTTP ヘッダー X-Forwarded-Proto がバックエンドサーバーによって設定され、表示されることを保証します。多くの場合、バックエンドサーバーはクライアントが HTTPS を使用しているかどうかを知っておく必要があります。ただし、HAProxy は TLS を終了するため、バックエンドサーバーは TLS 以外として接続を確認できます。X-Forwarded-Proto HTTP ヘッダーは、バックエンドサーバーが、要求が到達したプロトコルではなく、クライアントが実際に使用されたプロトコルを特定できるようにするメカニズムです。クライアントがプロトコルが HTTPS である悪意のある偽装を可能にするため、クライアントは X-Forwarded-Proto HTTP ヘッダーを送信できないことが 必須です。X-Forwarded-Proto HTTP ヘッダーはクライアントから受信時にプロキシーによって削除できます。または、プロキシーは強制的に設定するため、クライアントによる悪意のある使用を軽減することができます。このため、X-Forwarded-Proto は常に https または http のいずれかに設定されます。

      HTTP ヘッダー X-Forwarded-For は、クライアントを追跡するために使用されます。これにより、バックエンドサーバーはプロキシーとして表示されるのではなく、要求側のクライアントを識別できます。このオプションにより 、HTTP ヘッダーの X-Forwarded-For が要求に挿入されます。

      option forwardfor

      転送された proto、direct、ServerName などの詳細は、「ホスト変数の設定とホスト名」 を参照してください。

    8. 以下の行では、パブリック IP アドレスで HTTPS のみが使用されていることを確認します。

      redirect scheme https code 301 if { hdr(host) -i 10.0.0.101 } !{ ssl_fc }

      この設定は、公開 IP アドレス(例: 10.0.0.101)で要求を受信し、HTTPS ではなかったかどうかを特定し、301 リダイレクト を実行し、スキームを HTTPS に設定します。

    9. HTTP サーバー(Apache など)はリダイレクト目的で自己参照 URL を生成することがよくあります。このリダイレクト場所は正しいプロトコルを指定する必要がありますが、サーバーが TLS ターミネーターの背後にある場合は、リダイレクト URL は HTTPS ではなく HTTP である必要があります。この行は、HTTP スキームを使用する応答に Location ヘッダーが表示されるかどうかを特定し、HTTPS スキームを使用するように書き換えます。

      rsprep ^Location:\ http://(.*) Location:\ https://\1

4.1.2. ホスト変数の設定とホスト名

使用する IP アドレスとポートを確認する必要があります。以下の例では、IP アドレスは 10.0.0.101 で、ポートは 13000 です。

  1. この値は overcloudrc で確認することができます。

    export OS_AUTH_URL=https://10.0.0.101:13000/v2.0
  2. また、haproxy.cfg ファイルの keystone_public セクションで、以下を実行します。

    bind 10.0.0.101:13000 transparent ssl crt /etc/pki/tls/private/overcloud_endpoint.pem
  3. また、IP アドレスに FQDN を指定する必要があります。この例では、overcloud.localdomain を使用します。DNS が使用されていないため、IP アドレスは /etc/hosts ファイルに配置する必要があります。

    10.0.0.101 overcloud.localdomain # FQDN of the external VIP
    注記

    Red Hat OpenStack Platform director にはオーバークラウドノードの ホスト ファイルがすでに設定されているはずですが、参加する外部ホストにホストエントリーを追加する必要があります。

  4. $FED_KEYSTONE_HOST および $FED_KEYSTONE_HTTPS_PORTfed_variables ファイルで設定する必要があります。上記の例の値の使用:

    FED_KEYSTONE_HOST="overcloud.localdomain"
    FED_KEYSTONE_HTTPS_PORT=13000

Mellon は keystone をホストする Apache サーバーで実行しているため、Mellon host:port および keystone host:port の値は一致します。

注記

コントローラーノードのいずれ かでホスト名 を実行する場合は、controller-0.localdomain が使用される可能性がありますが、これはパブリック名ではなく 内部クラスター 名であることに注意してください。代わりに、パブリック IP アドレス を使用する必要があります。