ターゲット プールを使用して外部パススルー ネットワーク ロードバランサを設定する

このガイドでは、ターゲット プールのバックエンドを使用して外部パススルー ネットワーク ロードバランサの構成を作成する手順について説明します。この例では、トラフィックを分散する Compute Engine インスタンス上に複数のウェブサーバーがあることを想定しています。このシナリオでは、正常に動作しているインスタンスの間で HTTP トラフィックを分散させるように、レイヤ 4 ロード バランシングを構成します。また、正常なインスタンスにだけトラフィックが送信されるように、基本的な HTTP ヘルスチェックを構成します。

この例では、HTTP トラフィックのロード バランシングを行いますが、ターゲット プール ベースの外部パススルー ネットワーク ロードバランサを使用して、TCP、UDP、SSL トラフィックのロード バランシングを行うことができます。始める前に、外部パススルー ネットワーク ロードバランサの概要で、外部パススルー ネットワーク ロードバランサのコンセプトを確認してください。

始める前に

Google Cloud CLI をインストールします。ツールの完全な概要については、gcloud ツールガイドをご覧ください。負荷分散に関連するコマンドは、gcloud compute コマンド グループにあります。

--help フラグを使用して、gcloud コマンドの詳細なヘルプを入手することもできます。

gcloud compute http-health-checks create --help

これまで Google Cloud CLI を実行したことがない場合は、最初に gcloud init を実行して認証します。

また、ロードバランサの静的外部 IP アドレスも作成する必要があります。Compute Engine が提供するイメージを使用している場合、仮想マシン(VM)インスタンスはこの IP アドレスを処理するように自動的に構成されます。その他のイメージを使用する場合は、このアドレスを eth0 のエイリアスまたは各インスタンスのループバックとして構成する必要があります。

このガイドは、bash の知識があることを前提としています。

Compute Engine VM インスタンスの構成

この負荷分散のシナリオでは、3 つの Compute Engine VM インスタンスを作成し、Apache をインストールします。また、HTTP トラフィックがインスタンスに到達できるようにファイアウォール ルールを追加します。

外部パススルー ネットワーク ロードバランサのバックエンド VM として参加するインスタンスでは、適切な Linux ゲスト環境Windows ゲスト環境、または同等の機能を提供する他のプロセスが実行されている必要があります。

バックエンド インスタンスの設定

