Simule uma indisponibilidade de zona para um MIG regional


Para testar se o seu grupo de instâncias gerido (MIG) regional tem aprovisionamento excessivo suficiente e consegue sobreviver a uma indisponibilidade de zona, pode usar o exemplo seguinte para simular uma falha zonal.

Antes de começar

  • Se quiser usar os exemplos de linhas de comando neste guia, instale a CLI do Google Cloud.
  • Se ainda não o tiver feito, configure a autenticação. A autenticação valida a sua identidade para aceder a Google Cloud serviços e APIs. Para executar código ou exemplos a partir de um ambiente de desenvolvimento local, pode autenticar-se no Compute Engine selecionando uma das seguintes opções:

    Select the tab for how you plan to use the samples on this page:

    gcloud

    1. Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    2. Set a default region and zone.

    REST

    Para usar os exemplos da API REST nesta página num ambiente de desenvolvimento local, usa as credenciais que fornece à CLI gcloud.

      Instale a CLI Google Cloud. Após a instalação, inicialize a CLI gcloud executando o seguinte comando:

      gcloud init

      Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro tem de iniciar sessão na CLI gcloud com a sua identidade federada.

    Para mais informações, consulte o artigo Autenticar para usar REST na Google Cloud documentação de autenticação.

Use um script para simular uma indisponibilidade de zona

Este script para e inicia o Apache como o cenário predefinido. Se isto não se aplicar à sua aplicação, substitua os comandos que param e iniciam o Apache pelo seu próprio cenário de falha e recuperação.

  1. Implemente e execute este script continuamente em todas as VMs do grupo. Pode fazê-lo adicionando o script ao modelo de instância ou incluindo o script numa imagem personalizada e usando a imagem no modelo de instância.

    #!/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. Simule uma falha de zona definindo estes dois campos de metadados do projeto:

    • failed_zone: define a zona onde quer simular a indisponibilidade (limite a falha a apenas uma zona).
    • failed_instance_names: escolha as VMs a desativar por nome (para limitar a falha apenas aos nomes de VMs que contenham esta string).

    Pode definir estes metadados através da CLI gcloud. Por exemplo, o seguinte comando define a indisponibilidade da zona para a zona europe-west1-b e afeta as VMs cujos nomes começam por base-instance-name:

    gcloud compute project-info add-metadata --metadata failed_zone='europe-west1-b',failed_instance_names='base-instance-name-'
  3. Depois de terminar a simulação da indisponibilidade, recupere da falha removendo as chaves de metadados:

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

Seguem-se algumas ideias de cenários de falha que pode executar com este script:

  • Pare completamente a sua aplicação para ver como o MIG responde.
  • Faça com que as suas VMs sejam devolvidas como "não íntegras" nas verificações de funcionamento do balanceamento de carga.
  • Modifique o iptables para bloquear parte do tráfego de e para a VM.
  • Encerre as VMs. Por predefinição, é recriado pelo MIG regional pouco depois, mas a nova instância desliga-se imediatamente assim que o script é executado e desde que os valores dos metadados estejam definidos. Esta ação resulta num ciclo de falhas de sistema.

O que se segue?