Compute Engine VM の内部 HTTP(S) 負荷分散の設定

このドキュメントでは、Compute Engine VM で実行するサービス用の内部 HTTP(S) 負荷分散を構成する手順を説明します。

始める前に

このガイドの手順を行う前に、次のドキュメントをご確認ください。

VM ベースのサービスを使用した内部 HTTP(S) 負荷分散の構成

このセクションでは、Compute Engine VM 上で実行されるサービスに必要な構成について説明します。クライアント VM は、転送ルールで構成した IP アドレスとポートに接続されます。クライアント アプリケーションがこの IP アドレスとポートにトラフィックを送信すると、内部 HTTP(S) ロードバランサの URL マップに従ってバックエンド仮想マシンにリクエストが転送されます。

この例では、エフェメラル内部 IP アドレスの割り当てを許可せずに、内部 HTTP(S) ロードバランサの転送ルールに予約済み内部 IP アドレスを明示的に設定しています。転送ルールの IP アドレスは予約しておくことをおすすめします。

転送ルールの IP アドレスには、backend-subnet を使用します。プロキシ専用サブネットを使用すると、転送ルールの作成に失敗します。

マネージド インスタンス グループを作成する

このセクションでは、テンプレートとマネージド インスタンス グループの作成方法を説明します。このマネージド インスタンス グループに VM インスタンスを作成し、内部 HTTP(S) ロードバランサのバックエンド サーバーを実行します。クライアントからのトラフィックは、これらのバックエンド サーバーに負荷分散されます。わかりやすく説明するために、バックエンド サーバーはそれぞれ独自のホスト名を提供します。

Console

  1. Cloud Console の [インスタンス グループ] ページに移動します。

    [インスタンス グループ] ページに移動

  2. [インスタンス グループを作成] をクリックします。
  3. 左側の [新しいマネージド インスタンス グループ] を選択します。
  4. [名前] に「l7-ilb-backend-example」と入力します。
  5. [ロケーション] で [シングルゾーン] を選択します。
  6. [リージョン] で us-west1 を選択します。
  7. [ゾーン] で us-west1-a を選択します。
  8. [インスタンス テンプレート] で [新しいインスタンス テンプレートを作成] を選択します。

    1. [名前] に「l7-ilb-backend-template」と入力します。
    2. [ブートディスク] が Debian GNU/Linux 9 (stretch) などの Debian イメージに設定されていることを確認します。これらの手順では、apt-get などの Debian でのみ使用できるコマンドを使用します。
    3. [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] の [管理] タブで、次のスクリプトを [起動スクリプト] フィールドに挿入します。

          #! /bin/bash
          apt-get update
          apt-get install apache2 -y
          a2ensite default-ssl
          a2enmod ssl
          vm_hostname="$(curl -H "Metadata-Flavor:Google" \
          http://169.254.169.254/computeMetadata/v1/instance/name)"
          echo "Page served from: $vm_hostname" | \
          tee /var/www/html/index.html
          systemctl restart apache2'
          
    4. [ネットワーク] で、[ネットワーク] に lb-network を選択し、[サブネット] に backend-subnet を選択します。

    5. ネットワーク タグ allow-sshload-balanced-backend を追加します。

    6. [保存して次へ] をクリックします。

  9. グループ内に作成するインスタンスの数を指定します。

    この例では、[自動スケーリング モード] から次の項目を選択できます。

    • 自動スケーリングを構成しない
    • [インスタンス数] に 2 を入力します。

    オプションとして、UI の [自動スケーリング] セクションで、インスタンスの CPU 使用率に基づいてインスタンスを自動的に追加または削除するように構成できます。

  10. [作成] をクリックして、新しいインスタンス グループを作成します。

gcloud

