リージョン MIG の作成と管理

このドキュメントでは、リージョン マネージド インスタンス グループ(リージョン MIG)の作成と管理について説明します。MIG の作成に関する一般的な情報については、マネージド インスタンス グループの作成をご覧ください。

リージョン MIG は、リージョン内の複数のゾーンにインスタンスを分散します。これにより、MIG ベースのワークロードの復元力が向上します。複数のゾーンを使用することで、単一ゾーンのすべてのインスタンスで障害が発生する極端な事態から保護できます。

リージョン MIG を選択する理由、追加の構成オプション、ゾーン MIG との違いなどの詳細については、リージョン MIG の概要をご覧ください。

始める前に

制限事項

  • リージョン MIG を使用すると、1 つのリージョンに最大 2,000 台の VM を作成できます。各ゾーンには最大 1,000 台の VM を作成できます。1 つのゾーン MIG には最大 1,000 台の VM を作成できます。さらに多くの VM が必要な場合は、サポートにお問い合わせください。
  • MIG を更新するときは、1 回のリクエストで最大 1,000 台の VM を指定できます。
  • ステートフル MIG が必要な場合は、ステートフル MIG 制限事項を確認してください。

  • リージョン MIG で負荷分散を使用する場合、次の制限が適用されます。

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

    • スケールインとスケールアウトを行うには、プロアクティブなインスタンスの再配布を有効にする必要があります。オートスケーラーのモードをスケールアウトのみに設定している場合は、プロアクティブなインスタンスの配布を有効にする必要はありません。
    • Cloud Monitoring の指標に基づいてリージョン MIG を自動スケーリングする場合、次の制限が適用されます。

      • グループごとの指標は使用できません。
      • インスタンスごとの指標にフィルタを適用することはできません。

リージョン MIG の作成

Cloud Consolegcloud ツール、または Compute Engine API を使用します。

各ゾーンにグループの VM をサポートする十分なキャパシティがない場合、Compute Engine は可能な限り多くの VM を作成し、追加の容量が使用可能になると、引き続き残りの VM の作成を試みます。

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

デフォルトでは、リクエストで個別のゾーンを明示的に指定しない場合、Compute Engine は自動的に 3 つのゾーンを選択してそこに VM を作成します。3 つを超えるゾーンまたは 2 つ以下のゾーンに VM を作成する必要がある場合や、使用するゾーンを選択する場合は、リクエストでゾーンのリストを指定できます。詳しくは、ゾーンの選択をご覧ください。

プロアクティブなインスタンスの再配布はデフォルトで有効になっています。各ゾーンの VM 数を手動で管理する必要がある場合は、プロアクティブなインスタンスの再配布を無効にできます。この場合、自動スケーリングは構成できません。

Console

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

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

  2. [インスタンス グループを作成] をクリックして、新しいインスタンス グループを作成します。
  3. [ロケーション] で [マルチゾーン] を選択します。
  4. 目的のリージョンを選択します。
  5. 特定のゾーンを選択する場合、[ゾーンを構成] をクリックして、使用するゾーンを選択して構成します。
  6. プロアクティブなインスタンスの再配布を無効にするには、次の手順を行います。
    1. 自動スケーリング モードオフになっていることを確認します。
    2. [インスタンスの再配布] を [オフ] に設定します。
  7. インスタンス グループ用のインスタンス テンプレートを選択するか、新しいインスタンス テンプレートを作成します。
  8. このグループの VM の数を指定します。ゾーンに障害が発生した場合に備えて、アプリケーションのサポートに十分な VM をプロビジョニングしてください。
  9. 残りの MIG 作成手順を続けます。

gcloud

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

gcloud compute instance-templates create example-template

次に、--region フラグを指定して instance-groups managed create コマンドを使用します。たとえば、次のコマンドは、us-east1 リージョン内の 3 つのゾーンにリージョン MIG を作成します。

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

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

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

プロアクティブなインスタンスの再配布を無効にするには、--instance-redistribution-type フラグを NONE に設定します。自動スケーリングが有効になっている場合は、プロアクティブなインスタンスの再配布を無効にできません。

gcloud compute instance-groups managed create example-rmig \
    --template example-template \
    --size 30 \
    --instance-redistribution-type NONE \
    --region us-east1

API

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

次に、regionInstanceGroupManagers.insert メソッドに対する POST リクエストを作成します。リクエストの本文で、グループ名、グループサイズ、インスタンス テンプレートの URL を指定します。必要に応じて、他のフィールド(グループのベース名など)を指定します。

POST https://compute.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"
}

次のように置き換えます。

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

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

POST https://compute.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 という名前のリージョン MIG が作成されます。

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

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

