リージョン マネージド インスタンス グループを使用したインスタンスの分散

このページでは、単一のリージョン内に分散したインスタンスを含むマネージド インスタンス グループを作成する方法について説明します。

単一のゾーンに属しているゾーンのマネージド インスタンス グループとは異なり、リージョン マネージド インスタンス グループではインスタンスが単一リージョン内の複数のゾーンに分散しているため、アプリケーションの可用性が向上します。たとえば、デフォルトで、リージョン us-east1 のリージョン マネージド インスタンス グループが、そのリージョン内の us-east1-b、us-east1-c、us-east1-d という 3 つのゾーンでインスタンスを均等に配分するとします。

リージョンに 4 つ以上のゾーンが含まれる場合、リージョン マネージド インスタンス グループは 3 つのゾーンを選択して、そこにインスタンスを作成します。また、インスタンスを作成するゾーンを選択したり、ゾーンが 3 つ未満のリージョンでインスタンスを作成したりすることもできます。たとえば、GPU でワークロードを高速化する場合は、GPU をサポートするゾーンを選択します。

ゾーン マネージド インスタンス グループと同様、リージョン マネージド インスタンス グループでは、自動スケーリング、内部負荷分散、外部負荷分散がサポートされます。

始める前に

制限事項

  • 1 つのマネージド インスタンス グループに指定できるインスタンス数は 2,000 個までです。
  • マネージド インスタンス グループを更新するときに、1 回のリクエストで指定できるインスタンス数は 1,000 個までです。
  • リージョン マネージド インスタンス グループには、maxRate 分散オプションを使用するロードバランサを使用できません。

リージョン マネージド インスタンス グループを選択する

リージョン マネージド インスタンス グループは、アプリケーションの負荷を複数のゾーンに分散でき、アプリケーションが単一のゾーンに制限されることも、異なるゾーンで複数のインスタンス グループを管理する必要もないため、通常のゾーン マネージド インスタンス グループよりもおすすめします。このレプリケーション機能は、ゾーン障害の発生や、単一ゾーンでインスタンス グループ全体の誤動作が起こる予期しない事態からトラフィックを保護します。このような事態が起きた場合でも、アプリケーションは同じリージョンの別のゾーンで実行しているインスタンスからトラフィックの処理を続行できます。

ゾーン障害が発生した場合、またはゾーンのインスタンス グループの応答が停止した場合でも、リージョン マネージド インスタンス グループは次のように VM をサポートし続けます。

  • リージョン マネージド インスタンス グループに含まれる、他のゾーンにあるインスタンスでトラフィックの処理が続行されます。自動スケーリングを設定しない限り、新しいインスタンスは追加されず、インスタンスが再分散されることもありません。

  • 障害のあったゾーンが回復した後、そのゾーンからのインスタンス グループによるトラフィックの処理が再開されます。

強固でスケーラブルなアプリケーションを設計する必要がある場合は、リージョン マネージド インスタンス グループを使用してください。

自動リバランス

リージョン マネージド インスタンス グループは、指定された数のゾーン全体にわたって VM インスタンスのバランスを均等に保とうとし、高可用性ワークロードをサポートします。deleteInstancesabandonInstances に対するメソッドの呼び出しなど、他のアクションが行われ、それによってすべてのゾーンの VM インスタンス間に不均衡が生じた場合、グループは積極的に機能して、正しいバランスを再構築します。バランスを復元するために、グループによってインスタンスが削除されたり、新しいインスタンスが追加されたりする可能性があります。

たとえば、ゾーン us-central1-a に 2 つのインスタンス、ゾーン us-central1-b に 1 つのインスタンス、およびゾーン us-central1-c に 1 つのインスタンスを持つリージョン マネージド インスタンス グループがある場合に、us-central1-c で VM インスタンスを削除すると、グループは再度バランスを取ろうとし、インスタンスはゾーン全体で再度均等に配分されます。

この場合、グループはゾーン us-central1-a からインスタンスを 1 つ削除し、新しいインスタンスをゾーン us-central1-c に追加して、各ゾーンのインスタンスが、ゾーンごとに 1 つになるようにします。どのインスタンスが削除されるかを選択して決定する方法はありません。

この動作はリージョン マネージド インスタンス グループに対してデフォルトで有効になっており、高可用性ワークロードがサポートされますが、リージョン マネージド インスタンス グループからインスタンスを削除または除去する場合には、この動作に留意しておく必要があります。

