Balanceo de cargas de red ponderado por instancia

1. Introducción

Puedes configurar un balanceador de cargas de red para distribuir el tráfico entre las instancias de backend del balanceador de cargas en función de las ponderaciones informadas por una verificación de estado HTTP mediante el balanceo de cargas ponderado.

El balanceo de cargas ponderado requiere que configures lo siguiente:

  • Debes establecer la política del balanceador de cargas de localidad (localityLbPolicy) del servicio de backend en WEIGHTED_MAGLEV.
  • Debes configurar el servicio de backend con una verificación de estado HTTP/HTTP2/HTTPS. Las respuestas de verificación de estado HTTP deben contener un campo de encabezado de respuesta HTTP personalizado X-Load-Balancing-Endpoint-Weight para especificar los pesos con valores de números enteros de 0 a 1,000 en representación decimal para cada instancia de backend.

Si usas el mismo grupo de instancias como backend para varios balanceadores de cargas de red basados en servicios de backend con balanceo de cargas ponderado, se recomienda usar una ruta de solicitud única para cada verificación de estado del servicio de backend. Si deseas obtener más información, consulta Criterios de éxito para las verificaciones de estado HTTP, HTTPS y HTTP/2.

La verificación de estado HTTP debe mostrar una respuesta HTTP 200 (OK) para que las verificaciones de estado se aprueben y la instancia de backend se considere en buen estado. En situaciones en las que todas las instancias de backend pasan sus verificaciones de estado y muestran X-Load-Balancing-Endpoint-Weight con un peso de cero, el balanceador de cargas distribuye conexiones nuevas entre los backends en buen estado y las trata con el mismo peso. El balanceador de cargas también puede distribuir conexiones nuevas entre backends en mal estado. Para obtener más información, consulta Distribución de tráfico.

Para ver ejemplos de balanceo de cargas ponderado, consulta Selección de backend y seguimiento de conexión.

El balanceo de cargas ponderado se puede usar en las siguientes situaciones:

  • Si algunas conexiones procesan más datos que otras, o algunas conexiones duran más que otras, la distribución de la carga del backend puede ser desigual. Cuando se indica un peso más bajo por instancia, una instancia con carga alta puede reducir su cuota de conexiones nuevas, a la vez que mantiene el servicio de las conexiones existentes.
  • Si un backend está sobrecargado y la asignación de más conexiones puede interrumpir las conexiones existentes, dichos backends se asignan cero pesos a sí mismo. Cuando se indica el peso cero, una instancia de backend deja de dar servicio a las conexiones nuevas, pero continúa brindándole el servicio a las existentes.
  • Si un backend vaciando las conexiones existentes antes del mantenimiento, se asigna cero peso. Cuando indica el peso cero, la instancia de backend deja de dar servicio a las conexiones nuevas, pero continúa brindándole el servicio a las existentes.

Qué aprenderás

  • Cómo configurar un balanceador de cargas de red para distribuir el tráfico entre las instancias de backend del balanceador de cargas según las ponderaciones informadas por una verificación de estado HTTP con el balanceo de cargas ponderado.

Configuración del entorno de autoaprendizaje

  1. Accede a Google Cloud Console y crea un proyecto nuevo o reutiliza uno existente. Si aún no tienes una cuenta de Gmail o de Google Workspace, debes crear una.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • El Nombre del proyecto es el nombre visible de los participantes de este proyecto. Es una cadena de caracteres que no se utiliza en las APIs de Google. Puedes actualizarla en cualquier momento.
  • El ID del proyecto es único en todos los proyectos de Google Cloud y es inmutable (no se puede cambiar después de configurarlo). La consola de Cloud genera automáticamente una cadena única. por lo general, no te importa qué es. En la mayoría de los codelabs, deberás hacer referencia al ID del proyecto (por lo general, se identifica como PROJECT_ID). Si no te gusta el ID generado, puedes generar otro aleatorio. También puedes probar el tuyo propio y ver si está disponible. No se puede cambiar después de este paso y se mantendrá mientras dure el proyecto.
  • Para tu información, hay un tercer valor, un número de proyecto que usan algunas APIs. Obtén más información sobre estos tres valores en la documentación.
  1. A continuación, deberás habilitar la facturación en la consola de Cloud para usar las APIs o los recursos de Cloud. Ejecutar este codelab no debería costar mucho, tal vez nada. Para cerrar recursos y evitar que se te facture más allá de este instructivo, puedes borrar los recursos que creaste o borrar todo el proyecto. Los usuarios nuevos de Google Cloud son aptos para participar en el programa Prueba gratuita de USD 300.

