Usar el balanceo de carga con aplicaciones de alta disponibilidad

En este tutorial se explica cómo usar el balanceo de carga con un grupo de instancias gestionado regional para redirigir el tráfico de las instancias de VM ocupadas o no disponibles, lo que te permite ofrecer alta disponibilidad incluso durante una interrupción zonal.

Un grupo de instancias gestionado regional distribuye una aplicación en varias instancias de varias zonas. Un balanceador de carga global dirige el tráfico a través de varias regiones mediante una única dirección IP. Si usas ambos servicios para distribuir tu aplicación en varias zonas, puedes asegurarte de que esté disponible incluso en casos extremos, como una interrupción zonal.

Los balanceadores de carga se pueden usar para dirigir varios tipos de tráfico. En este tutorial se explica cómo crear un balanceador de carga global que dirija el tráfico HTTP externo, pero gran parte del contenido sigue siendo relevante para otros tipos de balanceadores de carga. Para obtener información sobre otros tipos de tráfico que se pueden dirigir con un balanceador de carga, consulta Tipos de Cloud Load Balancing.

En este tutorial se incluyen los pasos detallados para lanzar una aplicación web en un grupo de instancias gestionado regional, configurar el acceso a la red, crear un balanceador de carga para dirigir el tráfico a la aplicación web y observar el balanceador de carga simulando una interrupción zonal. Según tu experiencia con estas funciones, tardarás unos 45 minutos en completar este tutorial.

Arquitectura de aplicaciones

La aplicación incluye los siguientes componentes de Compute Engine:

  • Red de VPC: una red virtual dentro de Google Cloud que puede proporcionar conectividad global mediante sus propias rutas y reglas de cortafuegos.
  • Regla de cortafuegos: a Google Cloud un cortafuegos te permite permitir o rechazar el tráfico a tus instancias.
  • Plantilla de instancia: una plantilla que se usa para crear cada instancia de máquina virtual del grupo de instancias gestionado.
  • Grupo de instancias gestionado regional: un grupo de instancias de VM que ejecutan la misma aplicación en varias zonas.
  • Dirección IP externa estática global: una dirección IP estática a la que se puede acceder en redes externas y que se puede asociar a un recurso global.
  • Balanceador de carga global: balanceador de carga que permite distribuir instancias de backend en varias regiones. Usa un balanceador de carga global cuando tus usuarios necesiten acceder a las mismas aplicaciones y contenido, y quieras proporcionar acceso mediante una única dirección IP anycast.
  • Comprobación del estado: una política que usa el balanceador de carga para evaluar la capacidad de respuesta de la aplicación en cada instancia de VM.

Iniciar la aplicación web

En este tutorial se usa una aplicación web almacenada en GitHub. Si quieres obtener más información sobre cómo se ha implementado la aplicación, consulta el repositorio GoogleCloudPlatform/python-docs-samples en GitHub.

Inicia la aplicación web en todas las VMs de un grupo de instancias incluyendo un script de inicio en una plantilla de instancia. Además, ejecuta el grupo de instancias en una red de VPC dedicada para evitar que las reglas de cortafuegos de este tutorial interfieran con los recursos que ya se estén ejecutando en tu proyecto.

Crear una red VPC

Si usas una red de VPC, los recursos de tu proyecto no se verán afectados por los recursos que crearás en este tutorial. También se necesita una red de VPC para restringir el tráfico entrante de forma que tenga que pasar por el balanceador de carga.

Crea una red de VPC para encapsular las reglas de cortafuegos de la aplicación web de demostración:

  1. En la Google Cloud consola, ve a la página Redes de VPC.

    Ir a redes de VPC

  2. Haz clic en Crear red VPC.

  3. En Name (Nombre), introduce web-app-vpc.

  4. Selecciona Personalizado en Modo de creación de subred.

  5. Crea una subred de la siguiente manera:

    1. En la sección Subnets (Subredes), define el campo Name (Nombre) e introduce web-app-vpc-subnet.
    2. En el desplegable Región, selecciona us-central1.
    3. Asegúrate de que la opción Tipo de pila de IP esté configurada como IPv4.
    4. En la sección Intervalo IPv4 principal, introduce el intervalo IPv4 10.2.0.0/24.
  6. En la parte inferior de la página, haz clic en Crear.

Espera a que se cree la red de VPC antes de continuar.

Crear una regla de cortafuegos

