Google Cloud Load Balancing 用の TCP プロキシの設定

Google Cloud Platform(GCP)TCP プロキシの負荷分散により、世界中のすべてのユーザーに対して単一の IP アドレスを使用できます。GCP TCP プロキシの負荷分散では、ユーザーに最も近いインスタンスにトラフィックが自動的にルーティングされます。

Cloud TCP プロキシ負荷分散は、HTTP 以外のトラフィックを対象としています。HTTP トラフィックの場合は、代わりに HTTP(S) 負荷分散を使用することをおすすめします。プロキシが使用される SSL トラフィックの場合は、SSL プロキシの負荷分散を使用してください。

TCP 負荷分散は、IPv4 アドレスと IPv6 アドレスのクライアント トラフィックに対応しています。クライアントの IPv6 リクエストはグローバル負荷分散層で終了し、IPv4 経由でバックエンドに送信されます。

目次

概要

TCP トラフィックに TCP プロキシを使用すると、グローバル負荷分散層で顧客の TCP セッションを停止し、TCP または SSL を使用して仮想マシン インスタンスにトラフィックを転送できます。

TCP プロキシ負荷分散は、グローバル負荷分散サービスです。複数のリージョンにインスタンスをデプロイできます。また、グローバル負荷分散によってユーザーに最も近いリージョンにトラフィックが自動的に転送されます。リージョンの容量に達すると、ロードバランサは使用可能な容量を持つ別のリージョンに新しい接続を自動的に転送します。既存のユーザー接続は現在のリージョンにそのまま残ります。

TCP プロキシ負荷分散の利点:

  • 高度なルーティング機能 - ロードバランサによって、容量のあるバックエンドのロケーションにリクエストをルーティングできます。それに対して、L3/L4 ロードバランサは容量に注意を払わずにリージョンのバックエンドにルーティングする必要があります。より高度なルーティングを使用すると、x*N ではなく、N+1 または N+2 でプロビジョニングできるようになります。
  • セキュリティ パッチ - TCP スタックで脆弱性が生じると、インスタンスの安全が確保されるように、ロードバランサで自動的にパッチが適用されます。
  • TCP プロキシ負荷分散では、次のポートがサポートされています: 25、43、110、143、195、443、465、587、700、993、995、1883、5222

注:

  • TCP プロキシ負荷分散で HTTP を処理することもできますが、おすすめしません。HTTP トラフィックの場合は、代わりに HTTP 負荷分散を使用してください。

次に、TCP プロキシ負荷分散の仕組みを説明し、複数のインスタンスにトラフィックが負荷分散されるように TCP プロキシを設定する方法について詳しく説明します。

TCP プロキシ負荷分散の例

グローバル負荷分散層に TCP プロキシを設定すると、TCP 接続で受信するトラフィックはグローバル層で停止され、使用可能な最も近いインスタンス グループにプロキシ処理されます。

この例では、Iowa と Boston のユーザーからのトラフィックはグローバル負荷分散層で停止され、分割された接続は選択されたバックエンド サービスに向かうように設定されます。

TCP ターミネーションを使用した Google Cloud Load Balancing(クリックして拡大)
TCP ターミネーションを使用した Google Cloud Load Balancing(クリックして拡大)

TCP プロキシ負荷分散の設定

この例では、us-central1us-east1 という 2 つのリージョンに存在する簡単なサービスに対してグローバル TCP プロキシ負荷分散を設定する方法を示します。例で示されているサービスは、ポート 110 で応答するように設定された Apache サーバーのセットです。多くのブラウザではポート 110 は許可されないため、curl を使用する最終テストを行います。

以下を設定します。

  1. 2 つのリージョンに分散している 4 つのインスタンス
  2. インスタンスを保持するインスタンス グループ
  3. インスタンスの正常性をチェックするヘルスチェック
  4. グループ内のインスタンスをモニタリングし、設定された使用率を超過しないようにするバックエンド サービス
  5. TCP プロキシ自体
  6. ユーザーのトラフィックをプロキシに送信する外部静的 IPv4 アドレスと転送ルール
  7. ユーザーのトラフィックをプロキシに送信する外部静的 IPv6 アドレスと転送ルール
  8. ロードバランサおよびヘルス チェッカーからの、インスタンスへのトラフィックを許可するファイアウォール ルール

