Codelab de optimizaciones avanzadas para el balanceo de cargas

1. Introducción

Te damos la bienvenida al codelab de optimizaciones avanzadas de balanceo de cargas.

En este codelab, aprenderás a configurar opciones avanzadas de balanceo de cargas para el balanceador de cargas de aplicaciones externo global. Antes de comenzar, te recomendamos que primero consultes el documento sobre el balanceo de cargas en la nube ( https://cloud.google.com/load-balancing/docs/load-balancing-overview).

c3fb1d3f027e8640.png

Figura 1: Flujo de trabajo para elegir un extremo de destino con el balanceador de cargas de aplicaciones externo global.

Topología y casos de uso del codelab

2f7368df335d3de9.png

Figura 2. Topología de enrutamiento del balanceador de cargas HTTP

Durante este codelab, configurarás dos grupos de instancias administrados. Crearás un balanceador de cargas HTTPS externo global. El balanceador de cargas usará varias funciones de la lista de capacidades avanzadas que admite el balanceador de cargas basado en Envoy. Una vez que se implemente, generarás una carga simulada y verificarás que las configuraciones que estableciste funcionen correctamente.

Qué aprenderás

  • Cómo configurar ServiceLbPolicy para ajustar tu balanceador de cargas

Requisitos

2. Antes de comenzar

En Cloud Shell, asegúrate de que tu ID del proyecto esté configurado.

gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
prodproject=YOUR-PROJECT-NAME
echo $prodproject

Habilita las APIs

Habilita todos los servicios necesarios

gcloud services enable compute.googleapis.com
gcloud services enable logging.googleapis.com
gcloud services enable monitoring.googleapis.com
gcloud services enable networkservices.googleapis.com

3. Crea la red de VPC

Crear red de VPC

Desde Cloud Shell

gcloud compute networks create httplbs --subnet-mode=auto

Salida

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/networks/httplbs].
NAME     SUBNET_MODE  BGP_ROUTING_MODE  IPV4_RANGE  GATEWAY_IPV4
httplbs  AUTO         REGIONAL

Crea reglas de firewall de VPC

Después de crear la VPC, ahora crearás una regla de firewall. La regla de firewall se usará para permitir que todas las IP accedan a la IP externa del sitio web de la aplicación de prueba en el puerto 80 para el tráfico HTTP.

Desde Cloud Shell

gcloud compute firewall-rules create httplb-allow-http-rule \
--allow tcp:80 \
--network httplbs \
--source-ranges 0.0.0.0/0 \
--priority 700

Salida

Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/httplb-allow-http-rule].
Creating firewall...done.
NAME                    NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
httplb-allow-http-rule  httplbs  INGRESS    700       tcp:80        False

En este codelab, ajustaremos el estado de las VMs. Por eso, también crearemos reglas de firewall para permitir SSH.

Desde Cloud Shell

gcloud compute firewall-rules create fw-allow-ssh \
    --network=httplbs \
    --action=allow \
    --direction=ingress \
    --target-tags=allow-ssh \
    --rules=tcp:22

Salida

Creating firewall...working..Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/firewalls/fw-allow-ssh].
Creating firewall...done.
NAME          NETWORK  DIRECTION  PRIORITY  ALLOW   DENY  DISABLED
fw-allow-ssh  httplbs  INGRESS    1000      tcp:22        False

4. Configura los grupos de instancias administrados

Debes configurar grupos de instancias administrados que incluyan los patrones de los recursos de backend que usa el balanceador de cargas HTTP. Primero, crearemos plantillas de instancias que definan la configuración de las VMs que se crearán para cada región. A continuación, para un backend en cada región, crearemos un grupo de instancias administrado que haga referencia a una plantilla de instancias.

Los grupos de instancias administrados pueden ser de alcance zonal o regional. En este ejercicio del lab, crearemos grupos de instancias administradas zonales.

En esta sección, puedes ver una secuencia de comandos de inicio creada previamente a la que se hará referencia cuando se cree la instancia. Esta secuencia de comandos de inicio instala y habilita las funciones del servidor web que usaremos para simular una aplicación web. No dudes en explorar esta secuencia de comandos.

Crea las plantillas de instancias

El primer paso es crear una plantilla de instancias.

Desde Cloud Shell