リージョン MIG のマネージド インスタンスの操作

特定の名前を持つインスタンスの作成や削除など、MIG 内の特定のマネージド インスタンスを操作する方法は、リージョン MIG とゾーンの MIG で変わりはありません。マネージド インスタンスの操作をご覧ください。

リージョン MIG とマネージド インスタンスに関する情報の取得

構成の表示やステータスの確認など、MIG に関する情報を取得する方法や、MIG のマネージド インスタンスに関する情報を取得する方法は、リージョン MIG とゾーン MIG で変わりありません。MIG とマネージド インスタンスに関する情報の取得をご覧ください。

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

Updater 機能を使用して、新しいインスタンス テンプレートをリージョン MIG に適用できます。詳細については、リージョン MIG の更新をご覧ください。

MIG でインスタンスを追加または削除する場合は、マネージド インスタンスの操作をご覧ください。

MIG 機能を使用または更新する場合は、自動修復負荷分散自動スケーリング自動更新ステートフル ワークロードのドキュメントをご覧ください。

プロアクティブなインスタンスの再配布の無効化と有効化

プロアクティブなインスタンスの再配布を使用すると、リージョン内のゾーン間で VM 数が均等に保たれます。この構成により、ゾーンレベルで障害が発生した場合のアプリケーションの可用性が最大化されます。

プロアクティブなインスタンスの再配布は、リージョン MIG ではデフォルトで有効になっていますが、自動スケーリングが有効になっていない MIG では無効にできます。プロアクティブなインスタンスの再配布を無効にすると、VM はゾーン間でプロアクティブに再配布されません。これは、次のような場合に役立ちます。

  • 実行中の他の VM に影響を与えずに、マネージド インスタンスを手動で削除または放棄する。
  • ジョブの完了時に、他のワーカーに影響を与えずにバッチワーカー VM を自動的に削除する。
  • ステートフル アプリケーションが実行されている VM がプロアクティブなインスタンスの再配布により自動的に削除されないようにする。

プロアクティブなインスタンスの再配布を無効にしてリージョン MIG を作成する場合、または既存のグループでプロアクティブなインスタンスの再配布をオフまたはオンにする場合は、Cloud Consolegcloud ツール、または Compute Engine API を使用します。

プロアクティブなインスタンスの再配布が無効なグループを作成する

Console

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

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

  2. [インスタンス グループを作成] をクリックして、新しいインスタンス グループを作成します。
  3. [ロケーション] で [マルチゾーン] を選択します。
  4. 目的のリージョンを選択します。
  5. 特定のゾーンを選択する場合、[ゾーンを構成] をクリックして、使用するゾーンを選択して構成します。
  6. プロアクティブなインスタンスの再配布を無効にするには、次の手順を行います。
    1. 自動スケーリング モードオフになっていることを確認します。
    2. [インスタンスの再配布] を [オフ] に設定します。
  7. グループ用のインスタンス テンプレートを選択するか、新しいインスタンス テンプレートを作成します。
  8. このグループの VM の数を指定します。ゾーンに障害が発生した場合に備えて、アプリケーションのサポートに十分な VM をプロビジョニングしてください。
  9. 残りの MIG 作成手順を続けます。

gcloud

プロアクティブなインスタンスの再配布を行わずに新しいリージョン MIG を作成するには、--instance-redistribution-type フラグを NONE に設定して gcloud compute instance-groups managed create コマンドを使用します。

gcloud compute instance-groups managed create INSTANCE_GROUP_NAME \
    --template INSTANCE_TEMPLATE_NAME \
    --size TARGET_SIZE \
    --zones ZONES \
    --instance-redistribution-type NONE

次のように置き換えます。

  • INSTANCE_GROUP_NAME: MIG の名前
  • INSTANCE_TEMPLATE_NAME: グループに使用するインスタンス テンプレートの名前
  • TARGET_SIZE: グループのターゲット サイズ
  • ZONES: VM のデプロイが必要な単一リージョン内のゾーンのリスト

例:

gcloud compute instance-groups managed create example-rmig \
    --template example-template \
    --size 30 \
    --zones us-east1-b,us-east1-c \
    --instance-redistribution-type NONE

API

プロアクティブなインスタンスの再配布と自動スケーリングを行わないリージョン MIG を作成するには、regionInstanceGroupManagers.insert メソッドに POST リクエストを行います。リクエストの本文に updatePolicy プロパティを含め、instanceRedistributionType フィールドを NONE に設定します。

POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/INSTANCE_GROUP_NAME

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