その後、設定をテストします。

インスタンスとインスタンス グループの設定

このセクションでは、簡単なインスタンス グループを作成し、それらにインスタンスを追加して、ヘルスチェックを行ってからそれらのインスタンスをバックエンド サービスに追加する方法を説明します。通常、本番環境システムではインスタンス テンプレートに基づいてマネージド インスタンス グループを使用しますが、初期テストにはこの設定の方がより簡単に行えます。

インスタンスの設定

テストの目的で、4 つのインスタンス、2 つのインスタンスのグループのそれぞれ 2 つに Apache をインストールしてください。通常、HTTP トラフィックには TCP プロキシ負荷分散を使用しませんが、Apache は広く使用されており、テスト用に簡単に設定できます。

これらのインスタンスはすべて tcp-lb のタグで作成されます。このタグは後でファイアウォール ルールによって使用されます。

Console


インスタンスの作成

  1. Google Cloud Platform Console の [VM インスタンス] ページに移動します。
    [VM インスタンス] ページに移動
  2. [インスタンスを作成] をクリックします。
  3. [名前] を「ig-us-central1-1」に設定します。
  4. [ゾーン] を us-central1-b に設定します。
  5. [管理、ディスク、ネットワーキング、SSH 認証鍵] をクリックすると、拡張設定が表示されます。
  6. [管理] で、[タグ] フィールドに「tcp-lb」と入力します。
  7. 次のように起動スクリプトを設定します。
       sudo apt-get update
       sudo apt-get install apache2 -y
       sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
       sudo sed -i '/\<VirtualHost *:80>/c\' /etc/apache2/sites-enabled/000-default.conf
       sudo service apache2 restart
       echo '<!doctype html><html><body><h1>ig-us-central1-1</h1></body></html>' | sudo tee /var/www/html/index.html
  8. 残りのフィールドはデフォルト値をそのまま使用します。
  9. [作成] をクリックします。
  10. 同じ設定で ig-us-central1-2 を作成します。ただし、起動スクリプトは次のように設定します。
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
        sudo sed -i '/\<VirtualHost *:80>/c\' /etc/apache2/sites-enabled/000-default.conf
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>ig-us-central1-2</h1></body></html>' | sudo tee /var/www/html/index.html
  11. 同じ設定で ig-us-east1-1 を作成します。ただし、ゾーンus-east1-b に設定し、起動スクリプトは次のように設定します。
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
        sudo sed -i '/\<VirtualHost *:80>/c\' /etc/apache2/sites-enabled/000-default.conf
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>ig-us-east1-1</h1></body></html>' | sudo tee /var/www/html/index.html
  12. 同じ設定で ig-us-east1-2 を作成します。ただし、ゾーンus-east1-b に設定し、起動スクリプトは次のように設定します。
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
        sudo sed -i '/\<VirtualHost *:80>/c\' /etc/apache2/sites-enabled/000-default.conf
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>ig-us-east1-2</h1></body></html>' | sudo tee /var/www/html/index.html