Una vez creada la red de VPC, configura una regla de cortafuegos para permitir el tráfico HTTP a la red de VPC:

  1. En la Google Cloud consola, ve a la página Cortafuegos.

    Ir a Cortafuegos

  2. Haz clic en Crear regla de cortafuegos.

  3. En el campo Name (Nombre), introduce allow-web-app-http.

  4. Selecciona Red y, a continuación, web-app-vpc.

  5. Asegúrate de que las siguientes opciones estén configuradas como se indica:

    • La opción Dirección del tráfico está definida como Entrada.
    • La opción Acción tras coincidencia está definida como Permitir.
  6. En el menú desplegable Destinos, elige Todas las instancias de la red.

  7. Defina Filtro de fuente como IPv4 ranges.

  8. En el campo Intervalos de IPs de origen, introduce 130.211.0.0/22, 35.191.0.0/16 para permitir las comprobaciones del estado del balanceador de carga.

  9. En Protocolos y puertos, haz lo siguiente:

    1. Selecciona Protocolos y puertos especificados.
    2. Selecciona TCP.
    3. En el campo Puertos, introduce 80 para permitir el acceso al tráfico HTTP.
  10. Haz clic en Crear.

Crear una plantilla de instancia

Crea una plantilla que usarás para crear un grupo de instancias de máquina virtual. Cada instancia creada a partir de la plantilla inicia una aplicación web de demostración mediante una secuencia de comandos de inicio.

  1. En la consola, ve a la página Plantillas de instancia. Google Cloud

    Ir a Plantillas de instancia

  2. Haz clic en Crear plantilla de instancia.

  3. En Name (Nombre), introduce load-balancing-web-app-template.

  4. En Configuración de la máquina, selecciona e2-medium en Tipo de máquina.

  5. Haz clic en la sección Opciones avanzadas para desplegarla.

  6. Haz clic en la sección Redes y haz lo siguiente:

    1. En la sección Interfaces de red, elimine las interfaces de red que haya haciendo clic en el icono situado junto a ellas.
    2. Haga clic en Añadir una interfaz de red y, a continuación, seleccione la web-app-vpc red. De esta forma, cada instancia creada con esta plantilla se ejecutará en la red creada anteriormente.
    3. En el menú desplegable Subred, selecciona web-app-vpc-subnet.
    4. Haz clic en Listo.
  7. Haz clic en la sección Gestión y haz lo siguiente:

    1. En la sección Automatización, introduce la siguiente secuencia de comandos de inicio:

      apt-get update
      apt-get -y install git python3-pip python3-venv
      git clone https://github.com/GoogleCloudPlatform/python-docs-samples.git
      python3 -m venv venv
      ./venv/bin/pip3 install -Ur ./python-docs-samples/compute/managed-instances/demo/requirements.txt
      ./venv/bin/pip3 install gunicorn
      ./venv/bin/gunicorn --bind 0.0.0.0:80 app:app --daemon --chdir ./python-docs-samples/compute/managed-instances/demo
      

      La secuencia de comandos obtiene, instala e inicia la aplicación web cuando se inicia una instancia de VM.

  8. Deje los valores predeterminados de las demás opciones.

  9. Haz clic en Crear.

Espera a que se cree la plantilla antes de continuar.

Crear un grupo de instancias gestionado regional

Para ejecutar la aplicación web, usa la plantilla de instancia para crear un grupo de instancias gestionado regional:

  1. En la consola, ve a la página Grupos de instancias. Google Cloud

    Ir a Grupos de instancias

  2. Haz clic en Crear grupo de instancias.

  3. En Nombre, escribe load-balancing-web-app-group.

  4. En Plantilla de instancia, selecciona load-balancing-web-app-template.

  5. Define Número de instancias en 6. Si este campo está inhabilitado, desactiva primero el ajuste de escala automático.

    Para desactivar el autoescalado, ve a la sección Autoescalado. En el menú desplegable Modo de escalado automático, selecciona Desactivado: no usar el escalado automático.

  6. En Ubicación, selecciona Varias zonas.

  7. En Región, selecciona us-central1.

  8. En Zonas, selecciona las siguientes zonas de la lista desplegable:

    • us-central1-b
    • us-central1-c
    • us-central1-f
  9. Deje los valores predeterminados de las demás opciones.

  10. Haz clic en Crear. Se te redirigirá a la página Grupos de instancias.

    Es posible que tengas que esperar unos minutos hasta que se ejecuten todas las instancias del grupo.