次のように置き換えます。

  • PROJECT_ID: このリクエストのプロジェクト ID
  • REGION: インスタンス グループのリージョン
  • INSTANCE_GROUP_NAME: MIG の名前
  • INSTANCE_TEMPLATE_NAME: グループに使用するインスタンス テンプレートの名前
  • TARGET_SIZE: インスタンス グループのターゲット サイズ
  • ZONE: VM をデプロイする 1 つのリージョン内のゾーンの名前

プロアクティブなインスタンスの再配布を無効にする

プロアクティブなインスタンスの再配布を無効にする前に、オートスケーラーのモードを設定して自動スケーリングをオフにするか、スケーリングをスケールアウトに制限する必要があります。

Console

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

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

  2. 更新する MIG を選択し、[グループの編集] をクリックします。
  3. 自動スケーリング構成が存在する場合は、[自動スケーリング モード] が [自動スケーリングしない] に設定されていることを確認してください。
  4. [インスタンスの再配布] を [オフ] に設定し、自動再配布を無効にします。
  5. [保存] をクリックします。

gcloud

自動スケーリングを行わないリージョン MIG のプロアクティブなインスタンスの再配布をオフにするには、--instance-redistribution-type フラグを NONE に設定して compute instance-groups managed update コマンドを使用します。

gcloud compute instance-groups managed update INSTANCE_GROUP_NAME \
    --instance-redistribution-type NONE \
    --region REGION

次のように置き換えます。

  • INSTANCE_GROUP_NAME: MIG の名前
  • REGION: インスタンス グループのリージョン

API

自動スケーリングされないリージョン MIG のプロアクティブなインスタンスの再配布を無効にするには、regionInstanceGroupManagers.patch メソッドPATCH リクエストを行います。リクエストの本文に updatePolicy プロパティを含め、instanceRedistributionType フィールドを NONE に設定します。

 PATCH https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/regions/REGION/instanceGroupManagers/[INSTANCE_GROUP_NAME

{
    "updatePolicy": {
         "instanceRedistributionType": "NONE"
    }
}

次のように置き換えます。

  • PROJECT_ID: このリクエストのプロジェクト ID
  • REGION: インスタンス グループのリージョン
  • INSTANCE_GROUP_NAME: 自動スケーリングされない MIG の名前

プロアクティブなインスタンスの再配布を有効にする

プロアクティブなインスタンスの再配布を有効にするには、プロアクティブなインスタンスの再配布を無効にすると同様のコマンドを使用しますが、インスタンスの配布タイプを PROACTIVE に設定します。

マネージド インスタンスを手動で削除または放棄し、リージョンで VM 数の不均等が発生した場合は、プロアクティブなインスタンスの再配布を有効にする前に、グループの調整を手動で行う必要があります。2 つのゾーン間での VM 数の差は、1 VM 以下にする必要があります。

ゾーン間の VM 数が不均等な(2 つのゾーン間の VM 数の差が 2 以上の)状態にある間、そのリージョン MIG ではプロアクティブなインスタンスの再配布を有効にできません。これは、不均等を是正するために、VM 数の多いゾーンから VM が自動的に削除されないようにするためです。

リージョン MIG を手動で再調整する

MIG は、2 つのゾーン間での VM の数の差が 2 つ以上の VM の場合には分散されません。プロアクティブなインスタンスの再配布を無効にした後、インスタンスを削除または破棄して、ゾーン間の分散が不均一になると、MIG が不足する場合があります。

ゾーン間のインスタンス数を手動で均等にするには、インスタンス数が多いゾーンから VM を削除します。あるいは、サイズを変更して、インスタンスが均等な状態になるまで VM の少ないゾーンにインスタンスを追加します。

プロアクティブなインスタンスの再配布が無効になっている MIG のサイズを変更すると、状況に応じてグループ内の調整が行われるため、グループのバランスを調整する機会が完全に失われるわけではありません。

  • グループのサイズを大きくすると、VM 数が最も少ないゾーンにインスタンスが追加されます。
  • グループのサイズを小さくすると、インスタンス数が最も多いゾーンからインスタンスが削除されます。
グループサイズを手動で変更して均等な配布を実現する例

リージョン MIG のゾーンの停止をシミュレーションする

リージョン MIG が十分にプロビジョニングされており、ゾーンが停止した場合でも継続できることをテストするには、以下の例を使用してゾーン障害をシミュレートします。

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

  1. このスクリプトをグループ内のすべての VM にデプロイし、継続的に実行します。それには、スクリプトをインスタンス テンプレートに追加するか、カスタム イメージにスクリプトを組み込んで、そのイメージをインスタンス テンプレートで使用します。

    #!/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: オフラインにする VM を名前で選択します(これにより、この文字列を含む VM 名のみに障害が限定されます)。

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

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

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

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

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

次のステップ