gcloud


  1. ゾーン us-central1-big-us-central1-1 を作成します。

    gcloud compute instances create ig-us-central1-1 \
        --image-family debian-8 \
        --image-project debian-cloud \
        --tags tcp-lb \
        --zone us-central1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
          sudo sed -i '/\<VirtualHost *:80>/c\' /etc/apache2/sites-enabled/000-default.conf
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>ig-us-central1-1</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/ig-us-central1-1].
    NAME             ZONE          MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-1 us-central1-b n1-standard-1             10.240.0.8  23.251.150.133 RUNNING
    

  2. ゾーン us-central1-big-us-central1-2 を作成します。

    gcloud compute instances create ig-us-central1-2 \
        --image-family debian-8 \
        --image-project debian-cloud \
        --tags tcp-lb \
        --zone us-central1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
          sudo sed -i '/\<VirtualHost *:80>/c\' /etc/apache2/sites-enabled/000-default.conf
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>ig-us-central1-2</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/ig-us-central1-2].
    NAME             ZONE          MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-2 us-central1-b n1-standard-1             10.240.0.11 23.251.148.160 RUNNING
    

  3. ゾーン us-east1-big-us-east1-1 を作成します。

    gcloud compute instances create ig-us-east1-1 \
        --image-family debian-8 \
        --image-project debian-cloud \
        --tags tcp-lb \
        --zone us-east1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
          sudo sed -i '/\<VirtualHost *:80>/c\' /etc/apache2/sites-enabled/000-default.conf
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>ig-us-east1-1</h1></body></html>' | tee /var/www/html/index.html
              EOF"
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instances/ig-us-east1-1].
    NAME          ZONE       MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-east1-1 us-east1-b n1-standard-1             10.240.0.12 104.196.31.214 RUNNING
    

  4. ゾーン us-east1-big-us-east1-2 を作成します。

    gcloud compute instances create ig-us-east1-2 \
        --image-family debian-8 \
        --image-project debian-cloud \
        --tags tcp-lb \
        --zone us-east1-b \
        --metadata startup-script="#! /bin/bash
          sudo apt-get update
          sudo apt-get install apache2 -y
          sudo sed -i '/Listen 80/c\Listen 110' /etc/apache2/ports.conf
          sudo sed -i '/\<VirtualHost *:80>/c\' /etc/apache2/sites-enabled/000-default.conf
          sudo service apache2 restart
          echo '<!doctype html><html><body><h1>ig-us-east1-2</h1></body></html>' | tee /var/www/html/index.html
          EOF"
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instances/ig-us-east1-2].
    NAME          ZONE       MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-east1-2 us-east1-b n1-standard-1             10.240.0.13 104.196.25.101 RUNNING
    

各ゾーンでのインスタンス グループの作成とインスタンスの追加

Console


  1. Google Cloud Platform Console の [インスタンス グループ] ページに移動します。
    [インスタンス グループ] ページに移動
  2. [インスタンス グループを作成] をクリックします。
  3. [名前] を「us-ig1」に設定します。
  4. [ゾーン] を us-central1-b に設定します。
  5. [ポート名のマッピングを指定する] をクリックします。
  6. [ポート名] を tcp110 に設定します。
  7. [ポート番号] を 110 に設定します。
  8. [インスタンスの定義] で [既存のインスタンスを選択] をクリックします。
  9. [VM インスタンス] から ig-us-central1-1ig-us-central1-2 を選択します。
  10. その他の設定はそのまま使用します。
  11. [作成] をクリックします。
  12. 上記のステップを繰り返します(次のように設定します)。
    • 名前: us-ig2
    • ゾーン: us-east1-b
    • ポート名: tcp110
    • ポート番号: 110
    • インスタンス: ig-us-east1-1ig-us-east1-2
  13. 2 つのインスタンスにそれぞれ 2 つのインスタンス グループが作成されたことを確認してください。

gcloud


  1. us-ig1 インスタンス グループを作成します。

    gcloud compute instance-groups unmanaged create us-ig1 \
        --zone us-central1-b
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instanceGroups/us-ig1].
    NAME    LOCATION       SCOPE  NETWORK  MANAGED  INSTANCES
    us-ig1  us-central1-b  zone                     0
    

  2. インスタンス グループの名前付きポートを作成します。

    gcloud compute instance-groups set-named-ports us-ig1 \
        --named-ports tcp110:110 \
        --zone us-central1-b
    

    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].

  3. ig-us-central1-1ig-us-central1-2us-ig1 に追加します。

    gcloud compute instance-groups unmanaged add-instances us-ig1 \
        --instances ig-us-central1-1,ig-us-central1-2 \
        --zone us-central1-b
    

    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instanceGroups/us-ig1].

  4. us-ig2 インスタンス グループを作成します。

    gcloud compute instance-groups unmanaged create us-ig2 \
        --zone us-east1-b
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].
    NAME    LOCATION    SCOPE  NETWORK  MANAGED  INSTANCES
    us-ig2  us-east1-b  zone                     0
    

  5. インスタンス グループの名前付きポートを作成します。

    gcloud compute instance-groups set-named-ports us-ig2 \
        --named-ports tcp110:110 \
        --zone us-east1-b
    

    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].

  6. ig-us-east1-1ig-us-east1-2us-ig2 に追加します。

    gcloud compute instance-groups unmanaged add-instances us-ig2 \
        --instances ig-us-east1-1,ig-us-east1-2 \
        --zone us-east1-b
    

    Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-east1-b/instanceGroups/us-ig2].