このガイドの gcloud の手順は、Cloud Shell または bash がインストールされた別の環境を使用していることを前提としています。

  1. gcloud compute instance-templates create コマンドを使用し、HTTP サーバーを指定して VM インスタンス テンプレートを作成します。

        gcloud compute instance-templates create l7-ilb-backend-template \
        --region=us-west1 \
        --network=lb-network \
        --subnet=backend-subnet \
        --tags=allow-ssh,load-balanced-backend \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --metadata=startup-script='#! /bin/bash
        apt-get update
        apt-get install apache2 -y
        a2ensite default-ssl
        a2enmod ssl
        vm_hostname="$(curl -H "Metadata-Flavor:Google" \
        http://169.254.169.254/computeMetadata/v1/instance/name)"
        echo "Page served from: $vm_hostname" | \
        tee /var/www/html/index.html
        systemctl restart apache2'
        
  2. gcloud compute instance-groups managed create コマンドを使用して、ゾーンにマネージド インスタンス グループを作成します。

        gcloud compute instance-groups managed create l7-ilb-backend-example \
            --zone=us-west1-a \
            --size=2 \
            --template=l7-ilb-backend-template
        

api

instanceTemplates.insert メソッドでインスタンス テンプレートを作成します。[project-id] は実際のプロジェクト ID で置き換えます。

POST https://www.googleapis.com/compute/v1/projects/[project-id]/global/instanceTemplates
    {
      "name":"l7-ilb-backend-template",
      "properties":{
         "machineType":"n1-standard-1",
         "tags":{
            "items":[
               "allow-ssh",
               "load-balanced-backend"
            ]
         },
         "metadata":{
            "kind":"compute#metadata",
            "items":[
              {
                  "key":"startup-script",
                  "value":"#! /bin/bash\napt-get update\napt-get install apache2 -y\na2ensite default-ssl\na2enmod ssl\nvm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\necho \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nsystemctl restart apache2"
              }
            ]
         },
         "networkInterfaces":[
           {
               "network":"projects/[project-id]/global/networks/lb-network",
               "subnetwork":"regions/us-west1/subnetworks/backend-subnet",
               "accessConfigs":[
                 {
                     "type":"ONE_TO_ONE_NAT"
                 }
               ]
           }
         ],
         "disks":[
           {
               "index":0,
               "boot":true,
               "initializeParams":{
                  "sourceImage":"projects/debian-cloud/global/images/family/debian-9"
               },
               "autoDelete":true
           }
         ]
      }
    }
    

instanceGroupManagers.insert メソッドを使用して、各ゾーンにマネージド インスタンス グループを作成します。[project-id] は実際のプロジェクト ID に置き換えます。

POST https://www.googleapis.com/compute/v1/projects/[project-id]/zones/{zone}/instanceGroupManagers
    {
      "name": "l7-ilb-backend-example",
      "zone": "projects/[project-id]/zones/us-west1-a",
      "instanceTemplate": "projects/[project-id]/global/instanceTemplates/l7-ilb-backend-template",
      "baseInstanceName": "l7-ilb-backend-example",
      "targetSize": 2
    }
    

ロードバランサを構成する

この例では、次の内部 HTTP(S) ロードバランサのリソースを作成する方法について説明します。

  • HTTP ヘルスチェック
  • マネージド インスタンス グループをバックエンドとして使用するバックエンド サービス
  • URL マップ
    • リージョンがターゲット HTTP(S) プロキシに定義されている場合は、必ずリージョン URL マップを参照してください。リージョン URL マップは、受信 URL のホストとパスに定義したルールに基づいて、リクエストをリージョン バックエンド サービスにルーティングします。リージョン URL マップを参照できるのは、同じリージョン内のリージョン ターゲット プロキシのルールのみです。
  • SSL 証明書(HTTPS の場合)
  • ターゲット プロキシ
  • 転送ルール

転送ルールの IP アドレスには、backend-subnet を使用します。プロキシ専用サブネットを使用すると、転送ルールの作成に失敗します。

Console

ロードバランサ タイプの選択

  1. Google Cloud Console で [負荷分散] ページに移動します。
    [負荷分散] ページに移動
  2. [HTTP(S) 負荷分散] で [構成を開始] をクリックします。
  3. [VM 間のみ] を選択します。この設定は、ロードバランサが内部であることを意味します。
  4. [続行] をクリックします。

ロードバランサの準備

  1. ロードバランサの [名前] に「l7-ilb-map」と入力します。
  2. [リージョン] で us-west1 を選択します。
  3. [ネットワーク] で lb-network を選択します。
  4. ウィンドウを開いたままにして続行します。

プロキシ専用サブネットの予約