コンソール

  1. Google Cloud コンソールで [VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. [インスタンスを作成] をクリックします。

  3. [名前] を www1 に設定します。

  4. [リージョン] を us-central1 に設定します。

  5. [ゾーン] を us-central1-b に設定します。

  6. [ブートディスク] で、Debian GNU/Linux 10 (buster) のデフォルトの OS イメージが選択済みになっています。

  7. [詳細オプション] をクリックします。

  8. [ネットワーキング] をクリックして次のフィールドを構成します。

    1. [ネットワーク タグ] に「network-lb-tag」と入力します。
  9. [管理] をクリックします。[起動スクリプト] フィールドに次のスクリプトを入力します。

     #! /bin/bash
     sudo apt-get update
     sudo apt-get install apache2 -y
     sudo service apache2 restart
     echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html
     

    1. [作成] をクリックします。
  10. 同じ設定を使って www2 という名前のインスタンスを作成します。ただし、[自動化] の [起動スクリプト] フィールドには次のスクリプトを挿入します。

      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html
     

  11. 同じ設定を使って www3 という名前のインスタンスを作成します。ただし、[自動化] の [起動スクリプト] フィールドには次のスクリプトを挿入します。

        #! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html
      

gcloud

次のコマンドはすべてローカル システムで実行し、bash コマンド プロンプトを使用することを前提としています。

OS イメージ名、属性、ステータスを確認するには、gcloud compute images list コマンドを使用します。

  1. 指定したゾーンで 3 つの新しい仮想マシンを作成し、それらすべてに同じタグを設定します。この例では、ゾーンを us-central1-b に設定します。tags フィールドを設定すると、ファイアウォール ルールと同じように、これらのインスタンスを同時に参照できます。これらのコマンドにより、各インスタンスに Apache もインストールされ、インスタンスごとに固有のホームページが提供されます。

    gcloud compute instances create www1 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www2 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www3 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html"

api

instances.insert メソッドを使用して、ゾーン us-central1-b にインスタンス www1 を作成する

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances

{
  "canIpForward": false,
  "deletionProtection": false,
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "mode": "READ_WRITE",
      "autoDelete": true,
      "deviceName": "www1",
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20220719",
        "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
  "metadata": {
    "items": [
      {
        "key": "startup-script",
        "value": "sudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nsudo service apache2 restart\necho '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
      }
    ]
  },
  "name": "www1",
  "networkInterfaces": [
    {
      "network": "projects/[PROJECT_ID]/global/networks/default",
      "subnetwork": "projects/[PROJECT_ID]/regions/us-central1/subnetworks/default"
    }
  ],
  "tags": {
    "items": [
      "network-lb-tag"
    ]
  }
}

同じ設定で www2www3 というインスタンスを作成します。ただし deviceNamevaluename フィールドの www1 は置き換えます。

この VM インスタンスへの外部トラフィックを許可するファイアウォール ルールを作成する

コンソール

  1. Google Cloud コンソールで [ファイアウォール ポリシー] ページに移動します。

    [ファイアウォール ポリシー] に移動

  2. [ファイアウォール ルールを作成] をクリックします。

  3. [名前] に「www-firewall-network-lb」と入力します。

  4. ファイアウォール ルールを適用するネットワークを選択します(デフォルト)。

  5. [ターゲット] で [指定されたターゲットタグ] を選択します。

  6. [ターゲットタグ] フィールドに「network-lb-tag」と入力します。

  7. [ソースフィルタ] を [IPv4 範囲] に設定します。

  8. [送信元 IPv4 範囲] を 0.0.0.0/0 に設定します。これにより、任意の送信元からのトラフィックが許可されます。

  9. [指定したプロトコルとポート] で [TCP] チェックボックスをオンにして、「80」と入力します。

  10. [作成] をクリックします。新しいファイアウォール ルールがコンソールに表示されるまで少し時間がかかる場合があります。表示されない場合は、[更新] をクリックしてルールを表示してみてください。

gcloud

gcloud compute firewall-rules create www-firewall-network-lb \
    --target-tags network-lb-tag --allow tcp:80

api

firewalls.insert **メソッド**を使用して、サブネット内のすべてのトラフィックを許可するファイアウォール ルールを作成する

POST https://compute.googleapis.com/compute/projects/[PROJECT_ID]/global/firewalls

{
  "name": "www-firewall-network-lb",
  "direction": "INGRESS",
  "priority": 1000,
  "targetTags": [
    "network-lb-tag"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "80"
      ]
    }
  ],
  "sourceRanges": [
    "0.0.0.0/0"
  ]
}

インスタンスの外部 IP アドレスを取得し、インスタンスが実行中であることを確認する

コンソール

  1. Google Cloud コンソールで [VM インスタンス] ページに移動します。

    [VM インスタンス] に移動

  2. [外部 IP] 列で、インスタンスのアドレスを確認します。

  3. インスタンスの実行中であることを確認するには、インスタンス名の左側にある緑色のチェックマークを探します。緑色のチェックマークが表示されない場合は、インスタンスの一般的なトラブルシューティングのページをご覧ください。

gcloud

  1. 次のコマンドを実行してインスタンスを一覧表示し、EXTERNAL_IP 列から IP アドレスを取得します。

    gcloud compute instances list
    
  2. 各インスタンスが実行中であることを確認します。

    コマンドラインで、各インスタンスの外部 IP アドレスを使用して curl を実行し、すべてのインスタンスが応答することを確認します。

    curl http://[IP_ADDRESS]
    

api

instances.get メソッドを使用してインスタンス www1 に関する情報を取得する

status フィールドが RUNNING であることを確認し、natIP フィールドで外部 IP アドレスを探します。

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1