これで、それぞれが 2 つのインスタンスを持つ 2 つのリージョンに 1 つのインスタンス グループができました。

ロードバランサの設定

Console


ロードバランサの作成とバックエンド サービスの設定

  1. Google Cloud Platform Console の [負荷分散] ページに移動します。
    [負荷分散] ページに移動
  2. [ロードバランサを作成] をクリックします。
  3. [TCP 負荷分散] で [設定を開始] をクリックします。
  4. [インターネット接続または内部専用] を [インターネットから自分の VM へ] に設定します。
  5. [マルチ リージョンまたはシングル リージョン] を [マルチ リージョン] に設定します。

  6. [接続終了] で [はい(TCP プロキシまたは SSL プロキシ - 推奨)] を選択します。

  7. [続行] をクリックします。
  8. [名前] を「my-tcp-lb」に設定します。
  9. [バックエンドの設定] をクリックします。
  10. バックエンド サービスの名前my-tcp-lb と表示されます。
  11. [プロトコル] を TCP に設定します。
  12. [新しいバックエンド] の下で、インスタンス グループ us-ig1 を選択します。
  13. [インスタンス グループは名前付きポートを所有済み] ダイアログで [既存のポート名を使用] をクリックします。
  14. その他の設定はそのまま使用します。
  15. [バックエンドを追加] をクリックします。
  16. インスタンス グループ us-ig2 を選択します。
  17. [ポート番号] を 110 に設定します。
  18. [ヘルスチェック] で [ヘルスチェックを作成] を選択します。
    1. ヘルスチェックの [名前] を「my-tcp-health-check」に設定します。
    2. [プロトコル] を TCP に設定します。
    3. [ポート] を 110 に設定します。
    4. 他の設定はそのままにします。
    5. [保存して次へ] をクリックします。
  19. Google Cloud Platform Console で、[バックエンドの設定] の横に緑色のチェックマークが表示されていることを確認します。表示されていない場合には、上のすべてのステップが完了していることを再度確認してください。

フロントエンド サービスの設定

  1. [フロントエンドの設定] をクリックします。
  2. [名前] に「my-tcp-lb-forwarding-rule」と入力します。
  3. [プロトコル] を TCP に設定します。
  4. [IP] の下で、[IP アドレスの作成] を選択します。
    1. [名前] に「tcp-lb-static-ip」と入力します。
    2. [予約] をクリックします。
  5. [ポート] を 110 に設定します。
  6. 必要に応じてプロキシ プロトコルをオンにします。
  7. [完了] をクリックします。
  8. [フロントエンド IP とポートの追加] をクリックします。
  9. [名前] に「my-tcp-lb-ipv6-forwarding-rule」と入力します。
  10. プロトコルとして TCP を選択します。
  11. [IP バージョン] を IPv6 に設定します。
  12. [IP アドレス] で、[IP アドレスを作成] をクリックします。
    1. 名前に「tcp-lb-ipv6-static-ip」を入力します。
    2. [予約] をクリックします。
  13. [ポート] を 110 に設定します。
  14. 必要に応じてプロキシ プロトコルをオンにします。
  15. [完了] をクリックします。
  16. Google Cloud Platform Console で、[フロントエンドの設定] の横に緑色のチェックマークが表示されていることを確認します。表示されていない場合には、上のすべてのステップが完了していることを再度確認してください。

確認と完了

  1. [確認と完了] をクリックします。
  2. 設定を再度確認します。
  3. [作成] をクリックします。

gcloud


ヘルスチェックの作成

gcloud compute health-checks create tcp my-tcp-health-check --port 110

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/healthChecks/my-tcp-health-check].
NAME                PROTOCOL
my-tcp-health-check TCP

バックエンド サービスの作成

gcloud compute backend-services create my-tcp-lb \
    --global \
    --protocol TCP \
    --health-checks my-tcp-health-check \
    --timeout 5m \
    --port-name tcp110

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-tcp-lb].
NAME      BACKENDS PROTOCOL
my-tcp-lb          TCP