内部 HTTP(S) 負荷分散の場合は、プロキシ専用サブネットを予約します。

  1. [サブネットの予約] をクリックします。
  2. [名前] に「proxy-only-subnet」と入力します。
  3. [IP アドレス範囲] に「10.129.0.0/23」と入力します。
  4. [追加] をクリックします。

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

  1. [バックエンドの構成] をクリックします。
  2. [バックエンド サービスの作成または選択] メニューから [バックエンド サービスを作成] を選択します。
  3. バックエンド サービスの [名前] を l7-ilb-backend-service に設定します。
  4. [バックエンド タイプ] を [インスタンス グループ] に設定したままにします。
  5. [新しいバックエンド] セクションで、次の操作を行います。
    1. [インスタンス グループ] を l7-ilb-backend-example に設定します。
    2. [ポート番号] を 80 に設定します。
    3. [分散モード] を Utilization に設定します。
    4. [完了] をクリックします。
  6. [ヘルスチェック] セクションで、[ヘルスチェックを作成] を選択し、次のパラメータを選択します。
    1. 名前: l7-ilb-basic-check
    2. プロトコル: HTTP
    3. ポート: 80
    4. [保存して次へ] をクリックします。
  7. [作成] をクリックします。

URL マップの構成

[ホストとパスのルール] をクリックします。l7-ilb-backend-service が、ホストまたはパスが一致しない場合に使用される唯一のバックエンド サービスであることを確認します。

トラフィック管理の詳細については、トラフィック管理の設定をご覧ください。

フロントエンドを構成する

HTTP の場合:

  1. [フロントエンドの構成] をクリックします。
  2. [フロントエンド IP とポートの追加] をクリックします。
  3. [名前] を l7-ilb-forwarding-rule に設定します。
  4. [プロトコル] を HTTP に設定します。
  5. [サブネットワーク] を backend-subnet に設定します。
  6. [内部 IP] で [静的内部 IP アドレスの予約] を選択します。
  7. 表示されるパネルで、次の情報を入力します。
    1. 名前: l7-ilb-ip
    2. [静的 IP アドレス] セクションで、[ユーザー選択] を選択します。
    3. [カスタム IP アドレス] セクションに「10.1.2.99」と入力します。
    4. [予約] をクリックします。
  8. [ポート] を 80 に設定します。
  9. [完了] をクリックします。

HTTPS の場合:

クライアントとロードバランサ間で HTTPS を使用する場合は、プロキシを構成するために 1 つ以上の SSL 証明書リソースが必要になります。SSL 証明書リソースの作成方法については、SSL 証明書をご覧ください。現在、内部 HTTP(S) ロードバランサでは Google マネージド証明書がサポートされません。

  1. [フロントエンドの構成] をクリックします。
  2. [フロントエンド IP とポートの追加] をクリックします。
  3. [名前] フィールドに「l7-ilb-forwarding-rule」と入力します。
  4. [プロトコル] フィールドで HTTPS (includes HTTP/2) を選択します。
  5. [サブネットワーク] を backend-subnet に設定します。
  6. [内部 IP] で [静的内部 IP アドレスの予約] を選択します。
  7. 表示されるパネルで、次の情報を入力します。
    1. 名前: l7-ilb-ip
    2. [静的 IP アドレス] セクションで、[ユーザー選択] を選択します。
    3. [カスタム IP アドレス] セクションに「10.1.2.99」と入力します。
    4. [予約] をクリックします。
  8. HTTPS トラフィックを許可するように、ポート443 に設定されていることを確認します。
  9. [証明書] プルダウン リストをクリックします。
    1. プライマリ SSL 証明書として使用しようとしているセルフマネージド SSL 証明書リソースがすでにある場合は、プルダウン メニューから選択します。
    2. そうでない場合は、[新しい証明書の作成] を選択します。
      1. [名前] に「l7-ilb-cert」を入力します。
      2. 該当するフィールドに PEM 形式のファイルをアップロードします。
        • 公開鍵証明書
        • 証明書チェーン
        • 秘密鍵
      3. [作成] をクリックします。
  10. プライマリ SSL 証明書リソースに加えて証明書リソースを追加するには、次の手順を行います。
    1. [証明書を追加] をクリックします。
    2. [証明書] リストから証明書を選択するか、[新しい証明書の作成] をクリックし、上記の手順に沿います。
  11. [完了] をクリックします。