gcloud compute instance-templates create test-template \
   --network=httplbs \
   --tags=allow-ssh,http-server \
   --image-family=debian-9 \
   --image-project=debian-cloud \
   --metadata=startup-script='#! /bin/bash
     apt-get update
     apt-get install apache2 -y
     a2ensite default-ssl
     a2enmod ssl
     vm_hostname="$(curl -H "Metadata-Flavor:Google" \
     http://169.254.169.254/computeMetadata/v1/instance/name)"
     echo "Page served from: $vm_hostname" | \
     tee /var/www/html/index.html
     systemctl restart apache2'

Salida

NAME           MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
test-template  n1-standard-1               2021-11-09T09:24:35.275-08:00

Ahora puedes verificar que nuestras plantillas de instancias se hayan creado correctamente con el siguiente comando de gcloud:

Desde Cloud Shell

gcloud compute instance-templates list

Salida

NAME                  MACHINE_TYPE   PREEMPTIBLE  CREATION_TIMESTAMP
test-template         n1-standard-1         2021-11-09T09:24:35.275-08:00

Crea los grupos de instancias

Ahora debemos crear un grupo de instancias administrado a partir de las plantillas de instancias que creamos antes.

Desde Cloud Shell

gcloud compute instance-groups managed create us-east1-a-mig \
--size=1 \
--template=test-template \
--zone=us-east1-a

Salida

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instanceGroupManagers/us-east1-a-mig].
NAME            LOCATION    SCOPE  BASE_INSTANCE_NAME   SIZE  TARGET_SIZE  INSTANCE_TEMPLATE  AUTOSCALED
us-east1-a-mig  us-east1-a  zone   us-east1-a-mig       0     1            test-template      no

Desde Cloud Shell

gcloud compute instance-groups managed create us-east1-b-mig \
--size=5 \
--template=test-template \
--zone=us-east1-b

Salida

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-b/instanceGroupManagers/us-east1-b-mig].
NAME            LOCATION    SCOPE  BASE_INSTANCE_NAME   SIZE  TARGET_SIZE  INSTANCE_TEMPLATE  AUTOSCALED
us-east1-b-mig  us-east1-b  zone   us-east1-b-mig       0     5            test-template      no

Podemos verificar que nuestros grupos de instancias se crearon correctamente con el siguiente comando de gcloud:

Desde Cloud Shell

gcloud compute instance-groups list

Salida

NAME                  LOCATION      SCOPE   NETWORK         MANAGED INSTANCES
us-east1-a-mig        us-east1-a    zone    httplbs          Yes      1
us-east1-b-mig        us-east1-b    zone    httplbs          Yes      5

Verifica la funcionalidad del servidor web

Cada instancia está configurada para ejecutar un servidor web Apache con una secuencia de comandos PHP simple que renderiza algo como lo siguiente:

Página publicada desde: us-east1-a-mig-ww2h

Para asegurarte de que tus servidores web funcionan correctamente, navega a Compute Engine -> Instancias de VM. Asegúrate de que tus instancias nuevas (p.ej., us-east1-a-mig-xxx) se hayan creado según las definiciones de sus grupos de instancias.

A continuación, realiza una solicitud web en tu navegador para asegurarte de que el servidor web se esté ejecutando (esto puede tardar un minuto en iniciarse). En la página Instancias de VM de Compute Engine, selecciona una instancia creada por tu grupo de instancias y haz clic en su IP externa (pública).

O bien, en tu navegador, navega a http://<IP_Address>

5. Configura el balanceador de cargas

Crea una verificación de estado

Primero, debemos crear una verificación de estado básica para asegurarnos de que nuestros servicios estén en funcionamiento correctamente. Crearemos una verificación de estado básica; hay muchas más personalizaciones avanzadas disponibles.

Desde Cloud Shell

gcloud compute health-checks create http http-basic-check \
    --port 80

Salida

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/healthChecks/http-basic-check].
NAME              PROTOCOL
http-basic-check  HTTP

Cómo reservar una dirección IP externa

Para este paso, deberás reservar una dirección IP estática disponible a nivel global que, más adelante, se conectará al balanceador de cargas.

Desde Cloud Shell

gcloud compute addresses create lb-ipv4-2 \
    --ip-version=IPV4 \
    --global

Salida

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses/lb-ipv4-2].

Asegúrate de anotar la dirección IP que se reservó.

gcloud compute addresses describe lb-ipv4-2 \
    --format="get(address)" \
    --global

Crea servicios de backend