Configurar el balanceador de carga

Para usar un balanceador de carga que dirija el tráfico a tu aplicación web, debes reservar una dirección IP externa para recibir todo el tráfico entrante. A continuación, crea un balanceador de carga que acepte el tráfico de esa dirección IP y lo redirija al grupo de instancias.

Reservar una dirección IP estática

Usa una dirección IP externa estática global para proporcionar al balanceador de carga un único punto de entrada para recibir todo el tráfico de los usuarios. Compute Engine conserva las direcciones IP estáticas aunque cambies o elimines los recursos afiliados. Google Cloud De esta forma, la aplicación web siempre tendrá el mismo punto de entrada, aunque cambien otras partes de la aplicación web.

  1. En la Google Cloud consola, ve a la página Direcciones IP.

    Ir a direcciones IP

  2. Haz clic en Reservar dirección IP estática externa.

  3. En el campo Name (Nombre), introduce web-app-ipv4.

  4. Configura Versión de IP como IPv4.

  5. En Tipo, seleccione Global.

  6. Haz clic en Reservar.

Crear un balanceador de carga

En esta sección se explican los pasos necesarios para crear un balanceador de carga global que dirija el tráfico HTTP.

Este balanceador de carga usa un frontend para recibir el tráfico entrante y un backend para distribuir este tráfico a instancias en buen estado. Como el balanceador de carga está formado por varios componentes, esta tarea se divide en cinco partes:

  • Selecciona el tipo de balanceador de carga
  • Dar nombre al balanceador de carga
  • Configurar el frontend
  • Configurar el backend
  • Revisar y finalizar

Completa todas las partes para crear el balanceador de carga.

Selecciona el tipo de balanceador de carga

  1. En la Google Cloud consola, ve a la página Balanceo de carga.

    Ir a Balanceo de carga

  2. Haga clic en Crear balanceador de carga.
  3. En Tipo de balanceador de carga, selecciona Balanceador de carga de aplicación (HTTP/HTTPS) y haz clic en Siguiente.
  4. En Público o interno, selecciona Público (externo) y haz clic en Siguiente.
  5. En Implementación global o en una sola región, selecciona La mejor opción para cargas de trabajo globales y haz clic en Siguiente.
  6. En Generación del balanceador de carga, selecciona Balanceador de carga de aplicación externo global y haz clic en Siguiente.
  7. Haz clic en Configurar.

Dar nombre al balanceador de carga

  1. En el panel de la izquierda, en Nombre del balanceador de carga, introduce web-app-load-balancer.

Configurar el frontend

  1. En la página Configuración de frontend, en Nombre, introduce web-app-ipv4-frontend.
  2. Define Protocol (Protocolo) como HTTP.
  3. Configura Versión de IP en IPv4.
  4. Define la dirección IP como web-app-ipv4.
  5. Asigna el valor 80 a Port.
  6. Haga clic en Hecho para crear el frontend.

Configurar el backend

  1. En el panel de la izquierda, haz clic en Configuración del backend.
  2. Haz clic en el desplegable Servicios y segmentos de backend para abrir un menú y, a continuación, haz clic en Crear un servicio de backend.
  3. En la nueva ventana, en el campo Nombre del servicio backend, introduce web-app-backend.
  4. En la sección Backends (Back-ends), haga lo siguiente:
    1. Define Grupo de instancias como load-balancing-web-app-group.
    2. Define Port numbers (Transferir números) en 80. Esto permite el tráfico HTTP entre el balanceador de carga y el grupo de instancias.
    3. En Modo de equilibrio, selecciona Utilización.
    4. Haz clic en Listo.
  5. Crea la comprobación del estado del backend del balanceador de carga de la siguiente manera:

    1. Haga clic en el menú desplegable Comprobación del estado y, a continuación, en Crear una comprobación del estado. En la ventana que se abre,
    2. En la nueva ventana, en Nombre, introduce web-app-load-balancer-check.
    3. En Protocolo, selecciona HTTP.
    4. En Puerto, introduce 80.
    5. En este tutorial, define la ruta de solicitud como /health, que es una ruta que la aplicación web de demostración está configurada para responder.
    6. Define los siguientes criterios de estado:

      1. Define Intervalo de comprobación en 3 segundos. Define el tiempo que transcurre desde el inicio de una comprobación hasta el inicio de la siguiente.
      2. Define el tiempo de espera en 3 segundos. Define el tiempo que Google Cloud espera una respuesta a una petición de sondeo. Su valor debe ser inferior o igual al intervalo de comprobación.
      3. Define el umbral correcto en 2 éxitos consecutivos. Define el número de comprobaciones secuenciales que deben completarse correctamente para que la instancia se considere en buen estado.
      4. Define Umbral de estado incorrecto en 2 errores consecutivos. Define el número de sondeos secuenciales que deben fallar para que la instancia se considere en mal estado.
    7. Haz clic en Crear para crear la comprobación del estado.

  6. Deje los valores predeterminados de las demás opciones.

  7. Haz clic en Crear para crear el servicio de backend.