正しいマネージド インスタンス グループサイズをプロビジョニングする

ゾーンでの障害や、インスタンスのグループ全体での応答停止など、特殊な状況に備えるために、Compute Engine ではマネージド インスタンス グループをオーバープロビジョニングしておくことを強くおすすめします。アプリケーションのニーズに応じて、グループをオーバープロビジョニングし、ゾーンやインスタンスのグループが応答しなくなった場合にシステム全体に障害が発生することを防止します。

Google は、ユーザーがアプリケーションを使用できる状態を保つという点を優先して、オーバープロビジョニングに関する推奨事項を作成しています。これらの推奨事項には、アプリケーションで日常的に必要な VM インスタンスよりも多くの VM インスタンスのプロビジョニングや支払いが含まれます。アプリケーションのニーズとコストに関する制限に基づき、オーバープロビジョニングに関して最適な判断を行う必要があります。

3 つ以上のゾーンでリージョン マネージド インスタンス グループをプロビジョニングする

少なくとも 3 つのゾーンを含むリージョンでリージョン マネージド インスタンス グループを作成する場合、インスタンス グループを少なくとも 50% オーバープロビジョニングすることをおすすめします。デフォルトで、リージョン マネージド インスタンス グループによって、3 つのゾーンにインスタンスが作成されます。3 つのゾーンに VM インスタンスを置くことで、処理能力の少なくとも 2/3 を確保することができ、1 つのゾーンで障害が発生しても、リージョン内の残りの 2 つのゾーンでは、トラフィックの処理を中断なく続行できます。150% までオーバープロビジョニングすると、能力の 1/3 が失われても、残りのゾーンでトラフィックに 100% 対応できます。

たとえば、3 つのゾーン全体でマネージド インスタンス グループに 20 の仮想マシン インスタンスが必要な場合、インスタンス数の少なくとも 50% をさらに追加することをおすすめします。この場合、20 のインスタンスの 50% にあたる 10 のインスタンスが追加して、インスタンス グループ内のインスタンス数を 30 にします。30 のサイズのリージョン マネージド インスタンス グループを作成する場合、インスタンス グループによって、以下のように 3 つのゾーンにわたって可能な限り均等にインスタンスが配分されます。

ゾーン インスタンス数
example-zone-1 10
example-zone-2 10
example-zone-3 10

あるゾーンで障害が発生したとしても、トラフィックを処理するインスタンスは 20 残っています。

2 つのゾーンでリージョン マネージド インスタンス グループをプロビジョニングする

3 つではなく、2 つのゾーンでインスタンスをプロビジョニングする場合、インスタンスの数を 2 倍にすることをおすすめします。たとえば、サービス用に 20 の VM インスタンスを 2 つのゾーンに配分する必要がある場合、40 のインスタンスを持つリージョン マネージド インスタンス グループを構成して、各ゾーンに 20 のインスタンスが含まれるようにする必要があります。1 つのゾーンで障害が発生しても、20 のインスタンスでトラフィックが引き続き処理されます。

ゾーン インスタンス数
example-zone-1 20
example-zone-2 20

グループ内のインスタンス数を 2 つのゾーンで簡単に分割できない場合、Compute Engine はインスタンスを可能な限り均等に分割し、残りのインスタンスをいずれかのゾーンにランダムに配置します。

1 つのゾーンでリージョン マネージド インスタンス グループをプロビジョニングする

1 つのゾーンのみを使用して、リージョン マネージド インスタンス グループを作成することもできます。これは、ゾーン マネージド インスタンス グループの作成と似ていますが、以下の点が異なります。

  • 1 つのゾーンでリージョン マネージド インスタンスを作成する場合、後でグループにゾーンをさらに追加することができます。ゾーン マネージド インスタンス グループにゾーンをさらに追加することはできません。

  • 多くの新機能は、最初にゾーン マネージド インスタンス グループで使用可能になることがよくあります。

単一のゾーン リージョン マネージド インスタンス グループを作成することはおすすめしません。これは、可用性が最小限の構成であるからです。ゾーンまたはリージョンに障害が発生すると、マネージド インスタンス グループ全体が使用できなくなり、ユーザーに混乱が生じる可能性があります。

グループのゾーンを選択する

