Simular una interrupción de servicio de una zona en un MIG regional


Para comprobar que tu grupo de instancias gestionadas (MIG) regional tiene suficientes recursos y puede seguir funcionando si se produce una interrupción en una zona, puedes usar el siguiente ejemplo para simular un fallo zonal.

Antes de empezar

  • Si quieres usar los ejemplos de línea de comandos de esta guía, instala Google Cloud CLI.
  • Si aún no lo has hecho, configura la autenticación. La autenticación verifica tu identidad para acceder a Google Cloud servicios y APIs. Para ejecutar código o ejemplos 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. Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    2. Set a default region and zone.

    REST

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

      Instala Google Cloud CLI. Después de la instalación, inicializa la CLI de Google Cloud ejecutando el siguiente comando:

      gcloud init

      Si utilizas un proveedor de identidades (IdP) externo, primero debes iniciar sesión en la CLI de gcloud con tu identidad federada.

    Para obtener más información, consulta el artículo Autenticarse para usar REST de la documentación sobre autenticación de Google Cloud .

Usar una secuencia de comandos para simular una interrupción de una zona

Esta secuencia de comandos detiene e inicia Apache como escenario predeterminado. Si esto no se aplica a tu aplicación, sustituye los comandos que detienen e inician Apache por tu propio escenario de fallo y recuperación.

  1. Implementa y ejecuta esta secuencia de comandos de forma continua en todas las VMs del grupo. Para ello, puedes añadir la secuencia de comandos a la plantilla de instancia o incluirla en una imagen personalizada y usarla 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. Simula un fallo de zona configurando estos dos campos de metadatos del proyecto:

    • failed_zone: define la zona en la que quieres simular la interrupción (limita el fallo a una sola zona).
    • failed_instance_names: elige las VMs que quieras poner sin conexión por nombre (para limitar el error solo a los nombres de las VMs que contengan esta cadena).

    Puedes definir estos metadatos con la CLI de gcloud. Por ejemplo, el siguiente comando define la interrupción de la zona europe-west1-b y afecta a las VMs cuyos nombres empiecen por base-instance-name:

    gcloud compute project-info add-metadata --metadata failed_zone='europe-west1-b',failed_instance_names='base-instance-name-'
  3. Cuando hayas terminado de simular la interrupción, recupera el sistema tras el fallo eliminando las claves de metadatos:

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

Aquí tienes algunas ideas de situaciones de error que puedes ejecutar con esta secuencia de comandos:

  • Detén por completo tu aplicación para ver cómo responde el MIG.
  • Hacer que tus VMs devuelvan el estado "no apto" en las comprobaciones de estado del balanceo de carga.
  • Modifica iptables para bloquear parte del tráfico que entra y sale de la VM.
  • Apaga las VMs. De forma predeterminada, la MIG regional la volverá a crear poco después, pero la nueva versión se cerrará inmediatamente en cuanto se ejecute la secuencia de comandos y siempre que se definan los valores de metadatos. Esto provocará un bucle de fallos.

Siguientes pasos