インスタンス グループをロードバランサに追加する

Google Cloud の負荷分散では、マネージド インスタンス グループと非マネージド インスタンス グループの両方を使用してトラフィックが処理されます。使用しているロードバランサのタイプに応じて、ターゲット プールまたはバックエンド サービスにインスタンス グループを追加できます。負荷分散の詳細については、ロードバランサの選択をご覧ください。

インスタンス グループの詳細については、インスタンス グループの概要をご覧ください。

始める前に

制限事項

  • リージョン MIG で負荷分散を使用する場合、次の制限が適用されます。
    • maxRate 分散モードは使用できません。
    • リージョン MIG で HTTP(S) 負荷分散スキームを使用する場合は、maxRatePerInstance または maxUtilization 分散モードを選択する必要があります。

マネージド インスタンス グループをバックエンド サービスに追加する

ロードバランサを作成するには、ほとんどの種類でバックエンド サービスが必要です。

バックエンド サービスには複数のバックエンドを含めることができます。インスタンス グループはバックエンドの一種です。インスタンス グループ内のインスタンスがロードバランサからのトラフィックに応答します。それにより、バックエンド サービスは使用できるインスタンス、処理可能なトラフィック数、現在処理しているトラフィック数を認識するようになります。また、バックエンド サービスはヘルスチェックをモニタリングし、異常なインスタンスにはトラフィックを送信しません。

マネージド インスタンス グループをバックエンド サービスに追加するには、以下の手順を実施します。

Console

  1. Cloud Console で [負荷分散] ページに移動します。

    [負荷分散] ページに移動

  2. マネージド インスタンス グループを追加するバックエンド サービスの名前をクリックします。
  3. [編集] をクリックします。
  4. [+ バックエンドを追加] をクリックします。
  5. 追加するインスタンス グループを選択します。
  6. 変更するオプション設定があれば編集します。
  7. 変更を保存します。

gcloud

gcloud コマンドライン ツールで、add-backend コマンドを使用します。

    gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
        --instance-group=INSTANCE_GROUP \
        [--instance-group-region=INSTANCE_GROUP_REGION | --instance-group-zone=INSTANCE_GROUP_ZONE] \
        --balancing-mode=BALANCING_MODE

マネージド インスタンス グループの負荷分散モードに応じて、パラメータを追加する必要があります。詳細については、SDK の add-backend コマンドをご覧ください。

API

REST API を使用してバックエンド サービスを追加するには、backendServices をご覧ください。

マネージド インスタンス グループをターゲット プールに追加する

ターゲット プールは、1 つ以上の仮想マシン インスタンスが含まれるオブジェクトです。ターゲット プールはネットワーク負荷分散で使用され、ネットワーク ロードバランサによって接続されているターゲット プールにユーザー リクエストが転送されます。このターゲット プールに含まれるインスタンスによってこれらのリクエストが処理され、レスポンスが返されます。インスタンス グループに対してインスタンスが追加または削除されると、その変更に合わせてターゲット プールが自動的に更新されるように、マネージド インスタンス グループをターゲット プールに追加できます。

マネージド インスタンス グループをターゲット プールに追加する前に、ターゲット プールを用意しておく必要があります。詳細については、ターゲット プールの追加に関するドキュメントをご覧ください。

既存のマネージド インスタンス グループをターゲット プールに追加する手順は次のとおりです。この操作を行うと、マネージド インスタンス グループに含まれるすべての VM インスタンスがターゲット プールに追加されます。

Console

  1. Cloud Console の [ターゲット プール] ページに移動します。

    [ターゲット プール] ページに移動

  2. インスタンス グループを追加するターゲット プールをクリックします。
  3. [編集] ボタンをクリックします。
  4. [VM インスタンス] セクションまで下にスクロールして、[インスタンス グループを選択] をクリックします。
  5. プルダウン メニューからインスタンス グループを選択します。
  6. 変更を保存します。

gcloud

gcloud コマンドライン ツールで、set-target-pools コマンドを使用します。

gcloud compute instance-groups managed set-target-pools [INSTANCE_GROUP] \
        --target-pools [TARGET_POOL,..] [--zone ZONE]

ここで

  • [INSTANCE_GROUP] はインスタンス グループの名前です。
  • [TARGET_POOL] は、このインスタンス グループを追加する 1 つ以上のターゲット プールの名前です。
  • [ZONE] はインスタンス グループのゾーンです。

API

API で、次の URI に POST リクエストを送ります。

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/[ZONE]/instanceGroupManagers/[INSTANCE_GROUP]/setTargetPools