リージョン マネージド インスタンス グループのデフォルト構成では、3 つのゾーン全体にわたって可能な限り均等にインスタンスが配分されます。さまざまな理由で、アプリケーション用に特定のゾーンを選択することが必要になる場合があります。たとえば、インスタンス用の GPU が必要な場合、GPU をサポートしているゾーンのみを選択する可能性があります。特定のゾーンでのみ使用できる永続ディスクを使用している場合や、リージョン内の 3 つのランダムなゾーンではなく、いくつかのゾーンでのみ、VM インスタンスで開始する場合などです。

ゾーンの数を選択したり、インスタンス グループが実行される特定のゾーンを選択したりする必要がある場合、最初にグループを作成する時点で選択する必要があります。作成中に特定のゾーンを選択すると、後でそのゾーンを変更または更新することはできなくなります。

  • リージョン内で 4 つ以上のゾーンを選択するには、個々のゾーンを明示的に指定する必要があります。たとえば、リージョン内の 4 つすべてのゾーンを選択するには、リクエストに 4 つすべてのゾーンを明示的に指定する必要があります。これを行わなければ、デフォルトで Compute Engine によって 3 つのゾーンが選択されます。

  • リージョン内の 2 つ以下のゾーンを選択するには、個々のゾーンを明示的に指定する必要があります。リージョンに含まれているゾーンが 2 つしかない場合でも、リクエストにゾーンを明示的に指定する必要があります。

特定のゾーンを選択するか、単にリージョンを選択し、Compute Engine がそのリージョン内のすべてのゾーンでインスタンスを作成できるようにするかに関係なく、VM インスタンスはすべてのゾーンにわたって均等に配分されます。ベスト プラクティスとして、指定された数のゾーンでアプリケーションをサポートするのに十分な VM インスタンスがプロビジョニングされていることを確認します。

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

gcloud コマンドライン ツール、Console、または API でリージョン マネージド インスタンス グループを作成します。

インスタンス グループのインスタンスをサポートするのに十分な容量が各ゾーンにない場合、Compute Engine は可能な限り多くのインスタンスを作成し、追加の割り当て量が利用可能になったら、引き続き残りのインスタンスの作成を試行します。

リージョン マネージド インスタンス グループを作成する場合、永続ディスクなど、特定のリソースはゾーンリソースであることに注意してください。インスタンス テンプレートでゾーンリソースを指定している場合、追加の永続ディスクと同様、このディスクはすべてのゾーンに存在し、このリージョン マネージド インスタンス グループで作成されたインスタンスが接続できるようにする必要があります。

デフォルトでは、リクエストに個々のゾーンを明示的に指定しなければ、Compute Engine によって 3 つのゾーンが選択され、そこにインスタンスが作成されます。3 つを超える、または 3 つ未満のゾーンにインスタンスを作成する必要がある場合、あるいは、使用するゾーンを選択する必要がある場合、リクエストでゾーンのリストを指定します。詳しくは、グループのゾーンを選択するをご覧ください。

Console

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

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

  2. [インスタンス グループを作成] をクリックして、新しいインスタンス グループを作成します。
  3. [ロケーション] で [マルチゾーン] を選択します。
  4. 目的のリージョンを選択します。
  5. 特定のゾーンを選択する場合、[ゾーンを設定] をクリックして、使用するゾーンを選択します。
  6. インスタンス グループ用にインスタンス テンプレートを選択するか、新しいインスタンス テンプレートを作成します。
  7. そのグループのインスタンス数を指定します。ゾーンに障害が発生した場合に備えて、アプリケーションをサポートするのに十分なインスタンスをプロビジョニングしてください。
  8. マネージド インスタンス グループに関する残りの作成手順を続けます。

gcloud

すべてのマネージド インスタンス グループに、インスタンス テンプレートが必要です。ない場合は、インスタンス テンプレートを作成してください。たとえば、次のコマンドを使用して、デフォルト プロパティを含む基本的なインスタンス テンプレートを作成します。

gcloud compute instance-templates create example-template

次に、--region フラグを指定して instance-groups managed create サブコマンドを使用します。たとえば、このコマンドによって、us-east1 リージョン内の 3 つのゾーンにリージョン マネージド インスタンス グループが作成されます。

gcloud compute instance-groups managed create example-rmig \
    --template example-template --base-instance-name example-instances \
    --size 30 --region us-east1

グループで使用する特定のゾーンを選択する必要がある場合、--zones フラグを指定します。

gcloud compute instance-groups managed create example-rmig \
    --template example-template --base-instance-name example-instances \
    --size 30 --zones us-east1-b,us-east1-c