構成の完了

[作成] をクリックします。

gcloud

  1. gcloud compute health-checks create http コマンドを使用して、HTTP ヘルスチェックを定義します。

        gcloud compute health-checks create http l7-ilb-basic-check \
           --region=us-west1 \
           --use-serving-port
        
  2. gcloud compute backend-services create コマンドを使用して、バックエンド サービスを定義します。

        gcloud compute backend-services create l7-ilb-backend-service \
          --load-balancing-scheme=INTERNAL_MANAGED \
          --protocol=HTTP \
          --health-checks=l7-ilb-basic-check \
          --health-checks-region=us-west1 \
          --region=us-west1
        
  3. gcloud compute backend-services add-backend コマンドを使用して、バックエンド サービスにバックエンドを追加します。

        gcloud compute backend-services add-backend l7-ilb-backend-service \
          --balancing-mode=UTILIZATION \
          --instance-group=l7-ilb-backend-example \
          --instance-group-zone=us-west1-a \
          --region=us-west1
        
  4. gcloud compute url-maps create コマンドを使用して、URL マップを作成します。

        gcloud compute url-maps create l7-ilb-map \
          --default-service=l7-ilb-backend-service \
          --region=us-west1
        
  5. ターゲット プロキシを作成します。

    HTTP の場合:

    内部 HTTP ロードバランサの場合、gcloud compute target-http-proxies create コマンドを使用してターゲット プロキシを作成します。

        gcloud compute target-http-proxies create l7-ilb-proxy \
          --url-map=l7-ilb-map \
          --url-map-region=us-west1 \
          --region=us-west1
        

    HTTPS の場合:

    SSL 証明書リソースの作成方法については、SSL 証明書をご覧ください。現在、内部 HTTP(S) ロードバランサでは Google マネージド証明書がサポートされません。

    ファイルパスを変数名に割り当てます。

        export LB_CERT=path to PEM-formatted file
        
        export LB_PRIVATE_KEY=path to PEM-formatted file
        

    gcloud compute ssl-certificates create コマンドを使用して、リージョン SSL 証明書を作成します。

        gcloud compute ssl-certificates create l7-ilb-cert \
          --certificate=$LB_CERT \
          --private-key=$LB_PRIVATE_KEY \
          --region=us-west1
        

    リージョン SSL 証明書を使用して、gcloud compute target-https-proxies create コマンドを実行してターゲット プロキシを作成します。

    gcloud compute target-https-proxies create

        gcloud compute target-https-proxies create l7-ilb-proxy \
          --url-map=l7-ilb-map \
          --region=us-west1 \
          --ssl-certificates=l7-ilb-cert
        
  6. 転送ルールを作成します。

    カスタム ネットワークでは、転送ルールでサブネットを参照する必要があります。このサブネットは、VM サブネットでありプロキシ専用サブネットではありません。

    HTTP の場合:

    適切なフラグを設定して、gcloud compute forwarding-rules create コマンドを実行します。

        gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
          --load-balancing-scheme=INTERNAL_MANAGED \
          --network=lb-network \
          --subnet=backend-subnet \
          --address=10.1.2.99 \
          --ports=80 \
          --region=us-west1 \
          --target-http-proxy=l7-ilb-proxy \
          --target-http-proxy-region=us-west1
        

    HTTPS の場合:

    適切なフラグを設定して gcloud compute forwarding-rules create コマンドを実行し、転送ルールを作成します。

        gcloud compute forwarding-rules create l7-ilb-forwarding-rule \
          --load-balancing-scheme=INTERNAL_MANAGED \
          --network=lb-network \
          --subnet=backend-subnet \
          --address=10.1.2.99 \
          --ports=443 \
          --region=us-west1 \
          --target-https-proxy=l7-ilb-proxy \
          --target-https-proxy-region=us-west1
        

api

POST リクエストを regionHealthChecks.insert メソッドに送信して、ヘルスチェックを作成します。[project-id] は実際のプロジェクト ID で置き換えます。

POST https://compute.googleapis.com/compute/v1/projects/[project-id]/regions/{region}/healthChecks
    {
      "name": "l7-ilb-basic-check",
      "type": "HTTP",
      "httpHealthCheck": {
        "portSpecification": "USE_SERVING_PORT"
      }
    }
    