あるいは、--protocol SSL を使用して、ロードバランサからインスタンスへの暗号化された通信を設定することもできます。

バックエンド サービスへのインスタンス グループの追加

gcloud compute backend-services add-backend my-tcp-lb \
    --global \
    --instance-group us-ig1 \
    --instance-group-zone us-central1-b \
    --balancing-mode UTILIZATION \
    --max-utilization 0.8

Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-tcp-lb].

gcloud compute backend-services add-backend my-tcp-lb \
    --global \
    --instance-group us-ig2 \
    --instance-group-zone us-east1-b \
    --balancing-mode UTILIZATION \
    --max-utilization 0.8

Updated [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/backendServices/my-tcp-lb].

ターゲット TCP プロキシの設定

プロキシ ヘッダーをオンにする場合は、PROXY_V1 ではなく none に設定します。

gcloud compute target-tcp-proxies create my-tcp-lb-target-proxy \
    --backend-service my-tcp-lb \
    --proxy-header NONE

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/targetTcpProxies/my-tcp-lb-target-proxy].
NAME                   PROXY_HEADER SERVICE
my-tcp-lb-target-proxy NONE         my-tcp-lb

グローバル静的 IPv4 アドレスと IPv6 アドレスの予約

ユーザーは、これらの IP アドレスを使用して負荷分散サービスにアクセスできます。

gcloud compute addresses create tcp-lb-static-ipv4 \
    --ip-version=IPV4 \
    --global

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses/tcp-lb-static-ipv4].
NAME                 REGION ADDRESS                 STATUS
tcp-lb-static-ip            [LB_STATIC_IPV4]        RESERVED

gcloud compute addresses create tcp-lb-static-ipv6 \
    --ip-version=IPV6 \
    --global

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/addresses/tcp-lb-static-ipv6].
NAME                   REGION ADDRESS                 STATUS
tcp-lb-static-ip-ipv6         [LB_STATIC_IPV6]        RESERVED

2 つのアドレスに対するグローバル転送ルールの設定

[LB_STATIC_IPV4] と [LB_STATIC_IPV4] の代わりに、関連する IP アドレスを入力します。該当するアドレスを見つけるには、gcloud compute addresses list を使用します。

gcloud beta compute forwarding-rules create my-tcp-lb-ipv4-forwarding-rule \
    --global \
    --target-tcp-proxy my-tcp-lb-target-proxy \
    --address [LB_STATIC_IPV4] \
    --ports 110

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-tcp-lb-ipv4-forwarding-rule].
NAME                           REGION IP_ADDRESS       IP_PROTOCOL TARGET
my-tcp-lb-ipv4-forwarding-rule        [LB_STATIC_IPV4] TCP         my-tcp-lb-target-proxy

gcloud beta compute forwarding-rules create my-tcp-lb-ipv6-forwarding-rule \
    --global \
    --target-tcp-proxy my-tcp-lb-target-proxy \
    --address [LB_STATIC_IPV6] \
    --ports 110

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/forwardingRules/my-tcp-lb-ipv6-forwarding-rule].
NAME                           REGION IP_ADDRESS       IP_PROTOCOL TARGET
my-tcp-lb-ipv6-forwarding-rule        [LB_STATIC_IPV6] TCP         my-tcp-lb-target-proxy

TCP ロードバランサのファイアウォール ルールの作成

ロードバランサとヘルス チェッカーからインスタンスへのトラフィックを許可するファイアウォール ルールを設定します。ここでは、TCP ポート 110 を開きます。ヘルスチェックでも同じポートが使用されます。ロードバランサとインスタンスの間のトラフィックでは IPv4 が使用されるため、IPv4 範囲のみ開く必要があります。

Console


  1. Google Cloud Platform Console で [ファイアウォール ルール] ページに移動します。
    [ファイアウォール ルール] ページに移動
  2. [ファイアウォール ルールの作成] をクリックします。
  3. [名前] に「allow-tcp-lb-and-health」と入力します。
  4. [VPC ネットワーク] に default を選択します。
  5. [ソースフィルタ] に IP ranges を設定します。
  6. [ソース IP 範囲] を 130.211.0.0/2235.191.0.0/16 に設定します。
  7. [許可対象プロトコルとポート] に tcp:110 を設定します。
  8. [ターゲットタグ] に tcp-lb を設定します。
  9. [作成] をクリックします。

