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:
En la Google Cloud consola, ve a la página Redes de VPC.
Haz clic en Crear red VPC.
En Name (Nombre), introduce
web-app-vpc
.Selecciona Personalizado en Modo de creación de subred.
Crea una subred de la siguiente manera:
- En la sección Subnets (Subredes), define el campo Name (Nombre) e introduce
web-app-vpc-subnet
. - En el desplegable Región, selecciona us-central1.
- Asegúrate de que la opción Tipo de pila de IP esté configurada como IPv4.
- En la sección Intervalo IPv4 principal, introduce el intervalo IPv4
10.2.0.0/24
.
- En la sección Subnets (Subredes), define el campo Name (Nombre) e introduce
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:
En la Google Cloud consola, ve a la página Cortafuegos.
Haz clic en Crear regla de cortafuegos.
En el campo Name (Nombre), introduce
allow-web-app-http
.Selecciona Red y, a continuación,
web-app-vpc
.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.
En el menú desplegable Destinos, elige Todas las instancias de la red.
Defina Filtro de fuente como
IPv4 ranges
.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.En Protocolos y puertos, haz lo siguiente:
- Selecciona Protocolos y puertos especificados.
- Selecciona TCP.
- En el campo Puertos, introduce
80
para permitir el acceso al tráfico HTTP.
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.
En la consola, ve a la página Plantillas de instancia. Google Cloud
Haz clic en Crear plantilla de instancia.
En Name (Nombre), introduce
load-balancing-web-app-template
.En Configuración de la máquina, selecciona
e2-medium
en Tipo de máquina.Haz clic en la sección Opciones avanzadas para desplegarla.
Haz clic en la sección Redes y haz lo siguiente:
- En la sección Interfaces de red, elimine las interfaces de red que haya haciendo clic en el icono situado junto a ellas.
- 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. - En el menú desplegable Subred, selecciona
web-app-vpc-subnet
. - Haz clic en Listo.
Haz clic en la sección Gestión y haz lo siguiente:
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.
Deje los valores predeterminados de las demás opciones.
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:
En la consola, ve a la página Grupos de instancias. Google Cloud
Haz clic en Crear grupo de instancias.
En Nombre, escribe
load-balancing-web-app-group
.En Plantilla de instancia, selecciona
load-balancing-web-app-template
.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.
En Ubicación, selecciona Varias zonas.
En Región, selecciona us-central1.
En Zonas, selecciona las siguientes zonas de la lista desplegable:
- us-central1-b
- us-central1-c
- us-central1-f
Deje los valores predeterminados de las demás opciones.
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.
En la Google Cloud consola, ve a la página Direcciones IP.
Haz clic en Reservar dirección IP estática externa.
En el campo Name (Nombre), introduce
web-app-ipv4
.Configura Versión de IP como IPv4.
En Tipo, seleccione Global.
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
En la Google Cloud consola, ve a la página Balanceo de carga.
- Haga clic en Crear balanceador de carga.
- En Tipo de balanceador de carga, selecciona Balanceador de carga de aplicación (HTTP/HTTPS) y haz clic en Siguiente.
- En Público o interno, selecciona Público (externo) y haz clic en Siguiente.
- 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.
- En Generación del balanceador de carga, selecciona Balanceador de carga de aplicación externo global y haz clic en Siguiente.
- Haz clic en Configurar.
Dar nombre al balanceador de carga
- En el panel de la izquierda, en Nombre del balanceador de carga, introduce
web-app-load-balancer
.
Configurar el frontend
- En la página Configuración de frontend, en Nombre, introduce
web-app-ipv4-frontend
. - Define Protocol (Protocolo) como
HTTP
. - Configura Versión de IP en
IPv4
. - Define la dirección IP como
web-app-ipv4
. - Asigna el valor
80
a Port. - Haga clic en Hecho para crear el frontend.
Configurar el backend
- En el panel de la izquierda, haz clic en Configuración del backend.
- 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.
- En la nueva ventana, en el campo Nombre del servicio backend, introduce
web-app-backend
. - En la sección Backends (Back-ends), haga lo siguiente:
- Define Grupo de instancias como
load-balancing-web-app-group
. - Define Port numbers (Transferir números) en
80
. Esto permite el tráfico HTTP entre el balanceador de carga y el grupo de instancias. - En Modo de equilibrio, selecciona Utilización.
- Haz clic en Listo.
- Define Grupo de instancias como
Crea la comprobación del estado del backend del balanceador de carga de la siguiente manera:
- 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,
- En la nueva ventana, en Nombre, introduce
web-app-load-balancer-check
. - En Protocolo, selecciona HTTP.
- En Puerto, introduce
80
. - 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. Define los siguientes criterios de estado:
- 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. - 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. - 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. - 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.
- Define Intervalo de comprobación en
Haz clic en Crear para crear la comprobación del estado.
Deje los valores predeterminados de las demás opciones.
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:
- En el panel de la izquierda de la página Crear balanceador de carga de aplicaciones externo global, haz clic en Revisar y finalizar.
En la página Revisar y finalizar, compruebe que Frontend usa una dirección IP con el Protocolo
HTTP
.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
.
- El servicio de backend es
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:
En la Google Cloud consola, ve a la página Balanceo de carga.
En la columna Nombre, haz clic en
web-app-load-balancer
para desplegar el balanceador de carga que acabas de crear.Para conectarse a la aplicación web mediante las direcciones IP estáticas externas, siga estos pasos:
- En la sección Frontend, copia la dirección IP que se muestra en la columna IP:Port.
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:
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.
Monitoriza a qué zonas dirige el tráfico el balanceador de carga.
En la Google Cloud consola, ve a Cloud Shell.
Cloud Shell se abre en un panel de laGoogle Cloud consola. La sesión puede tardar unos segundos en inicializarse.
Guarda la dirección IP externa estática de tu balanceador de carga de la siguiente manera:
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 ...
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.
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
yus-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.
Mientras el monitor está en funcionamiento, empieza a simular el corte de suministro por zonas.
- En Cloud Shell, abre una segunda sesión de terminal haciendo clic en el botón Añadir.
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)$
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.
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.