ネットワーク負荷分散の設定

このガイドでは、基本的なネットワーク負荷分散の構成を作成する手順を説明します。この例では、トラフィックの負荷分散を行う複数のウェブサーバーが Google Compute Engine インスタンスにあることを前提としています。このシナリオでは、正常に動作しているインスタンスの間で HTTP トラフィックを分散させるように、レイヤ 3 負荷分散を設定します。また、正常なインスタンスにだけトラフィックが送信されるように、基本的な HTTP ヘルスチェックを構成します。

この例では、HTTP トラフィックの負荷分散を行っていますが、ネットワーク負荷分散を使用して UDP、TCP、SSL のトラフィックの負荷分散も行うことができます。始める前に、ネットワーク負荷分散のコンセプトをご覧ください。

始める前に

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

すべての gcloud コマンドでは、--help フラグを使用して詳細なヘルプを表示できます。

gcloud compute http-health-checks create --help

gcloud コマンドライン ツールをまだ一度も実行したことがない場合は、まず gcloud init を実行して認証を行います。

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

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

Compute Engine インスタンスの構成

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

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

インスタンスの設定

Console

  1. Google Cloud Platform Console の [VM インスタンス] ページに移動します。
    [VM インスタンス] ページに移動
  2. [インスタンスを作成] をクリックします。
  3. [名前] を www1 に設定します。
  4. [リージョン] を us-central1 に設定します。
  5. [ゾーン] を us-central1-b に設定します。
  6. [ブートディスク] で、Debian GNU/Linux 9 (stretch) のデフォルトの OS イメージが選択されています。
  7. [管理、セキュリティ、ディスク、ネットワーク、単一テナンシー] をクリックして、詳細設定を表示します。
    1. [管理] タブで、[自動化] の [起動スクリプト] フィールドに次のスクリプトを挿入します。
      #! /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
      EOF
    2. [ネットワーク] の [タグ] フィールドに network-lb-tag が挿入されます。
    3. 残りのフィールドはデフォルト値のままにします。
    4. [作成] をクリックします。
  8. 同じ設定を使って 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
    EOF
  9. 同じ設定を使って 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
    EOF

gcloud

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

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

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

    gcloud compute instances create www1 \
      --image-family debian-9 \
      --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
        EOF"
    gcloud compute instances create www2 \
      --image-family debian-9 \
      --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
        EOF"
    gcloud compute instances create www3 \
      --image-family debian-9 \
      --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
        EOF"

api

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

POST https://www.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/eip-images/global/images/debian-9-drawfork-v20181101",
        "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/n1-standard-1",
  "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 インスタンスへの外部トラフィックを許可するファイアウォール ルールの作成

Console

  1. Google Cloud Platform Console の [ファイアウォール] ページに移動します。
    [ファイアウォール] ページに移動
  2. [ファイアウォール ルールを作成] をクリックします。
  3. [名前] に www-firewall-network-lb と入力します。
  4. ファイアウォール ルールを適用するネットワークを選択します(デフォルト)。
  5. [ターゲット] で [指定されたターゲットタグ] を選択します。
  6. [ターゲットタグ] フィールドに network-lb-tag と入力します。
  7. [ソース IP の範囲] を 0.0.0.0/0 に設定します。これにより、任意の送信元からのトラフィックが許可されます。
  8. [指定したプロトコルとポート] で、[TCP] の隣にあるチェックボックスをクリックして 80 と入力します。
  9. [作成] をクリックします。新しいファイアウォール ルールがコンソールに表示されるまで少し時間がかかる場合があります。表示されない場合は、[更新] をクリックしてルールを表示してみてください。

gcloud

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

api

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

POST https://www.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 アドレスを取得してインスタンスが実行されていることを確認する

Console

  1. Google Cloud Platform Console の [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://www.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/n1-standard-1",
 "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-9-stretch"
   ],
   "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\n EOF"
   }
  ]
 },
 "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 のエイリアスまたは各インスタンスのループバックとして設定する必要があります。

Console

  1. Google Cloud Platform Console で、[ロードバランサの作成] ページに移動します。
    [ロードバランサの作成] ページに移動
  2. [TCP 負荷分散] で [設定を開始] をクリックします。

  3. [インターネット接続または内部専用] で [From Internet to my VMs] を選択します。

  4. [マルチリージョンまたはシングル リージョン] で [Single region only] を選択します。

  5. [続行] ボタンをクリックします。

バックエンドを構成する

  1. [新しい TCP ロードバランサ] 画面で、新しいロードバランサの [名前] に www-network-lb と入力します。
  2. [バックエンドの設定] をクリックします。
  3. 前に入力したロードバランサの名前が表示されますが、変更できません。
  4. [リージョン] で [us-central1] を選択します。
  5. [バックエンド] で、[既存のインスタンスを選択] タブをクリックして、[インスタンスを追加] をクリックします。インスタンスとして www1 と入力します。インスタンス www2www3 に同じ手順を繰り返します。
  6. [ヘルスチェック] で、[ヘルスチェックを作成] または [別のヘルスチェックを作成] を選択します。

    1. ヘルスチェックの [名前] に basic-check と入力します。
    2. デフォルト設定のままにします。
    3. [保存して次へ] ボタンをクリックします。

    [バックエンド設定] の左側にある青い丸のチェックマークが表示されていれば、設定に成功しています。

転送ルールを構成する

  1. [フロントエンドの設定] をクリックします。
  2. [名前] に www-rule と入力します。
  3. [IP] にあるプルダウン メニューをクリックして、[IP アドレスを作成] を選択します。
    1. [静的 IP アドレスの予約] 画面で名前lb-ip-1 と入力します。
    2. [予約] をクリックします。
  4. [ポート] に 80 と入力します。
  5. [完了] ボタンをクリックします。

    [フロントエンドの設定] の左側にある青い丸のチェックマークが表示されていれば、設定に成功しています。

構成を確認する

  1. [確認と確定] ボタンをクリックして、ロードバランサのすべての構成設定を確認します。
  2. 設定が正しい場合は、[作成] をクリックします。ロードバランサの作成には数分かかります。

    [負荷分散] 画面で、新しいロードバランサの [バックエンド] 列に緑色のチェックマークが表示されていれば、新しく作成したロードバランサは正常な状態です。

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

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

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

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

    POST https://www.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://www.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://www.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 アドレスを検索する

Console

  1. Google Cloud Platform Console の負荷分散の [詳細] ページにある [転送ルール] タブに移動します。
    [転送ルール] タブに移動
  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://www.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"
}

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

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

$ while true; do curl -m1 [IP_ADDRESS]; done

次のステップ

このページは役立ちましたか?評価をお願いいたします。

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