API

すべてのマネージド インスタンス グループに、インスタンス テンプレートが必要です。ない場合は、インスタンス テンプレートを作成してください。

API で、regionInstanceGroupManagers.insert メソッドに対する POST リクエストを作成します。リクエスト本文には、必要なグループ名、グループサイズ、グループ内のインスタンスのベース名、インスタンス テンプレートへの URL を記載します。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers

{
  "baseInstanceName": "[BASE_INSTANCE_NAME]",
  "instanceTemplate": "global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]",
  "name": "[INSTANCE_GROUP_NAME]",
  "targetSize": "[TARGET_SIZE]",
  "distributionPolicy": {
     "zones": [
       {"zone": "zones/[ZONE]"},
       {"zone": "zones/[ZONE]"}
      ]
   }
}

ここで:

  • [PROJECT_ID] は、このリクエストのプロジェクト ID です。
  • [REGION] はインスタンス グループのリージョンです。
  • [BASE_INSTANCE_NAME] はインスタンス グループの一部として作成された、各インスタンスのインスタンス名です。たとえば、example-instance のベース インスタンス名によって example-instance-[RANDOM_STRING] などの名前のインスタンスが作成されます。この [RANDOM_STRING] はサーバーによって生成されます。
  • [INSTANCE_TEMPLATE_NAME] は使用するインスタンス テンプレートです。
  • [TARGET_SIZE] はインスタンス グループ内のインスタンスのターゲット数です。

特定のゾーンを選択する場合や、3 つ未満あるいは 3 つを超えるゾーンを含むリージョンでインスタンスを作成する場合、リクエストに distributionPolicy プロパティを含めて、ゾーンのリストを提供します。インスタンスを作成するゾーンの名前に [ZONE] を置き換えます。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers

{ "baseInstanceName": "[BASE_INSTANCE_NAME]", "instanceTemplate": "global/instanceTemplates/[INSTANCE_TEMPLATE_NAME]", "name": "[INSTANCE_GROUP_NAME]", "targetSize": "[TARGET_SIZE]", "distributionPolicy": { "zones": [ {"zone": "zones/[ZONE]"}, {"zone": "zones/[ZONE]"} ] } }

たとえば以下のようにすると、us-east1-b ゾーンと us-east1-c ゾーンにわたり、10 個のインスタンスが分配された、example-rmig という名前のインスタンス グループが作成されます。

POST https://www.googleapis.com/compute/v1/projects/myproject/regions/us-east1/instanceGroupManagers
{

  "baseInstanceName": "example-instance",
  "instanceTemplate": "global/instanceTemplates/example-instance",
  "name": "example-rmig",
  "targetSize": 10,
  "distributionPolicy": {
      "zones": [
        {"zone": "zones/us-east1-b"},
        {"zone": "zones/us-east1-c"}
      ]
   }
}

リージョン マネージド インスタンス グループのインスタンスを一覧表示する

リージョン マネージド インスタンス グループのインスタンス リストを取得するには、GCP Console を使用するか、gcloud コマンドライン ツールで instance-groups managed list-instances コマンドを使用するか、regionInstanceGroupManagers.listManagedInstances メソッドに対するリクエストを作成します。

Console

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

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

  2. インスタンスを表示するリージョン マネージド インスタンス グループの名前をクリックします。

インスタンス グループ詳細ページに、インスタンス グループのインスタンスの一覧が読み込まれます。

gcloud

instance-groups managed list-instances コマンドを実行します。

gcloud compute instance-groups managed list-instances [INSTANCE_GROUP_NAME] --region [REGION]

ここで:

  • [INSTANCE_GROUP_NAME] はインスタンス グループの名前です。
  • [REGION] はインスタンス グループのリージョンです。

たとえば、以下のコマンドでは、リージョン us-east1example-rmig という名前のインスタンス グループの一部であるインスタンスを一覧表示します。

gcloud compute instance-groups managed list-instances example-rmig --region us-east1

API

API では、regionInstanceGroupManagers.listManagedInstances メソッドに対する空の GET リクエストを作成します。

GET https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/instanceGroupManagers/[INSTANCE_GROUP_NAME]

次に例を示します。

GET https://www.googleapis.com/compute/v1/projects/myproject/regions/us-east1/instanceGroupManagers/example-rmig

リージョン マネージド インスタンス グループを更新する