Ahora debemos crear un servicio de backend para los grupos de instancias administrados que creamos antes.

Desde Cloud Shell

gcloud compute backend-services create east-backend-service \
    --load-balancing-scheme=EXTERNAL_MANAGED \
    --protocol=HTTP \
    --port-name=http \
    --health-checks=http-basic-check \
    --global

Salida

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/east-backend-service].
NAME                  BACKENDS  PROTOCOL
east-backend-service            HTTP

Cómo agregar MIG a los servicios de backend

Ahora que creamos los servicios de backend, debemos agregar los grupos de instancias administradas que creamos antes a cada servicio de backend.

Desde Cloud Shell

gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-a-mig --instance-group-zone us-east1-a --global

Desde Cloud Shell

gcloud compute backend-services add-backend east-backend-service --instance-group us-east1-b-mig --instance-group-zone us-east1-b --global

Para verificar que se hayan agregado los backends, ejecuta el siguiente comando.

Desde Cloud Shell

gcloud compute backend-services list

Salida

NAME                  BACKENDS                                                                                               PROTOCOL
east-backend-service  us-east1-a/instanceGroups/us-east1-a-mig,us-east1-b/instanceGroups/us-east1-b-mig  HTTP

Crea un mapa de URL

Ahora crearemos un mapa de URL.

gcloud compute url-maps create web-map-http \
    --default-service=east-backend-service \
    --global

Salida

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http].
NAME          DEFAULT_SERVICE
web-map-http  backendServices/east-backend-service

Crea un frontend de HTTP

El último paso para crear el balanceador de cargas es crear el frontend. Esto asignará la dirección IP que reservaste antes al mapa de URL del balanceador de cargas que creaste.

Desde Cloud Shell

gcloud compute target-http-proxies create http-lb-proxy-adv \
    --url-map=web-map-http

Salida

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/targetHttpProxies/http-lb-proxy-adv].
NAME               URL_MAP
http-lb-proxy-adv  web-map-http

A continuación, debes crear una regla de reenvío global que asignará la dirección IP reservada antes al proxy HTTP.

Desde Cloud Shell

gcloud compute forwarding-rules create http-content-rule \
    --load-balancing-scheme EXTERNAL_MANAGED \
    --address=lb-ipv4-2 \
    --global \
    --target-http-proxy=http-lb-proxy-adv \
    --ports=80

En este punto, puedes confirmar que el balanceador de cargas funciona con la dirección IP que anotaste antes.

6. Verifica que el balanceador de cargas funcione

Para verificar que la función de balanceo de cargas funcione, debes generar algo de carga. Para ello, crearemos una VM nueva para simular la carga.

Crea Siege-vm

Ahora, crearás la siege-vm que usarás para generar carga.

Desde Cloud Shell

gcloud compute instances create siege-vm \
    --network=httplbs \
    --zone=us-east1-a \
    --machine-type=e2-medium \
    --tags=allow-ssh,http-server \
    --metadata=startup-script='sudo apt-get -y install siege'

Salida