Revisar y finalizar

Verifica la configuración del balanceo de carga antes de crear el balanceador de carga:

  1. En el panel de la izquierda de la página Crear balanceador de carga de aplicaciones externo global, haz clic en Revisar y finalizar.
  2. En la página Revisar y finalizar, compruebe que Frontend usa una dirección IP con el Protocolo HTTP.

  3. En la misma página, compruebe los siguientes ajustes de Backend:

    • El servicio de backend es web-app-backend.
    • El protocolo de punto final es HTTP.
    • La comprobación del estado es web-app-load-balancer-check.
    • El grupo de instancias es load-balancing-web-app-group.
  4. Haz clic en Crear para terminar de crear el balanceador de carga.

Es posible que tengas que esperar unos minutos a que se cree el balanceador de carga.

Probar el balanceador de carga

Comprueba que puedes conectarte a la aplicación web mediante el balanceador de carga de la siguiente manera:

  1. En la Google Cloud consola, ve a la página Balanceo de carga.

    Ir a Balanceo de carga

  2. En la columna Nombre, haz clic en web-app-load-balancer para desplegar el balanceador de carga que acabas de crear.

  3. Para conectarse a la aplicación web mediante las direcciones IP estáticas externas, siga estos pasos:

    1. En la sección Frontend, copia la dirección IP que se muestra en la columna IP:Port.
    2. Abre una nueva pestaña del navegador y pega la dirección IP en la barra de direcciones. Debería mostrarse la aplicación web de demostración:

      Aplicación web de demostración.

    Ten en cuenta que, cada vez que actualices la página, el balanceador de carga se conectará a diferentes instancias en diferentes zonas. Esto ocurre porque no te conectas a una instancia directamente, sino al balanceador de carga, que selecciona la instancia a la que se te redirige.

    Cuando hayas terminado, cierra la pestaña del navegador de la aplicación web de demostración.

Simular una interrupción del servicio por zona