Inicia Cloud Shell

Si bien Google Cloud y Spanner se pueden operar de manera remota desde tu laptop, en este codelab usarás Google Cloud Shell, un entorno de línea de comandos que se ejecuta en la nube.

En Google Cloud Console, haz clic en el ícono de Cloud Shell en la barra de herramientas en la parte superior derecha:

55efc1aaa7a4d3ad.png

El aprovisionamiento y la conexión al entorno deberían tomar solo unos minutos. Cuando termine el proceso, debería ver algo como lo siguiente:

7ffe5cbb04455448.png

Esta máquina virtual está cargada con todas las herramientas de desarrollo que necesitarás. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud, lo que permite mejorar considerablemente el rendimiento de la red y la autenticación. Todo tu trabajo en este codelab se puede hacer en un navegador. No es necesario que instales nada.

2. Iniciar configuración

El codelab requiere un solo proyecto.

En este instructivo, crearás un grupo de instancias con tres instancias de VM y asignarás ponderaciones a cada una. Creas una verificación de estado HTTP para informar sobre los pesos de las instancias de backend. El balanceador de cargas de red ponderado está habilitado en el servicio de backend con la política de balanceador de cargas de localidad como WEIGHTED_MAGLEV.

Antes de comenzar

gcloud services enable compute.googleapis.com

Nota: No puedes usar la consola de Google Cloud para configurar la política del balanceador de cargas de localidad y asignar pesos a las instancias de VM. En su lugar, usa Google Cloud CLI.

Crear redes de VPC, subredes y reglas de firewall

Crea una red de VPC, una subred y reglas de firewall de entrada que permitan las conexiones a las VMs de backend de tu balanceador de cargas.

  1. Crear una red de VPC y una subred a. Para crear la red de VPC, ejecuta el comando gcloud compute networks create :
gcloud compute networks create NETWORK_NAME --subnet-mode custom

b. En este ejemplo, el rango principal de direcciones IPv4 de la subred es 10.10.0.0/24.

Para crear la subred, ejecuta el comando gcloud compute networks subnets create :

gcloud compute networks subnets create SUBNET_NAME \
  --network=NETWORK_NAME \
  --range=10.10.0.0/24 \
  --region=us-central1

Reemplaza lo siguiente:

  • NETWORK_NAME: Es el nombre de la red de VPC que se creará.
  • SUBNET_NAME: es el nombre de la subred que se creará.
  1. Crear una regla de firewall de permiso de entrada para permitir que los paquetes enviados a los puertos TCP 80 y 443 de destino se entreguen a las VMs de backend. En este ejemplo, la regla de firewall permite conexiones desde cualquier dirección IP de origen. La regla de firewall se aplica a las VMs con la etiqueta de red network-lb-tag. Para crear la regla de firewall, ejecuta el comando gcloud compute firewall-rules create:
gcloud compute firewall-rules create FIREWALL_RULE_NAME \
   --direction=INGRESS \
   --priority=1000 \
   --network=NETWORK_NAME \
   --action=ALLOW \
   --rules=tcp:80,tcp:443 \
   --source-ranges=0.0.0.0/0 \
   --target-tags=network-lb-tag

Reemplaza FIREWALL_RULE_NAME por el nombre de la regla de firewall que deseas crear.

Crea instancias de VM y asigna ponderaciones

Crea tres instancias de VM y asigna ponderaciones:

  1. Configurar tres instancias de VM de backend para mostrar los pesos en el encabezado X-Load-Balancing-Endpoint-Weight con las respuestas HTTP En este instructivo, configurarás una instancia de backend con el objetivo de informar un peso de cero, una segunda instancia de backend para que informe un peso de 100 y una tercera instancia de backend para informar un peso de 900. Para crear las instancias, ejecuta el comando gcloud compute instances create:
gcloud compute instances create instance-0 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=0,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  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
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-100 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=SUBNET_NAME \
  --metadata=load-balancing-weight=100,startup-script='#! /bin/bash
  apt-get update
  apt-get install apache2 -y
  ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
  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
  lb_weight="$(curl -H "Metadata-Flavor:Google" \
  http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
  echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
  tee /etc/apache2/conf-enabled/headers.conf
  systemctl restart apache2'
gcloud compute instances create instance-900 \
  --zone=us-central1-a \
  --tags=network-lb-tag \
  --image-family=debian-10 \
  --image-project=debian-cloud \
  --subnet=