ここで

  • [PROJECT_ID] はこのリクエストのプロジェクト ID です。
  • [ZONE] はインスタンス グループのゾーンです。
  • [INSTANCE_GROUP] はインスタンス グループの名前です。

リクエストの本文には、このグループを追加するターゲット プールの URI のリストを含める必要があります。次に例を示します。

{
  "targetPools": [
    "regions/us-central1/targetPools/example-targetpool-1",
    "regions/us-central1/targetPools/example-targetpool-2"
  ]
}

マネージド インスタンス グループへの名前付きポートの割り当て

名前付きポートとは、ポートの名前と番号を表す Key-Value ペアです。ポート名は、サービスまたはアプリケーションの名前を表します。ポート番号は、サービスまたはアプリケーションが動作しているポートを表します。

名前付きポートは、Cloud Load Balancing で使用されます。プロキシとして機能するロードバランサは、そのバックエンド サービスの構成内で、単一の名前付きポートに登録されます。ポート名は、各インスタンス グループのバックエンドの名前付きポート マッピングに基づいて、ポート番号に変換されます。

たとえば、バックエンド サービスは、http-port という名前のポートに登録できます。バックエンド インスタンスのグループには、http-port:80 という名前のポートを含めることができます。バックエンド インスタンスのグループは、TCP などのプロトコルを使用して、ポート 80 上のグループ内の VM にトラフィックを送信するようにロードバランサに指示します。プロトコルは、ロードバランサのバックエンド サービスで定義されます。

名前付きポートは、プロキシ ロードバランサで使用されるシンプルなメタデータです。名前付きポートは Compute Engine のネットワークまたはファイアウォールのリソースを制御しません。

複数のポート番号を持つ名前付きポート

各サービス名に複数のポートを割り当てることができます。また、ポートごとに複数のサービス名を割り当てることもできます。

次の点に注意してください。

  • トラフィックは、同じポート名を持つポート間で分散されます。
  • 特定のバックエンド サービスは、一度に 1 つの名前付きポートにのみトラフィックを転送できます。
  • 名前付きポートに複数のポート番号を使用する場合は、それらがすべて同じアプリケーション用のポートである必要があります。

    たとえば、ポート 80 は通常 TLS をサポートしていないため、http:80,http:8080 は機能しますが http:80,http:443 は機能しません。

インスタンス グループに複数の名前付きポートを割り当てられます。名前付きポート http-port に登録され、2 つのバックエンド インスタンスのグループを持つ、バックエンド サービスの例を見てみましょう。

  • 名前付きポート http-port:80 を持つ instance-group-a
  • 名前付きポート http-port:79 を持つ instance-group-b

このバックエンド サービスは、instance-group-a の VM にはポート 80 に、instance-group-b の VM にはポート 79 にトラフィックを送信します。

同じインスタンス グループを複数のバックエンド サービス(複数のロードバランサの場合)に追加し、インスタンス グループが各ロードバランサの異なるポートにサービスを提供する場合、すべてのポート番号を単一の名前付きポートに追加しないでください。代わりに、一意の名前付きポートを作成し、それを各バックエンド サービスが提供する必要のあるポートのセットにマップします。

たとえば、3 つのアプリケーションがあり、それぞれに独自のロードバランサがあるとします。各アプリケーションには固有のポート番号があります(app1 は 81、app2 は 82、app3 は 83)。3 つのバックエンド サービスがすべて共通のインスタンス グループを使用している場合、このインスタンス グループの名前付きポートを [app1:81, app2:82, app3:83] として割り当てます。

名前付きポートとヘルスチェック

バックエンド サービスで複数のポート番号を持つ名前付きポートを外部 HTTP(S) ロードバランサまたは内部 HTTP(S) ロードバランサで機能させるには、ヘルスチェックに特定のポート番号ではなく --use-serving-port フラグを設定する必要があります。このオプションは Google Cloud Console では使用できません。--use-serving-port を設定するには、gcloud または API を使用する必要があります。

たとえば、あるバックエンド サービスのトラフィックを 3 つのポート(81、82、83)で負荷分散するアプリケーションで、単一のインスタンス グループを使用するとします。このインスタンス グループのポートは [app:81, 82, 83] として割り当てることができます。このシナリオのヘルスチェックには --use-serving-port フラグが必要です。

詳細については、負荷分散のヘルスチェックのドキュメントをご覧ください。

名前付きポートとファイアウォール ルール

名前付きポートが Google Cloud のファイアウォール ルールの作成や変更を行うことはありません。バックエンド VM へのトラフィックを許可するには、必要なファイアウォール ルールを作成する必要があります。

名前付きポートとバックエンド サービス

