Ausfall einer Zone für eine regionale MIG simulieren


Wenn Sie testen möchten, ob die regionale verwaltete Instanzgruppe (Managed Instance Group, MIG) ausreicht und einen Zonenausfall überstehen kann, können Sie anhand des folgenden Beispiels den Ausfall einer einzelnen Zone simulieren.

Hinweis

  • Wenn Sie die Befehlszeilenbeispiele in dieser Anleitung verwenden möchten, installieren Sie die Google Cloud CLI.
  • Richten Sie die Authentifizierung ein, falls Sie dies noch nicht getan haben. Bei der Authentifizierung wird Ihre Identität für den Zugriff auf Google Cloud-Dienste und APIs überprüft. Zur Ausführung von Code oder Beispielen aus einer lokalen Entwicklungsumgebung können Sie sich so bei Compute Engine authentifizieren.

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

    gcloud

    1. Installieren Sie die Google Cloud CLI und initialisieren Sie sie mit folgendem Befehl:

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

      Verwenden Sie die von der gcloud CLI bereitgestellten Anmeldedaten, um die REST API-Beispiele auf dieser Seite in einer lokalen Entwicklungsumgebung zu verwenden.

        Installieren Sie die Google Cloud CLI und initialisieren Sie sie mit folgendem Befehl:

        gcloud init

      Weitere Informationen finden Sie unter Für die Verwendung von REST authentifizieren in der Dokumentation zur Google Cloud-Authentifizierung.

Skript zum Simulieren eines Zonenausfalls verwenden

Im Standardszenario wird durch dieses Skript Apache beendet und gestartet. Wenn dies für Ihre Anwendung nicht zutrifft, ersetzen Sie die Befehle, die Apache starten und beenden, durch ein eigenes Fehler- und Wiederherstellungsszenario.

  1. Stellen Sie dieses Skript in jeder VM in der Gruppe bereit und führen Sie es kontinuierlich aus. Dazu können Sie das Skript der Instanzvorlage hinzufügen oder es in ein benutzerdefiniertes Image einbeziehen und das Image in der Instanzvorlage verwenden.

    #!/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. Simulieren Sie einen Zonenausfall, indem Sie diese beiden Projektmetadatenfelder festlegen:

    • failed_zone: Legt die Zone fest, in der der Ausfall simuliert werden soll. Dadurch wird der Fehler auf nur eine Zone beschränkt.
    • failed_instance_names: Wählen Sie die VMs, die deaktiviert werden sollen, anhand des Namens aus. So begrenzen Sie den Ausfall auf jene VM-Namen, die diesen String enthalten.

    Sie können diese Metadaten mit der gcloud CLI festlegen. Durch den folgenden Befehl wird z. B. für den Zonenausfall die Zone europe-west1-b festgelegt. Er betrifft VMs, deren Name mit base-instance-name beginnt:

    gcloud compute project-info add-metadata --metadata failed_zone='europe-west1-b',failed_instance_names='base-instance-name-'
  3. Nachdem Sie den Ausfall simuliert haben, stellen Sie die Zone wieder her, indem Sie die Metadatenschlüssel entfernen:

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

Einige Beispiele für Fehlerszenarios, die Sie mit diesem Skript ausführen können:

  • Beenden Sie die Anwendung vollständig, um zu sehen, wie die MIG reagiert.
  • Legen Sie fest, dass die VMs bei Load-Balancing-Systemdiagnosen als "fehlerhaft" zurückgegeben werden.
  • Ändern Sie iptables so, dass ein Teil des Traffics zu und von der VM blockiert wird.
  • Fahren Sie die VMs herunter. Standardmäßig werden sie von der regionalen MIG kurz darauf neu erstellt. Die neue Instanz fährt sich aber selbst herunter, sobald das Skript ausgeführt wird und solange die Metadatenwerte festgelegt sind. Dies führt zu einer Absturzschleife.

Nächste Schritte