gcloud


 gcloud compute firewall-rules create allow-tcplb-and-health \
     --source-ranges 130.211.0.0/22,35.191.0.0/16 \
     --target-tags tcp-lb \
     --allow tcp:110

Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-tcp110-130-211-0-0-22].
NAME                     NETWORK SRC_RANGES                   RULES      SRC_TAGS TARGET_TAGS
allow-tcplb-and-health   default 130.211.0.0/22,35.191.0.0/16 tcp:110             tcp-lb

ロードバランサのテスト

ポート 110 は多くのブラウザでブロックされているため、curl などを使用して、ロードバランサが稼働していることを確認する必要があります。

  1. [アドレス] フィールドの IPv4 アドレスまたは IPv6 アドレスを curl コマンドに入力します。[IP_ADDRESS] は、作成した IPv4 または IPv6 アドレスに置き換えます。

    curl [IP_ADDRESS]:110

クライアント接続情報を保持するための PROXY プロトコル

TCP プロキシ負荷分散では、クライアントからの TCP 接続が停止され、インスタンスへの新しい接続が作成されるため、デフォルトで元のクライアント IP とポート情報が保持されません。

この情報を保持し、インスタンスに送信する必要がある場合、PROXY プロトコル(バージョン 1)を有効にする必要があります。この場合、ソース IP アドレス、宛先 IP アドレス、およびポート番号などの元の接続情報を含むヘッダーがさらに追加され、リクエストの一部としてインスタンスに送信されます。

ユーザー トラフィックにこのパラメータを設定する場合、同じポートでトラフィックを処理し、ヘルスチェックを行うときは、ヘルスチェックに対しても設定する必要があります。

一般に、PROXY プロトコル ヘッダーはユーザーが読み取れる単一の行であり、次のような形式になります。

PROXY TCP4 <client IP> <load balancing IP> <source port> <dest port>\r\n

PROXY プロトコルの例を以下に示します。

PROXY TCP4 192.0.2.1 198.51.100.1 15221 110\r\n

この例の場合、クライアント IP は 192.0.2.1、負荷分散 IP は 198.51.100.1、クライアント ポートは 15221、宛先ポートは 110 です。

クライアント IP が不明な場合、ロードバランサは次の形式で PROXY プロトコル ヘッダーを生成します。

PROXY UNKNOWN\r\n

正常性をチェックし、同じポートでコンテンツを提供している場合、ロードバランサの設定と一致するようにヘルスチェックの --proxy-header を設定できます。別のポートを使用している場合、必要に応じて、これをヘルスチェック用に設定しても、しなくてもかまいません。

ヘルスチェック

ヘルスチェックでは、どのインスタンスが新しい接続を受け取れるかが判別されます。 インスタンスの正常性を判別するために、TCP、SSL、HTTP、HTTP ヘルスチェックを設定できます。

  • バックエンド インスタンスで実行されているサービスが HTTP に基づく場合は、HTTP ヘルスチェックを使用します
  • バックエンド インスタンスで実行されているサービスが HTTPS に基づく場合は、HTTPS ヘルスチェックを使用します
  • バックエンド インスタンスで実行されているサービスが SSL を使用している場合は、SSL ヘルスチェックを使用します
  • 別の種類のヘルスチェックを使用する明白な理由がない限り、TCP ヘルスチェックを使用します

ヘルスチェックのファイアウォール ルール

負荷分散されたインスタンスのヘルスチェック プローブは、範囲 130.211.0.0/2235.191.0.0/16 のアドレスから受信します。ファイアウォール ルールで、関連ポートでのこれらの接続を許可する必要があります。

手順については、TCP ロードバランサのファイアウォール ルールの作成をご覧ください。

ヘルスチェックの詳細については、ヘルスチェックのページをご覧ください。

接続ドレイン

バックエンド サービスで接続ドレインを有効にすると、トラフィックを処理しているインスタンスが停止されたり、手動で削除されたり、自動スケーラ-によって削除されたりした場合に、ユーザーに対する中断を最小限に抑えることができます。接続ドレインの詳細については、接続ドレインの有効化のドキュメントをご覧ください。

