Simular una interrupción de zona para un MIG regional


Para probar que su grupo de instancias administrado (MIG) regional está suficientemente sobreaprovisionado y puede sobrevivir a una interrupción de zona, puede utilizar el siguiente ejemplo para simular una falla zonal.

Antes de comenzar

  • Si desea utilizar los ejemplos de línea de comandos de esta guía, instale la CLI de Google Cloud .
  • Si aún no lo has hecho, configura la autenticación. La autenticación es el proceso mediante el cual se verifica su identidad para acceder a Google Cloud servicios y API. Para ejecutar código o muestras desde un entorno de desarrollo local, puedes autenticarte en Compute Engine seleccionando una de las siguientes opciones:

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

    gcloud

    1. After installing the Google Cloud CLI, initialize it by running the following command:

      gcloud init

      If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    2. Set a default region and zone.
    3. REST

      Para usar las muestras de la API de REST en esta página en un entorno de desarrollo local, debes usar las credenciales que proporcionas a la CLI de gcloud.

        After installing the Google Cloud CLI, initialize it by running the following command:

        gcloud init

        If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

      Para obtener más información, consulta Autentica para usar REST en la documentación de autenticación de Google Cloud .

Utilice un script para simular un corte de zona

Este script detiene e inicia Apache como escenario predeterminado. Si esto no se aplica a su aplicación, reemplace los comandos que detienen e inician Apache con su propio escenario de falla y recuperación.

  1. Implemente y ejecute este script continuamente en cada máquina virtual del grupo. Puede hacerlo agregando el script a la plantilla de instancia o incluyendo el script en una imagen personalizada y usando la imagen en la plantilla de instancia.

    #!/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 una falla de zona configurando estos dos campos de metadatos del proyecto:

    • failed_zone : establece la zona donde desea simular la interrupción (limite la falla a una sola zona).
    • failed_instance_names : elija las máquinas virtuales que desea desconectar por nombre (para limitar el error solo a los nombres de máquinas virtuales que contengan esta cadena).

    Puedes configurar estos metadatos mediante la CLI de gcloud. Por ejemplo, el siguiente comando establece la interrupción de la zona en la zona europe-west1-b y afecta a las máquinas virtuales que tienen nombres que comienzan con base-instance-name :

    gcloud compute project-info add-metadata --metadata failed_zone='europe-west1-b',failed_instance_names='base-instance-name-'
  3. Una vez que haya terminado de simular la interrupción, recupérese del error eliminando las claves de metadatos:

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

Aquí hay algunas ideas para escenarios de falla que puede ejecutar usando este script:

  • Detenga su aplicación por completo para ver cómo responde el MIG.
  • Haga que sus máquinas virtuales aparezcan como "en mal estado" en las comprobaciones de estado del equilibrio de carga.
  • Modifique iptables para bloquear parte del tráfico hacia y desde la VM.
  • Apague las máquinas virtuales. De forma predeterminada, el MIG regional lo recreará poco después, pero la nueva encarnación se cerrará inmediatamente tan pronto como se ejecute el script y siempre que se establezcan los valores de metadatos. Esto dará como resultado un bucle de bloqueo.

¿Qué sigue?