SUBNET_NAME
\
  --metadata=load-balancing-weight=900,startup-script='#! /bin/bash
    apt-get update
    apt-get install apache2 -y
    ln -sr /etc/apache2/mods-available/headers.load /etc/apache2/mods-enabled/headers.load
    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
    lb_weight="$(curl -H "Metadata-Flavor:Google" \
    http://169.254.169.254/computeMetadata/v1/instance/attributes/load-balancing-weight)"
    echo "Header set X-Load-Balancing-Endpoint-Weight \"$lb_weight\"" | \
    tee /etc/apache2/conf-enabled/headers.conf
    systemctl restart apache2'

Crea un grupo de instancias

En este instructivo, proporcionas instrucciones para crear un grupo de instancias no administrado que contenga las tres instancias de VM(instance-0, instance-100, and instance-900).

gcloud compute instance-groups unmanaged create
INSTANCE_GROUP --zone=us-central1-a
gcloud compute instance-groups unmanaged add-instances INSTANCE_GROUP \
  --zone=us-central1-a \
  --instances=instance-0,instance-100,instance-900

Reemplaza INSTANCE_GROUP por el nombre del grupo de instancias que deseas crear.

Crea una verificación de estado de HTTP

En este instructivo, proporcionas instrucciones para crear una verificación de estado HTTP y leer la respuesta HTTP que contiene el peso de la VM de backend."

gcloud compute health-checks create http HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

Reemplaza HTTP_HEALTH_CHECK_NAME por el nombre de la verificación de estado HTTP que deseas crear.

Crea un servicio de backend

En el siguiente ejemplo, se proporcionan instrucciones para crear un servicio de backend externo regional configurado para usar el balanceo de cargas ponderado.

  1. Crea un servicio de backend con la verificación de estado HTTP y establece la política del balanceador de cargas de localidad en WEIGHTED_MAGLEV.
gcloud compute backend-services create BACKEND_SERVICE_NAME \
  --load-balancing-scheme=external \
  --protocol=tcp \
  --region=us-central1 \
  --health-checks=HTTP_HEALTH_CHECK_NAME \
  --health-checks-region=us-central1 \
  --locality-lb-policy=WEIGHTED_MAGLEV
  • Reemplaza BACKEND_SERVICE_NAME por el nombre del servicio de backend que deseas crear.
  1. Agrega el grupo de instancias al servicio de backend.
gcloud compute backend-services add-backend BACKEND_SERVICE_NAME \
  --instance-group=INSTANCE_GROUP \
  --instance-group-zone=us-central1-a \
  --region=us-central1
  1. Reserva una dirección IP externa regional para el balanceador de cargas.
gcloud compute addresses create ADDRESS_NAME \
 --region us-central1

Reemplaza ADDRESS_NAME por el nombre de la dirección IP que deseas crear. Usa el comando compute addresses describe para ver el resultado. Anota la dirección IP externa estática reservada (‘IP_ADDRESS').

gcloud compute addresses describe ADDRESS_NAME
  1. Crea una regla de reenvío con la dirección IP externa regional reservada “IP_ADDRESS”. Conecta la regla de reenvío al servicio de backend.
gcloud compute forwarding-rules create FORWARDING_RULE \
  --region=us-central1 \
  --ports=80 \
  --address=IP_ADDRESS \
  --backend-service=BACKEND_SERVICE_NAME
  • Reemplaza lo siguiente: FORWARDING_RULE: el nombre de la regla de reenvío que se creará. IP_ADDRESS: es la dirección IP que se asignará a la instancia. Usa la dirección IP externa estática reservada, no el nombre de la dirección.

Verifica los pesos del backend con la API del servicio de backend

Comprueba que las ponderaciones de backends se informen de manera correcta a la verificación de estado HTTP.

gcloud compute backend-services get-health HTTP_HEALTH_CHECK_NAME \
  --region=us-central1

El resultado debería ser como el siguiente:

backend: https://www.googleapis.com/compute/projects/project-name/{project}/zones/us-central1-a/instanceGroups/{instance-group-name}
status:
  healthStatus:
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-0
    ipAddress: 10.10.0.5
    port: 80
    weight: '0'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-100
    ipAddress: 10.10.0.6
    port: 80
    weight: '100'
  - forwardingRule: https://www.googleapis.com/compute/projects/{project}/regions/us-central1/forwardingRules/{firewall-rule-name}
    forwardingRuleIp: 34.135.46.66
    healthState: HEALTHY
    instance: https://www.googleapis.com/compute/projects/{project}/zones/us-central1-a/instances/instance-900
    ipAddress: 10.10.0.7
    port: 80
    weight: '900'
  kind: compute#backendServiceGroupHealth