TCP プロキシ負荷分散と GCP ファイアウォール

ネットワーク負荷分散とは異なり、TCP プロキシ負荷分散へのアクセスはファイアウォール ルールで制御できません。これは、TCP プロキシ負荷分散が Google Cloud のエッジで実装されるのに対し、GCP ファイアウォール ルールはデータセンター内のインスタンス上に実装されているためです。

トラブルシューティング

ロードバランサの IP からページをロードできない

多くのブラウザでポート 110 は制限されたポートであるため、curl などのツールを使用してロードバランサをテストする必要があります。curl を介してページに到達できない場合、このセクションの残りの部分でトラブルシューティングの手順を確認してください。

インスタンスの正常性の確認

インスタンスが HEALTHY であることを確認します。

gcloud compute backend-services get-health [BACKEND-SERVICE]

ファイアウォール ルールが正しいことの確認

  • ヘルス チェッカーとロードバランサの両方で 130.211.0.0/2235.191.0.0/16 が開いている必要があります。
  • インスタンス タグを使用している場合、ファイアウォール ルールでそのタグが TARGET_TAGS としてリストにあることを確認し、すべてのインスタンスにそのタグがあることを確認します。この例では、インスタンスには tcp-lb のタグが付けられています。
gcloud compute firewall-rules list
NAME                      NETWORK SRC_RANGES                    RULES          SRC_TAGS TARGET_TAGS
allow-tcplb-and-health    default 130.211.0.0/22,35.191.0.0/16  tcp:110                 tcp-lb

各インスタンスに到達可能なことの確認

インスタンスに個別にアクセスできるファイアウォール ルールを一時的に設定し、特定のインスタンスからページをロードできるか試してみます。

  1. ファイアウォールを開いて、ソースからタグ付けされたインスタンスへのトラフィックを許可します。

    gcloud compute firewall-rules create allow-tcp110-0-0-0-0   \
        --source-ranges 0.0.0.0/0   \
        --target-tags tcp-lb    \
        --allow tcp:110
    

    Created [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-tcp110-0-0-0-0].
    NAME                 NETWORK SRC_RANGES RULES   SRC_TAGS TARGET_TAGS
    allow-tcp110-0-0-0-0 default 0.0.0.0/0  tcp:110          tcp-lb
    

  2. いずれかのインスタンスの EXTERNAL_IP アドレスを見つけます。

    
    
    

    NAME             ZONE           MACHINE_TYPE  PREEMPTIBLE INTERNAL_IP EXTERNAL_IP    STATUS
    ig-us-central1-1 us-central1-b  n1-standard-1             10.240.0.8  EXTERNAL_IP RUNNING
    ig-us-central1-2 us-central1-b  n1-standard-1             10.240.0.11 EXTERNAL_IP RUNNING
    ig-us-east1-1    us-east1-b     n1-standard-1             10.240.0.12 EXTERNAL_IP RUNNING
    ig-us-east1-2    us-east1-b     n1-standard-1             10.240.0.13 EXTERNAL_IP RUNNING

  3. 次に、ブラウザから直接 1 つ以上のインスタンスにアクセスします。

    
    
    
  4. この方法でインスタンスにアクセスできない場合、ソフトウェアが正しく実行されているか確認します。インスタンスに個別にアクセスできる場合には、ロードバランサのファイアウォール ルールが正しいかどうか確認します。

    
    
    

    allowed:
    - IPProtocol: tcp
      ports:
      - '110'
    creationTimestamp: '2017-03-16T15:21:34.119-07:00'
    description: ''
    id: '8144207668574597377'
    kind: compute#firewall
    name: allow-tcp-lb-and-health
    network: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default
    selfLink: https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-tcp-lb-and-health
    sourceRanges:
    - 130.211.0.0/110
    - 35.191.0.0/16
    targetTags:
    - tcp-lb

  5. インスタンスが機能していることを確認したら、「from anywhere」ファイアウォールを削除します。

    
    
    

    The following firewalls will be deleted:
     - [allow-tcp110-0-0-0-0]

    Do you want to continue (Y/n)? y

    Deleted [https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/firewalls/allow-tcp110-0-0-0-0].

フィードバックを送信...

Compute Engine ドキュメント