Instance Group Updater 機能を使用して、リージョン マネージド インスタンス グループを更新できます。Updater を使用すると、インスタンスのサブセットまたはグループ内のすべてのインスタンスを新しいインスタンス テンプレートに更新できます。また、Updater を使用してカナリア更新を実行し、更新の速度を制御することもできます。

関連して、gcloudset-instance-template コマンドまたは API の setInstanceTemplate メソッドを使用して、既存のインスタンスを更新せずにインスタンス グループのインスタンス テンプレートを変更することもできます。インスタンス テンプレートを変更しても、既存のインスタンスが新しいインスタンス テンプレートに自動的に更新されるわけではないことに注意してください。個々のインスタンスを再作成するか、Instance Group Updater を実行して変更を適用する必要があります。ただし、グループに対する新しい VM インスタンスは新しいインスタンス テンプレートを使用します。

リージョン マネージド インスタンス グループを自動スケーリングする

Compute Engine はマネージド インスタンス グループの自動スケーリング機能を備えています。この機能では、負荷の増減に基づき、インスタンス グループが自動的にインスタンスの追加と削除を実行します。リージョン マネージド インスタンス グループに対しても、自動スケーリングを有効にすることができます。

リージョン マネージド インスタンス グループで自動スケーリングを有効にした場合、この機能の動作は以下のようになります。

  • 自動スケーリングのポリシーは、個別のゾーンではなく、グループ全体に適用されます。たとえば、CPU 使用率が 66% になるようにオートスケーラーを設定すると、オートスケーラーは、グループ内のすべてのインスタンスを追跡して、すべてのゾーンのすべてのインスタンスの平均 CPU 使用率が 66% に保たれるようにします。

  • 自動スケーリングでは、利用可能なゾーンにインスタンスが可能な限り均等に分散されます。一般にオートスケーラーはサイズの小さいゾーンを大きくし、大きいゾーンから負荷が振り分けられるようにしてゾーンのサイズのバランスを保ちます。カスタムのロードバランサを設定することはおすすめできません。カスタムのロードバランサはゾーンが 1 つだけの場合に適しており、予期しない動作が発生する可能性があります。

  • 1 つのゾーン、または 1 つのゾーン内のインスタンス グループに障害が発生した場合は、処理能力の 1/3 が失われることになりますが、2/3 は他のゾーンで確保されています。自動スケーリング ポリシーの設定で、自動スケーリングされるマネージド インスタンス グループをオーバープロビジョニングし、あるゾーンが停止したときに、残っているサーバーへの負荷の集中を回避できるようにすることをおすすめします。

オートスケーラーがゾーンに追加できるインスタンスは、グループに指定されている上限数の 1/3 までに制限されています。たとえば、自動スケーリングに設定された maxNumReplicas が 15 であれば、オートスケーラーでインスタンス グループのゾーンごとに追加できるインスタンス数は 1/3 × 15 = 5 になります。1 つのゾーンに障害が発生した場合、オートスケーラーが設定できる数は、残り 2 つのゾーンであわせて maxNumReplicas の 2/3 までになります。

オートスケーラー設定をプロビジョニングする

マネージド インスタンス グループのオーバープロビジョニングが推奨されているように、オートスケーラーの設定も、次のようにオーバープロビジョニングする必要があります。

  • 自動スケーリングの使用率目標値を、希望する使用率目標値の 2/3 にします。
  • 低い使用率目標値に対応するために、オートスケーラーがインスタンスを追加するので、maxNumReplicas を、オーバープロビジョンを考慮しない場合の設定数の 50% 増になるように設定します。

たとえば、20 のインスタンスでピーク時の負荷を処理でき、その目標使用率が 80% になるようにするには、オートスケーラーを次のように設定します。

  • 目標使用率として 80% ではなく 2/3 × 0.8 = 0.53 すなわち 53% を設定
  • インスタンスの最大数として 20 ではなく 3/2 × 20 = 30 を設定

この設定では、単一ゾーンで障害が発生した場合、インスタンス グループが容量不足になることはありません。使用率目標値を限界より低く設定しているため、残りの 2/3 のインスタンスで、オフライン ゾーンから振り分けられた増加負荷分を処理できるためです。さらにオートスケーラーは、使用率を目標値の 2/3 に維持するために、指定されたインスタンスの最大数まで、新しいインスタンスを追加します。