{
 "kind": "compute#instance",
 "id": "6734015273571474749",
 "creationTimestamp": "2018-11-09T11:45:23.487-08:00",
 "name": "www1",
 "description": "",
 "tags": {
  "items": [
   "network-lb-tag"
  ],
  "fingerprint": "9GVlO4gPawg="
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
 "status": "RUNNING",
 "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b",
 "canIpForward": false,
 "networkInterfaces": [
  {
   "kind": "compute#networkInterface",
   "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default",
   "subnetwork": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/subnetworks/default",
   "networkIP": "10.128.0.2",
   "name": "nic0",
   "accessConfigs": [
    {
     "kind": "compute#accessConfig",
     "type": "ONE_TO_ONE_NAT",
     "name": "External NAT",
     "natIP": "35.192.37.233",
     "networkTier": "PREMIUM"
    }
   ],
   "fingerprint": "lxD5f5ua_sw="
  }
 ],
 "disks": [
  {
   "kind": "compute#attachedDisk",
   "type": "PERSISTENT",
   "mode": "READ_WRITE",
   "source": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks/www1",
   "deviceName": "www1",
   "index": 0,
   "boot": true,
   "autoDelete": true,
   "licenses": [
    "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-10-buster"
   ],
   "interface": "SCSI",
   "guestOsFeatures": [
    {
     "type": "VIRTIO_SCSI_MULTIQUEUE"
    }
   ]
  }
 ],
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "IyHRmHoJx6E=",
  "items": [
   {
    "key": "startup-script",
    "value": "#! /bin/bash\n sudo apt-get update\n sudo apt-get install apache2 -y\n sudo service apache2 restart\n echo '\u003c!doctype html\u003e\u003chtml\u003e\u003cbody\u003e\u003ch1\u003ewww1\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e' | tee /var/www/html/index.html"
   }
  ]
 },
 "serviceAccounts": [
  {
   "email": "674259759219-compute@developer.gserviceaccount.com",
   "scopes": [
    "https://www.googleapis.com/auth/devstorage.read_only",
    "https://www.googleapis.com/auth/logging.write",
    "https://www.googleapis.com/auth/monitoring.write",
    "https://www.googleapis.com/auth/servicecontrol",
    "https://www.googleapis.com/auth/service.management.readonly",
    "https://www.googleapis.com/auth/trace.append"
   ]
  }
 ],
 "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1",
 "scheduling": {
  "onHostMaintenance": "MIGRATE",
  "automaticRestart": true,
  "preemptible": false
 },
 "cpuPlatform": "Intel Haswell",
 "labelFingerprint": "42WmSpB8rSM=",
 "startRestricted": false,
 "deletionProtection": false
}

www2www3 に、この API 呼び出しを繰り返します。

負荷分散サービスの構成

次に、負荷分散サービスを設定します。

ロード バランシング サービスを構成すると、仮想マシン インスタンスは、構成した静的外部 IP アドレス宛てのパケットを受信します。Compute Engine で提供されるイメージを使用する場合は、この IP アドレスを処理するようにインスタンスが自動的に構成されます。その他のイメージを使用する場合は、このアドレスを eth0 のエイリアスまたは各インスタンスのループバックとして構成する必要があります。

コンソール

Google Cloud コンソールでは、ターゲット プール ベースの外部パススルー ネットワーク ロードバランサを作成できません。代わりに、gcloud または REST API を使用してください。

gcloud

  1. ロードバランサに使用する静的外部 IP アドレスを作成します。

    gcloud compute addresses create network-lb-ip-1 \
        --region us-central1
    
  2. レガシー HTTP ヘルスチェック リソースを追加します。

    この例では、ヘルスチェック メカニズムのデフォルト設定を使用しますが、独自にカスタマイズすることもできます。

    gcloud compute http-health-checks create basic-check
    
  3. ターゲット プールを追加します。

    仮想マシン インスタンスと同じリージョンにターゲット プールを追加します。このターゲット プールに対して、前のステップで作成したヘルスチェックを使用します。ターゲット プールが機能するには、ヘルスチェック サービスが必要です。

    gcloud compute target-pools create www-pool \
        --region us-central1 --http-health-check basic-check
    
  4. インスタンスをターゲット プールに追加します。

    gcloud compute target-pools add-instances www-pool \
        --instances www1,www2,www3 \
        --instances-zone us-central1-b
    

    ターゲット プール内のインスタンスは同じリージョンに属している必要がありますが、同じリージョン内の異なるゾーンにまたがっていてもかまいません。たとえば、ゾーン us-central1-f のインスタンスとゾーン us-central1-b のインスタンスは同じリージョン us-central1 にあるため、同じターゲット プール内に含めることができます。

  5. 転送ルールを追加します。

    ターゲット IP アドレスとポート範囲の代わりに機能する転送ルールを追加します。--address フィールドには数値 IP アドレスまたは完全修飾名を使用します。

    gcloud compute forwarding-rules create www-rule \
        --region us-central1 \
        --ports 80 \
        --address network-lb-ip-1 \
        --target-pool www-pool
    

