Simuler une défaillance de zone pour un MIG régional


Pour vérifier que votre groupe d'instances géré (MIG, managed instance group) régional est suffisamment surprovisionné pour survivre à une défaillance de zone, vous pouvez utiliser l'exemple suivant qui simule une défaillance de zone.

Avant de commencer

  • Si vous voulez vous servir des exemples de ligne de commande de ce guide, installez Google Cloud CLI.
  • Si ce n'est pas déjà fait, configurez l'authentification. L'authentification est le processus permettant de valider votre identité pour accéder aux services et aux API Google Cloud. Pour exécuter du code ou des exemples depuis un environnement de développement local, vous pouvez vous authentifier auprès de Compute Engine comme suit :

    Sélectionnez l'onglet correspondant à la façon dont vous prévoyez d'utiliser les exemples de cette page :

    gcloud

    1. Installez Google Cloud CLI, puis initialisez-la en exécutant la commande suivante :

      gcloud init
    2. Définissez une région et une zone par défaut.

    REST

    Pour utiliser les exemples d'API REST de cette page dans un environnement de développement local, vous devez utiliser les identifiants que vous fournissez à gcloud CLI.

      Installez Google Cloud CLI, puis initialisez-la en exécutant la commande suivante :

      gcloud init

Utiliser un script pour simuler une défaillance de zone

Ce script arrête et démarre Apache dans le cadre de son scénario par défaut. Si cela ne convient pas pour votre application, remplacez les commandes d'arrêt et de démarrage d'Apache par votre propre scénario de défaillance et de récupération.

  1. Déployez ce script et exécutez-le en continu sur chaque VM du groupe. Pour ce faire, vous pouvez ajouter le script au modèle d'instance, ou l'inclure dans une image personnalisée et utiliser cette image dans le modèle d'instance.

    #!/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. Simulez une défaillance de zone en définissant ces deux champs de métadonnées de projet :

    • failed_zone : définit la zone dans laquelle vous souhaitez simuler la panne (limite la défaillance à une seule zone).
    • failed_instance_names : choisissez les VM à déconnecter d'après leur nom (afin de limiter la défaillance aux seules VM dont le nom contient cette chaîne).

    Vous pouvez définir ces métadonnées à l'aide de gcloud CLI. Par exemple, la commande suivante définit une défaillance touchant la zone europe-west1-b et affectant les VM dont le nom commence par base-instance-name :

    gcloud compute project-info add-metadata --metadata failed_zone='europe-west1-b',failed_instance_names='base-instance-name-'
  3. Après avoir simulé la panne, lancez la récupération en supprimant les clés de métadonnées :

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

Voici quelques exemples des scénarios de défaillance que vous pouvez exécuter à l'aide de ce script :

  • Arrêtez complètement votre application pour voir comment le MIG réagit.
  • Faites en sorte que vos VM renvoient un état "non opérationnel" lors des vérifications de l'état effectuées par l'équilibreur de charge.
  • Reconfigurez iptables de manière à bloquer une partie du trafic à destination ou en provenance de la VM.
  • Arrêtez les VM. Par défaut, celles-ci sont recréées peu de temps après par le MIG régional, mais leur nouvelle incarnation s'arrêtera dès l'exécution du script et aussi longtemps que les valeurs de métadonnées resteront définies. Vous obtenez ainsi une boucle de plantage.

Étape suivante