ただし、負荷の増加分を処理するには、マネージド インスタンス グループをオーバープロビジョニングするだけでは十分でない場合があります。Google の推奨するベスト プラクティスは、ゾーンの停止によってインスタンスの 1/3 が失われて利用率が増加したとしても十分処理できることを確認するため、定期的にアプリケーションの負荷テストを実施することです。

自動スケーリングを有効にする

Console

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

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

  2. インスタンス グループがない場合は作成します。それ以外の場合は、リストで既存のリージョン マネージド インスタンス グループの名前をクリックします。
  3. インスタンス グループの詳細ページで、[グループを編集] ボタンをクリックします。
  4. [自動スケーリング] で [オン] を選択します。
  5. 自動スケーリング設定のプロパティを入力します。
  6. 変更を保存します。

gcloud

gcloud コマンドライン ツールを使用し、set-autoscaling サブコマンドを使用して、--region フラグの後にリージョンの自動スケーリングを有効にします。オートスケーラーの作成に関する詳細は、自動スケーリングのドキュメントをご覧ください。

たとえば次のスニペットでは、example-rmig というサンプルのインスタンス グループに対してオートスケーラーが設定されます。us-east1 はマネージド インスタンス グループのリージョン、example-autoscaler はオートスケーラー名、example-rmig はリージョン マネージド インスタンス グループの名前にそれぞれ置き換えてください。

gcloud compute instance-groups managed set-autoscaling example-rmig \
  --target-cpu-utilization 0.8 --max-num-replicas 5 --region us-east1

API

リージョンの自動スケーリングを API に設定するには、以下の URL に対して POST リクエストを自分のプロジェクト ID とマネージド インスタンス グループのリージョンを指定して作成します。

POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/[REGION]/regionAutoscalers/

リクエストの本文には、nametargetautoscalingPolicy の項目があります。autoscalingPolicycpuUtilizationmaxNumReplicas を定義するものです。

{
 "name": "[AUTOSCALER_NAME]",
 "target": "regions/us-east1/instanceGroupManagers/[INSTANCE_GROUP_NAME]",
 "autoscalingPolicy": {
    "maxNumReplicas": [MAX_NUM_INSTANCES],
    "cpuUtilization": {
       "utilizationTarget": [TARGET_UTILIZATION]
     },
    "coolDownPeriodSec": [SECONDS]
  }
}

次に例を示します。

{
 "name": "example-autoscaler",
 "target": "regions/us-east1/instanceGroupManagers/example-rmig",
 "autoscalingPolicy": {
    "maxNumReplicas": 10,
    "cpuUtilization": {
       "utilizationTarget": 0.8
     },
    "coolDownPeriodSec": 30
  }
}

オートスケーラーを更新する

リージョンオートスケーラーは、ゾーン オートスケーラーと同じ方法で更新できます。詳しくはオートスケーラーの更新のドキュメントをご覧ください。

リージョン マネージド インスタンス グループをロードバランサに追加する

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

リージョン マネージド インスタンス グループは、外部負荷分散および内部負荷分散のバックエンド サービスのターゲットとして、またはネットワーク負荷分散のターゲット プールの一部として割り当てることができます。

HTTP(S) 負荷分散の場合、リージョン マネージド インスタンス グループでサポートされているのは maxRatePerInstancemaxUtilization だけです。

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

バックエンド サービスは、HTTP(S) ロードバランサ、内部ロードバランサ、または SSL ロードバランサの作成に必要です。バックエンド サービスには、マネージドまたは非マネージドのいずれかのインスタンス グループが 1 つ含まれている個別のバックエンドがそれぞれ含まれます。インスタンス グループ内のインスタンスがロードバランサからのトラフィックにレスポンスします。それにより、バックエンド サービスは使用できるインスタンス、処理可能なトラフィック数、現在処理しているトラフィック数を認識するようになります。また、バックエンド サービスはヘルスチェックをモニタリングし、異常なインスタンスにはトラフィックを送信しません。

インスタンス グループをバックエンド サービスに追加する手順については、バックエンド サービスへのインスタンス グループの追加をご覧ください。

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

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

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

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

Console

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

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

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

gcloud

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

gcloud beta compute instance-groups managed set-target-pools [INSTANCE_GROUP] \
    --target-pools [TARGET_POOL,..] [--region REGION]

ここで:

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

API

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

POST https://www.googleapis.com/compute/beta/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"
  ]
}

リージョン マネージド インスタンス グループのゾーン停止をシミュレーションする