インスタンス グループの構成に加えて、バックエンド サービスも構成する必要があります。たとえば、インスタンス グループに my-service-name という名前の名前付きポートとポート 8888 を設定したとします。

gcloud compute instance-groups set-named-ports my-unmanaged-ig \
    --named-ports=my-service-name:8888

この場合、バックエンド サービスの --port-namemy-service-name に設定して、バックエンド サービス構成の名前付きポートを参照する必要があります。

gcloud compute backend-services update my-backend-service \
    --port-name=my-service-name

名前付きポートの作成

Console

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

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

  2. 名前付きポートを指定するインスタンス グループの名前をクリックします。インスタンス グループのプロパティが記載されたページが表示されます。
  3. [編集] をクリックして、このマネージド インスタンス グループを変更します。
  4. [ポート名のマッピングを指定する] をクリックして、名前付きポートのオプションを展開します。
  5. [項目を追加] をクリックして、希望するポート名とその名前に関連付けるポート番号を入力します。さらに項目が必要な場合は、[項目を追加] をもう一度クリックして項目を追加します。
  6. [保存] をクリックして、変更を保存し、マネージド インスタンス グループ内のインスタンスに名前付きポートを適用します。

gcloud

set-named-ports コマンドを使用して、1 つ以上の名前付きポートを設定します。

gcloud compute instance-groups managed set-named-ports INSTANCE_GROUP \
      --named-ports PORT_NAME:PORT,PORT_NAME:PORT

例:

gcloud compute instance-groups managed set-named-ports INSTANCE_GROUP \
      --named-ports name1:80,name2:8080

各サービス名に複数のポートを割り当てる、または各サービスに複数の名前を割り当てるには、各名前またはポートに 1 つ以上の項目を作成します。たとえば、ポート 102080 が同じアプリケーション用の場合、これらのポートすべてに name1 を割り当てることができます。さらに、ポート 8080name2name3 の 2 つの名前を割り当てることもできます。また、次の例のように、ポート 9000name4 に割り当てることもできます。

gcloud compute instance-groups managed set-named-ports INSTANCE_GROUP \
      --named-ports name1:10,name1:20,name1:80,\
                    name2:8080,name3:8080,\
                    name4:9000

get-named-ports コマンドを使用して、マネージド インスタンス グループに対する名前付きポートの割り当てを確認します。

gcloud compute instance-groups managed get-named-ports INSTANCE_GROUP
NAME  PORT
name1 10
name1 20
name1 80
name2 8080
name3 8080
name4 9000

API

instanceGroupManagers API は、setNamedPorts API メソッドを提供していません。このタスクを実行するには、代わりに instanceGroups API を使用してください。

instanceGroups API へのリクエストを作成し、インスタンス グループの名前を含めます。特定のグループに関する情報を取得して、その情報からグループの現在の fingerprint 値を取得します。リクエスト本文に fingerprint と 1 つ以上の namedPorts 値のペアを含めます。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroups/INSTANCE_GROUP/setNamedPorts

{
  "fingerprint": "42WmSpB8rSM=",
  "namedPorts": [
    {
       "name": "PORT_NAME",
       "port": PORT_NUMBER
    },
    {
       "name": "PORT_NAME",
       "port": PORT_NUMBER
    }
  ]
 }
 

たとえば、ポート 102080 が同じアプリケーション用の場合、これらのポートすべてに name1 を割り当てることができます。さらに、ポート 8080name2name3 の 2 つの名前を割り当てることもできます。また、次の例のように、ポート 9000name4 に割り当てることもできます。

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instanceGroups/example-group/setNamedPorts

{
   "fingerprint": "42WmSpB8rSM=",
   "namedPorts": [
      {
       "name": "name1",
       "port": 8080
      },
      {
       "name": "name2",
       "port": 9000
      }
   ]
}

各サービス名に複数のポートを割り当てるには、そのサービス名の複数の項目を作成します。たとえば、ポート 102080name1 に割り当てることができます。さらに、ポート 8080name2 に割り当てます。

POST https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-a/instanceGroups/example-group/setNamedPorts

{
   "fingerprint": "42WmSpB8rSM=",
   "namedPorts": [
      {
       "name": "name1",
       "port": 10
      },
      {
       "name": "name1",
       "port": 20
      }
      {
       "name": "name1",
       "port": 80
      }
      {
       "name": "name2",
       "port": 8080
      }
      {
       "name": "name3",
       "port": 80
      }
      {
       "name": "name4",
       "port": 8080
      }
   ]
}

マネージド インスタンス グループにすでに割り当てられている名前付きポートのリストを表示するには、そのグループを指す GET リクエストを作成します。

GET https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instanceGroupManagers/INSTANCE_GROUP

次のステップ