POST リクエストを regionBackendServices.insert メソッドに送信して、リージョン バックエンド サービスを作成します。[project-id] は実際のプロジェクト ID で置き換えます。

POST https://www.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/backendServices
    {
      "name": "l7-ilb-backend-service",
      "backends": [
        {
          "group": "projects/[project-id]/zones/us-west1-a/instanceGroups/l7-ilb-backend-example",
          "balancingMode": "UTILIZATION"
        }
      ],
      "healthChecks": [
        "projects/[project-id]/regions/us-west1/healthChecks/l7-ilb-basic-check"
      ],
      "loadBalancingScheme": "INTERNAL_MANAGED"
    }
    

POST リクエストを regionUrlMaps.insert メソッドに送信して、URL マップを作成します。[project-id] は実際のプロジェクト ID で置き換えます。

POST https://compute.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/urlMaps
    {
      "name": "l7-ilb-map",
      "defaultService": "projects/[project-id]/regions/us-west1/backendServices/l7-ilb-backend-service"
    }
    

regionTargetHttpProxies.insert メソッドに POST リクエストを送り、ターゲット HTTP プロキシを作成します。[project-id] はプロジェクト ID で置き換えます。

POST https://www.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/targetHttpProxy
    {
      "name": "l7-ilb-proxy",
      "urlMap": "projects/[project-id]/global/urlMaps/l7-ilb-map",
      "region": "us-west1"
    }
    

forwardingRules.insert メソッドに POST リクエストを送り、転送ルールを作成します。[project-id] はプロジェクト ID で置き換えます。

POST https://www.googleapis.com/compute/v1/projects/[project-id]/regions/us-west1/forwardingRules
    {
      "name": "l7-ilb-forwarding-rule",
      "IPAddress": "10.1.2.99",
      "IPProtocol": "TCP",
      "portRange": "80-80",
      "target": "projects/[project-id]/regions/us-west1/targetHttpProxies/l7-ilb-proxy",
      "loadBalancingScheme": "INTERNAL_MANAGED",
      "subnetwork": "projects/[project-id]/regions/us-west1/subnetworks/backend-subnet",
      "network": "projects/[project-id]/global/networks/lb-network",
      "networkTier": "PREMIUM",
    }
    

テスト

VM インスタンスを作成して接続をテストする

    gcloud compute instances create l7-ilb-client-us-west1-a \
        --image-family=debian-9 \
        --image-project=debian-cloud \
        --network=lb-network \
        --subnet=backend-subnet \
        --zone=us-west1-a \
        --tags=allow-ssh
    

ロードバランサをテストする

作成したインスタンスにログインし、内部 HTTP(S) ロードバランサの転送ルールの IP アドレスを介してバックエンドの HTTP(S) サービスに到達可能であること、バックエンド インスタンス間でトラフィックの負荷分散が行われていることをテストします。

各クライアント インスタンスへ SSH を介して接続する

    gcloud compute ssh l7-ilb-client-us-west1-a \
        --zone=us-west1-a
    

IP がホスト名を提供していることを確認する

    curl 10.1.2.99
    

HTTPS テストの場合、curl は次のもので置き換えます。

    curl -k -s 'https://test.example.com:443' --connect-to test.example.com:443:10.1.2.99:443
    

-k フラグを指定すると、curl は証明書の検証をスキップします。

100 個のリクエストを実行し負荷分散されていることを確認する

HTTP の場合:

    {
      RESULTS=
      for i in {1..100}
      do
          RESULTS="$RESULTS:$(curl --silent 10.1.2.99)"
      done
      echo "***"
      echo "*** Results of load-balancing to 10.1.2.99: "
      echo "***"
      echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
      echo
    }
    

HTTPS の場合:

    {
      RESULTS=
      for i in {1..100}
      do
          RESULTS="$RESULTS:$(curl -k -s 'https://test.example.com:443' --connect-to test.example.com:443:10.1.2.99:443)"
      done
      echo "***"
      echo "*** Results of load-balancing to 10.1.2.99: "
      echo "***"
      echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
      echo
    }
    

次のステップ