Para observar el funcionamiento del balanceador de carga, simula una interrupción generalizada de una zona. Esta simulación funciona forzando a todas las instancias ubicadas en una zona especificada a informar de un estado incorrecto en la ruta de solicitud /health. Cuando estas instancias informan de un estado incorrecto, no superan la comprobación de estado del balanceo de carga, lo que provoca que el balanceador de carga deje de dirigir tráfico a estas instancias.

  1. Monitoriza a qué zonas dirige el tráfico el balanceador de carga.

    1. En la Google Cloud consola, ve a Cloud Shell.

      Abrir Cloud Shell

      Cloud Shell se abre en un panel de laGoogle Cloud consola. La sesión puede tardar unos segundos en inicializarse.

    2. Guarda la dirección IP externa estática de tu balanceador de carga de la siguiente manera:

      1. Para obtener la dirección IP externa de la regla de reenvío del frontend del balanceador de carga, introduce el siguiente comando en tu terminal:

        gcloud compute forwarding-rules describe web-app-ipv4-frontend --global
        

        La salida tiene este aspecto: Copia el EXTERNAl_IP_ADDRESS del resultado.

        IPAddress: EXTERNAl_IP_ADDRESS
        ...
        
      2. Crea una variable bash local:

        export LOAD_BALANCER_IP=EXTERNAl_IP_ADDRESS
        

        Sustituye EXTERNAl_IP_ADDRESS por la dirección IP externa que has copiado.

    3. Para monitorizar a qué zonas dirige el tráfico el balanceador de carga, ejecuta el siguiente script de Bash:

      while true
      do
          BODY=$(curl -s "$LOAD_BALANCER_IP")
          NAME=$(echo -n "$BODY" | grep "load-balancing-web-app-group" | perl -pe 's/.+?load-balancing-web-app-group-(.+?)<.+/\1/')
          ZONE=$(echo -n "$BODY" | grep "us-" | perl -pe 's/.+?(us-.+?)<.+/\1/')
          echo $ZONE
          sleep 2 # Wait for 2 seconds
      done
      

      Esta secuencia de comandos intenta continuamente conectarse a la aplicación web mediante la dirección IP del frontend del balanceador de carga y muestra la zona desde la que se ejecuta la aplicación web en cada conexión.

      El resultado debe incluir las zonas us-central1-b, us-central1-c y us-central1-f:

      us-central1-f
      us-central1-b
      us-central1-c
      us-central1-f
      us-central1-f
      us-central1-c
      us-central1-f
      us-central1-c
      us-central1-c
      

      Mantén abierto este terminal.

  2. Mientras el monitor está en funcionamiento, empieza a simular el corte de suministro por zonas.

    1. En Cloud Shell, abre una segunda sesión de terminal haciendo clic en el botón Añadir.
    2. Crea una variable bash local para el ID del proyecto:

      export PROJECT_ID=PROJECT_ID
      

      donde PROJECT_ID es el ID del proyecto actual, que se muestra en cada línea nueva de Cloud Shell:

      user@cloudshell:~ (PROJECT_ID)$
      
    3. Crea una variable bash local para la zona que quieras inhabilitar. Para simular un fallo de la zona us-central1-f, usa el siguiente comando:

      export DISABLE_ZONE=us-central1-f
      

      A continuación, ejecuta la siguiente secuencia de comandos de Bash. Este script hace que las instancias de la aplicación web de demostración de la zona inhabilitada emitan respuestas incorrectas a la comprobación del estado del balanceador de carga. Las respuestas incorrectas hacen que el balanceador de carga dirija el tráfico lejos de estas instancias.

      export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --filter="zone:($DISABLE_ZONE)" --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "load-balancing-web-app-group")
      for i in $MACHINES;
      do
        NAME=$(echo "$i" | cut -f1 -d,)
        IP=$(echo "$i" | cut -f2 -d,)
        echo "Simulating zonal failure for zone $DISABLE_ZONE, instance $NAME"
        curl -q -s "http://$IP/makeUnhealthy" >/dev/null --retry 2
      done
      

      Tras un breve retraso, el balanceador de carga deja de dirigir tráfico a las zonas no operativas, por lo que la salida de la primera ventana de terminal deja de mostrar la zona us-central1-f:

      us-central1-c
      us-central1-c
      us-central1-c
      us-central1-b
      us-central1-b
      us-central1-c
      us-central1-b
      us-central1-c
      us-central1-c
      

      Esto indica que el balanceador de carga dirige el tráfico solo a las instancias en buen estado que responden.

      Mantén ambos terminales abiertos.

    4. En la segunda terminal, crea una variable bash local para la zona que quieras restaurar. Para restaurar el tráfico a la zona us-central1-f, usa el siguiente comando:

      export ENABLE_ZONE=us-central1-f
      

      A continuación, ejecuta la siguiente secuencia de comandos de Bash. Esta secuencia de comandos hace que las instancias de la aplicación web de demostración de la zona habilitada emitan respuestas correctas a la comprobación del estado del balanceador de carga. Las respuestas correctas hacen que el balanceador de carga empiece a distribuir el tráfico de nuevo hacia estas instancias.

      export MACHINES=$(gcloud --project=$PROJECT_ID compute instances list --filter="zone:($ENABLE_ZONE)" --format="csv(name,networkInterfaces[0].accessConfigs[0].natIP)" | grep "load-balancing-web-app-group")
      for i in $MACHINES;
      do
        NAME=$(echo "$i" | cut -f1 -d,)
        IP=$(echo "$i" | cut -f2 -d,)
        echo "Simulating zonal restoration for zone $ENABLE_ZONE, instance $NAME"
        curl -q -s "http://$IP/makeHealthy" >/dev/null --retry 2
      done
      

      Al cabo de unos minutos, la salida de la primera ventana de terminal vuelve a mostrar gradualmente la zona us-central1-f:

      us-central1-b
      us-central1-b
      us-central1-c
      us-central1-f
      us-central1-c
      us-central1-c
      us-central1-b
      us-central1-c
      us-central1-f
      

      Esto indica que el balanceador de carga vuelve a dirigir el tráfico entrante a todas las zonas.

      Cierra ambas terminales cuando hayas terminado.