Created [https://www.googleapis.com/compute/v1/projects/PROJECT_ID/zones/us-east1-a/instances/siege-vm].
NAME      ZONE             MACHINE_TYPE  PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP   STATUS
siege-vm  us-central1-ir1  e2-medium                  10.132.0.15  34.143.20.68  RUNNING

A continuación, puedes establecer una conexión SSH a la VM que creaste. Una vez que se cree, haz clic en SSH para iniciar una terminal y conectarte.

Una vez establecida la conexión, ejecuta el siguiente comando para generar carga. Usa la dirección IP que reservaste antes para el balanceador de cargas de HTTP externo.

Desde Cloud Shell

siege -c 20 http://$lb-ipv4-2

Salida

New configuration template added to /home/cloudcurriculumdeveloper/.siege
Run siege -C to view the current settings in that file

Cómo verificar la distribución de la carga

Ahora que Siege se está ejecutando, es hora de verificar que el tráfico se distribuya de manera equitativa entre los dos grupos de instancias administrados.

Detén el asedio

Ahora que demostraste que la división avanzada del tráfico funciona, es hora de detener el asedio. Para ello, regresa a la terminal de SSH de siege-vm y presiona CTRL + C para detener el ataque.

7. Configurar la política de Service LB

Crea una política de balanceador de cargas de servicio

Ahora que terminamos la configuración básica, crearemos una política de Service LB y probaremos las funciones avanzadas. A modo de ejemplo, configuraremos el servicio para que use algunos parámetros de configuración avanzados de balanceo de cargas. En este ejemplo, solo crearemos una política para ejercitar la función de desvío de capacidad automática. Pero no dudes en probar otras funciones.

Desde Cloud Shell

gcloud beta network-services service-lb-policies create http-policy \
    --auto-capacity-drain --location=global

Podemos verificar que nuestra política se creó correctamente con el siguiente comando de gcloud:

Desde Cloud Shell

gcloud beta network-services service-lb-policies list --location=global

Salida

NAME
http-policy

Cómo adjuntar la política de balanceador de cargas del servicio al servicio de backend

Ahora adjuntaremos la nueva política a tu servicio de backend existente arriba.

Desde Cloud Shell

gcloud beta compute backend-services update east-backend-service \
    --service-lb-policy=http-policy --global

8. Cómo ajustar el estado del backend

En este punto, se aplicó la nueva política de balanceo de cargas del servicio a tu servicio de backend. Por lo tanto, técnicamente, puedes ir directamente a la limpieza. Sin embargo, como parte del codelab, también realizaremos algunos ajustes adicionales de producción para mostrarte cómo funciona la nueva política.

La función de desvío de capacidad automática quitará automáticamente un MIG de backend del balanceador de cargas cuando la cantidad total de backends en buen estado disminuya por debajo de un umbral (25%). Para probar esta función, estableceremos una conexión SSH a las VMs de us-east1-b-mig y las haremos inoperativas. Con el umbral del 25%, deberás establecer una conexión SSH a cuatro de las VMs y cerrar el servidor Apache.

Para ello, elige cuatro VMs y haz clic en SSH para iniciar una terminal y conectarte. Luego, ejecuta el siguiente comando:

sudo apachectl stop

En este punto, se activará la función de agotamiento de capacidad automática y us-east1-b-mig no recibirá solicitudes nuevas.

9. Verifica que funcione la función Desviación automática de la capacidad

Cómo reiniciar Siege

Para verificar el nuevo atributo, volveremos a reutilizar la VM de Siege. Establezcamos una conexión SSH a la VM que creó en el paso anterior. Una vez que se cree, haz clic en SSH para iniciar una terminal y conectarte.

Una vez establecida la conexión, ejecuta el siguiente comando para generar carga. Usa la dirección IP que reservaste antes para el balanceador de cargas de HTTP externo.

Desde Cloud Shell

siege -c 20 http://$lb-ipv4-2

Salida

New configuration template added to /home/cloudcurriculumdeveloper/.siege
Run siege -C to view the current settings in that file

En este punto, notarás que todas las solicitudes se envían a us-east1-a-mig.

Detén el asedio

Ahora que demostraste que la división avanzada del tráfico funciona, es hora de detener el asedio. Para ello, regresa a la terminal SSH de siege-vm y presiona CTRL + C para detener la ejecución de siege.

10. Pasos de limpieza

Ahora que terminamos con el entorno del lab, es hora de desmantelarlo. Ejecuta los siguientes comandos para borrar el entorno de prueba.

Desde Cloud Shell

gcloud compute instances delete siege-vm --zone=us-east1-a

gcloud compute forwarding-rules delete http-content-rule --global
gcloud compute target-http-proxies delete http-lb-proxy-adv

gcloud compute url-maps delete web-map-http

gcloud compute backend-services delete east-backend-service --global

gcloud compute addresses delete lb-ipv4-2 --global
gcloud compute health-checks delete http-basic-check 

gcloud beta network-services service-lb-policies delete http-policy --location=global

gcloud compute instance-groups managed delete us-east1-a-mig --zone=us-east1-a
gcloud compute instance-groups managed delete us-east1-b-mig --zone=us-east1-b

gcloud compute instance-templates delete test-template 

gcloud compute firewall-rules delete httplb-allow-http-rule
gcloud compute firewall-rules delete fw-allow-ssh

gcloud compute networks delete httplbs 

11. ¡Felicitaciones!

Felicitaciones por completar el codelab.

Temas abordados

  • Crea un balanceador de cargas de aplicaciones externo con la política de balanceador de cargas de servicios.
  • Configura tu servicio de backend con la función de desvío de capacidad automático.

Próximos pasos

  • Prueba otras funciones proporcionadas por la política de Service lb.