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

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

始める前に

  • このガイドのコマンドラインの例を使用する場合は、Google Cloud CLI をインストールします。

スクリプトを使用してゾーンの停止をシミュレートする

このスクリプトはデフォルトのシナリオとして、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 CLI を使用します。たとえば、次のコマンドではゾーンの停止を 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 も、メタデータ値が設定されている限り、スクリプトが実行されるとすぐにシャットダウンします。その結果、障害ループが発生します。

次のステップ