リージョン マネージド インスタンス グループが十分にオーバープロビジョニングされており、ゾーンが停止した場合でも継続できることをテストするには、次のサンプルを使用して、1 つのゾーンで障害が発生した場合をシミュレートします。

このスクリプトはデフォルトのシナリオとして、Apache を停止して開始します。使用しているアプリケーションに適さない場合は、Apache を停止および開始するコマンドを、該当する障害と復元のシナリオに置き換えます。

  1. インスタンス グループ内のすべてのそれぞれの仮想マシン インスタンスで、このスクリプトをデプロイして実行していきます。これは、スクリプトをインスタンス テンプレートに追加するか、スクリプトをカスタム イメージに組み込み、インスタンス テンプレートでそのイメージを使用して行えます。

    #!/usr/bin/env bash
    
    # Copyright 2016 Google Inc. All Rights Reserved.
    #
    # Licensed under the Apache License, Version 2.0 (the "License");
    # you may not use this file except in compliance with the License.
    # You may obtain a copy of the License at
    #
    #     http://www.apache.org/licenses/LICENSE-2.0
    #
    # Unless required by applicable law or agreed to in writing, software
    # distributed under the License is distributed on an "AS IS" BASIS,
    # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    # See the License for the specific language governing permissions and
    # limitations under the License.
    
    set -o nounset
    set -o errexit
    set -o pipefail
    
    function GetMetadata() {
      curl -s "$1" -H "Metadata-Flavor: Google"
    }
    
    PROJECT_METADATA_URL="http://metadata.google.internal/computeMetadata/v1/project/attributes"
    INSTANCE_METADATA_URL="http://metadata.google.internal/computeMetadata/v1/instance"
    ZONE=$(GetMetadata "$INSTANCE_METADATA_URL/zone" | cut -d '/' -f 4)
    INSTANCE_NAME=$(hostname)
    
    # We keep track of the state to make sure failure and recovery is triggered only once.
    STATE="healthy"
    while true; do
      if [[ "$ZONE" = "$(GetMetadata $PROJECT_METADATA_URL/failed_zone)" ]] && \
         [[ "$INSTANCE_NAME" = *"$(GetMetadata $PROJECT_METADATA_URL/failed_instance_names)"* ]]; then
        if [[ "$STATE" = "healthy" ]]; then
          STATE="failure"
          # Do something to simulate failure here.
          echo "STARTING A FAILURE"
          /etc/init.d/apache2 stop
        fi
      else
        if [[ "$STATE" = "failure" ]] ; then
          STATE="healthy"
          # Do something to recover here.
          echo "RECOVERING FROM FAILURE"
          /etc/init.d/apache2 start
        fi
      fi
      sleep 5
    done
    
    

  2. 2 つのプロジェクトのメタデータ項目を設定して、ゾーンの障害をシミュレーションします。

    • failed_zone: 停止した場合をシミュレーションするゾーンを設定します。これにより、障害が発生するのが 1 つのゾーンのみに限定されます。
    • failed_instance_names: オフラインにするインスタンスを名前で選択します(これにより、このストリングを含むインスタンス名のみに障害が制限されます)。

    gcloud コマンドライン ツールを使用して、このメタデータを設定できます。たとえば次のコマンドは、ゾーンの停止を europe-west1-b ゾーンに設定し、instance-base-name で始まる名前のインスタンスに影響します。

    gcloud compute project-info add-metadata --metadata failed_zone='europe-west1-b',failed_instance_names='instance-base-name-'
    
  3. 停止状態をシミュレーションしたら、メタデータキーを削除して障害から復元します。

    gcloud compute project-info remove-metadata --keys failed_zone,failed_instance_names
    

障害が発生したときに、このスクリプトを使用して実行できる障害の事例は次のとおりです。

  • アプリケーションを完全に停止して、マネージド インスタンス グループがどのようにレスポンスするかを確認する。
  • インスタンスに対する負荷分散ヘルスチェックの結果が「異常」になるようにする。
  • インスタンスとの間で一部のトラフィックの流れが遮断されるように、iptables を変更する。
  • 仮想マシン インスタンスを停止する。デフォルトでは直後にリージョン マネージド インスタンス グループによって再作成されますが、新しく作成されたインスタンスも、メタデータ値が設定されている限りは、スクリプトが実行されるとすぐにシャットダウンします。その結果、障害ループが発生します。

次のステップ

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

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

Compute Engine ドキュメント