api

  1. ロードバランサに使用する静的外部 IP アドレスを作成します。

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses
    {
      "name": "network-lb-ip-1"
    }
    
  2. レガシー HTTP ヘルスチェックを追加します。

    この例では、ヘルスチェック メカニズムのデフォルト設定を使用しますが、独自にカスタマイズすることもできます。

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks
    {
      "name": "basic-check"
    }
    
  3. ターゲット プールを追加します。

    仮想マシン インスタンスと同じリージョンにターゲット プールを追加します。このターゲット プールに対して、前のステップで作成したヘルスチェックを使用します。ターゲット プールが機能するには、ヘルスチェック サービスが必要です。

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools
    {
      "name": "www-pool",
      "healthChecks": [
        "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks/basic-check"
      ]
    }
    
  4. インスタンスをターゲット プールに追加します。

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-pool/addInstance
    {
      "instances": [
        {
          "instance": "projects/[PROJECT_ID]/zones/us-central1-b/instances/www1"
        }
      ]
    }
    

    インスタンス www2www3 に、この API 呼び出しを繰り返します。

    ターゲット プール内のインスタンスは同じリージョンに属している必要がありますが、同じリージョン内の異なるゾーンにまたがっていてもかまいません。たとえば、ゾーン us-central1-f のインスタンスとゾーン us-central1-b のインスタンスは同じリージョン us-central1 にあるため、同じターゲット プール内に含めることができます。

  5. 転送ルールを追加します。

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules
    {
      "name": "www-rule",
      "portRange": "80",
      "loadBalancingScheme": "EXTERNAL",
      "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb"
    }
    

インスタンスへのトラフィックの送信

負荷分散サービスの構成が完了したので、転送ルールへのトラフィックの送信を開始できます。また、別のインスタンスに分散されるトラフィックをモニタリングできます。

転送ルールの外部 IP アドレスを検索する

コンソール

  1. Google Cloud コンソールのロード バランシングの [詳細] ページにある [転送ルール] タブに移動します。
    [転送ルール] タブに移動
  2. ロードバランサが使用する転送ルール www-rule を探します。
  3. www-rule の [IP アドレス] 列に表示された外部 IP アドレスをメモします。

gcloud

次のコマンドを入力して、ロードバランサが使用する www-rule 転送ルールの外部 IP アドレスを表示します。

gcloud compute forwarding-rules describe www-rule --region us-central1

api

forwardingRules.get メソッドを使用して www-rule 転送ルールの外部 IP アドレスを表示する

出力で IPAddress フィールドを探します。

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule
{
  "kind": "compute#forwardingRule",
  "id": "5133886346582800002",
  "creationTimestamp": "2018-11-09T14:21:33.574-08:00",
  "name": "www-rule",
  "description": "",
  "region": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1",
  "IPAddress": "35.232.228.9",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule",
  "loadBalancingScheme": "EXTERNAL",
  "networkTier": "PREMIUM"
}

ICMP はバックエンド インスタンスのサポート対象外

外部パススルー ネットワーク ロードバランサは、バックエンド インスタンスに ICMP パケットを提供しません。pingtraceroute などを使用して ICMP パケットを送信しても、ロードバランサのバックエンド インスタンスから返信はありません。

ロードバランサのバックエンド インスタンスで ICMP トラフィックを禁止するファイアウォール ルールがある場合でも、Google Cloud インフラストラクチャが ICMP レスポンスを送信する場合があります。この動作は変更できません。

curl コマンドを使用して外部 IP アドレスにアクセスする

curl コマンドからのレスポンスは、3 つのインスタンスの間でランダムに変わります。最初のレスポンスで失敗した場合は、構成が完全に読み込まれてインスタンスが正常であるとマークされるまで最大 30 秒待ってから、もう一度やり直してください。

$ while true; do curl -m1 IP_ADDRESS; done

次のステップ