ロードバランサへのインスタンス グループの追加


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

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

準備

  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。

    このページのサンプルをどのように使うかに応じて、タブを選択してください。

    コンソール

    Google Cloud コンソールを使用して Google Cloud サービスと API にアクセスする場合、認証を設定する必要はありません。

    gcloud

    1. Google Cloud CLI をインストールし、次のコマンドを実行して初期化します。

      gcloud init
    2. デフォルトのリージョンとゾーンを設定します

    REST

    このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

      Google Cloud CLI をインストールし、次のコマンドを実行して初期化します。

      gcloud init

制限事項

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

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

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

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

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

コンソール

  1. Google Cloud コンソールの [ロード バランシング] ページに移動します。

    [ロード バランシング] ページに移動

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

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 コマンドをご覧ください。

REST

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

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

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

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

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

コンソール

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

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

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

gcloud

set-target-pools コマンドを実行します。

gcloud compute instance-groups managed set-target-pools INSTANCE_GROUP \
        --target-pools TARGET_POOL,..

ここで

  • INSTANCE_GROUP はインスタンス グループの名前です。
  • TARGET_POOL,.. は、このインスタンス グループの追加先である 1 つ以上のターゲット プールの名前です。

REST

リージョン MIG またはゾーン MIGsetTargetPools メソッドを呼び出します。次に例を示します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/regionInstanceGroupManagers/INSTANCE_GROUP/setTargetPools

ここで

  • PROJECT_ID はこのリクエストのプロジェクト ID です。
  • REGION はインスタンス グループのリージョンです。
  • 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] として割り当てます。

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

バックエンド サービスで複数のポート番号を持つ名前付きポートを外部アプリケーション ロードバランサまたは内部アプリケーション ロードバランサで機能させるには、ヘルスチェックに特定のポート番号ではなく --use-serving-port フラグを設定する必要があります。このオプションは Google Cloud コンソールでは使用できません。--use-serving-port を設定するには、Google Cloud CLI または 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

名前付きポートの作成

コンソール

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

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

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

gcloud

マネージド インスタンス グループの場合は、instance-groups managed set-named-ports コマンドを使用して 1 つ以上の名前付きポートを設定します。非マネージド グループの場合は、instance-groups set-named-ports コマンドを使用します。

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

REST

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

次のステップ