리전 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. 다음 두 프로젝트 메타데이터 필드를 설정하여 영역 오류를 시뮬레이션합니다.

    • failed_zone: 중단을 시뮬레이션하려는 영역을 설정합니다(하나의 영역으로만 오류를 제한).
    • 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이 '비정상'으로 반환되게 합니다.
  • iptables를 수정하여 VM과의 트래픽을 차단합니다.
  • VM을 종료합니다. 기본적으로 리전 MIG에서 가상 머신 인스턴스를 곧바로 다시 만들지만 메타데이터 값이 설정되어 있으면 스크립트가 실행되자마자 새로운 구현이 즉시 종료됩니다. 이로 인해 비정상 종료 루프가 발생합니다.

다음 단계