Configura el balanceo de cargas de HTTP(S) interno para las VM de Compute Engine

En este documento, se proporcionan instrucciones para configurar el balanceo de cargas HTTP(S) interno para los servicios que se ejecutan en las VM de Compute Engine.

Antes de comenzar

Antes de seguir las instrucciones de esta guía, revisa los siguientes documentos:

Configura el balanceo de cargas HTTP(S) interno con un servicio basado en VM

En esta sección, se muestra la configuración requerida para los servicios que se ejecutan en las VM de Compute Engine. Las VM de cliente se conectan con la dirección IP y el puerto que configuras en la regla de reenvío. Cuando las aplicaciones cliente envían tráfico a esta dirección IP y al puerto, sus solicitudes se reenvían a tus máquinas virtuales (VM) de backend según el mapa de URL del balanceador de cargas HTTP(S) interno.

El ejemplo en esta página configura de manera explícita una dirección IP interna reservada para la regla de reenvío del balanceador de cargas HTTP(S) interno, en lugar de permitir que se asigne una dirección IP interna efímera. Recomendamos reservar direcciones IP para las reglas de reenvío.

Crea un grupo de instancias administrado

En esta sección, se muestra cómo crear una plantilla y un grupo de instancias administrado. El grupo de instancias administrado proporciona instancias de VM que ejecutan los servidores de backend de un balanceador de cargas HTTP(S) interno de ejemplo. Las cargas del tráfico de los clientes se balancean a estos servidores de backend. A modo de demostración, los backends entregan sus propios nombres de host.

Console

  1. Ve a la página Grupos de instancias en GCP Console.

    Ir a la página Grupos de instancias

  2. Haz clic en Crear un grupo de instancias.
  3. Selecciona Grupo de instancias administrado nuevo a la izquierda.
  4. Para Nombre, ingresa l7-ilb-backend-example.
  5. En Ubicación, selecciona Zona única.
  6. Para la Región, selecciona us-west1.
  7. Para la Zona, selecciona us-west1-a.
  8. En Plantilla de instancias, selecciona Crear otra plantilla de instancias.
  9. Para Nombre, ingresa l7-ilb-backend-template.
  10. Asegúrate de que el disco de arranque esté configurado en una imagen de Debian, como Debian GNU/Linux 9 (Stretch). Estas instrucciones usan comandos que solo están disponibles en Debian, como apt-get.
  11. En Administración, seguridad, discos, herramientas de redes, instancia única, en la pestaña Administración, inserta la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio.

    #! /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'
    
  12. En Administración, seguridad, discos, herramientas de redes, instancia única, haz clic en la pestaña Herramientas de redes.

  13. Para la Red, selecciona lb-network y para la Subred, selecciona backend-subnet.

  14. Agrega las siguientes etiquetas de red: allow-ssh y load-balanced-backend.

  15. Haz clic en Guardar y continuar.

  16. Especifica la cantidad de instancias que quieres crear en el grupo. De manera opcional, en la sección de Ajuste de escala automático de la IU, puedes configurar el grupo de instancias para que agregue o quite instancias automáticamente en función del uso de CPU de la instancia.

  17. Haz clic en Crear para crear el grupo de instancias nuevo.

gcloud

  1. Crea una plantilla de instancias de VM con el servidor HTTP con el comando gcloud compute instance-templates create.

    gcloud compute instance-templates create l7-ilb-backend-template \
    --region=us-west1 \
    --network=lb-network \
    --subnet=backend-subnet \
    --tags=allow-ssh,load-balanced-backend \
    --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'
    
  2. Crea un grupo de instancias administrado en la zona con el comando gcloud compute instance-groups managed create.

    gcloud compute instance-groups managed create l7-ilb-backend-example \
        --zone=us-west1-a \
        --size=2 \
        --template=l7-ilb-backend-template
    

api

Crea la plantilla de instancias con el método instanceTemplates.insert, mediante el reemplazo de [project-id] con tu ID del proyecto.

POST https://www.googleapis.com/compute/v1/projects/[project-id]/global/instanceTemplates
{
  "name":"l7-ilb-backend-template",
  "properties":{
     "machineType":"n1-standard-1",
     "tags":{
        "items":[
           "allow-ssh",
           "load-balanced-backend"
        ]
     },
     "metadata":{
        "kind":"compute#metadata",
        "items":[
          {
              "key":"startup-script",
              "value":"#! /bin/bash\napt-get update\napt-get install apache2 -y\na2ensite default-ssl\na2enmod ssl\nvm_hostname=\"$(curl -H \"Metadata-Flavor:Google\" \\\nhttp://169.254.169.254/computeMetadata/v1/instance/name)\"\necho \"Page served from: $vm_hostname\" | \\\ntee /var/www/html/index.html\nsystemctl restart apache2"
          }
        ]
     },
     "networkInterfaces":[
       {
           "kind":"compute#networkInterface",
           "network":"projects/[project-id]/global/networks/lb-network",
           "subnetwork":"regions/us-west1/subnetworks/backend-subnet",
           "accessConfigs":[
             {
                 "kind":"compute#accessConfig",
                 "type":"ONE_TO_ONE_NAT"
             }
           ]
       }
     ],
     "disks":[
       {
           "kind":"compute#attachedDisk",
           "index":0,
           "boot":true,
           "initializeParams":{
              "sourceImage":"projects/debian-cloud/global/images/family/debian-9"
           },
           "autoDelete":true
       }
     ]
  }
}

Crea un grupo de instancias administrado en cada zona con el método instanceGroupManagers.insert, mediante el reemplazo de [project-id] con tu ID del proyecto.

POST https://www.googleapis.com/compute/v1/projects/[project-id]/zones/{zone}/instanceGroupManagers
{
  "name": "l7-ilb-backend-example",
  "zone": "projects/[project-id]/zones/us-west1-a",
  "instanceTemplate": "projects/[project-id]/global/instanceTemplates/l7-ilb-backend-template",
  "baseInstanceName": "l7-ilb-vm",
  "targetSize": 2
}

Configura el balanceador de cargas

El ejemplo muestra las siguientes tareas de configuración del balanceador de cargas HTTP(S) interno:

  • Definir la verificación de estado de HTTP
  • Definir el servicio de backend
  • Agregar un grupo de instancias administrado a un servicio de backend
  • Crear un mapa de URL
    • Asegúrate de hacer referencia a un mapa de URL regional si se define una región para el proxy HTTP(S) de destino. Un mapa de URL regional enruta las solicitudes a un servicio de backend regional en función de las reglas que defines para el host y la ruta de acceso de una URL entrante. Solo se puede hacer referencia a un mapa de URL regional mediante una regla regional de proxy de destino en la misma región.
  • Crear un proxy de destino
  • Crear una regla de reenvío

Console

Selecciona un tipo de balanceador de cargas

  1. Ve a la página Balanceo de cargas de Google Cloud Platform Console.
    Ir a la página Balanceo de cargas
  2. Haz clic en Crear balanceador de cargas.
  3. En Balanceo de cargas de HTTP(S), haz clic en Iniciar configuración.
  4. Selecciona Solo entre mis VM. Esta configuración indica que el balanceador de cargas es interno.
  5. Haz clic en Continuar.

Prepara el balanceador de cargas

  1. Para el Nombre del balanceador de cargas, ingresa l7-ilb-map.
  2. Asegúrate de que el Protocolo sea HTTP.
  3. Para la Región, selecciona us-west1.
  4. Para la Red de VPC, selecciona lb-network.
  5. Mantén la ventana abierta para continuar.

Reserva una subred de solo proxy

Para el balanceo de cargas interno HTTP(S), reserva una subred de proxy:

  1. Haz clic en Reservar una subred.
  2. Para Nombre, ingresa proxy-subnet.
  3. Para la Red, selecciona lb-network.
  4. Para la Región, selecciona us-west1.
  5. Para el Rango de direcciones IP, ingresa 10.129.0.0/26.
  6. Haz clic en Agregar.

Configura el servicio de backend

  1. Haz clic en Configuración de backend.
  2. En el menú Crear o seleccionar servicios de backend, selecciona Crear un servicio de backend.
  3. Configura el Nombre del servicio de backend en l7-ilb-backend-service.
  4. Configura el Tipo de backend en grupos de instancias.
  5. En la tarjeta de Backend nuevo de la sección Backends, sigue estos pasos:
    1. Configura el Grupo de instancias en l7-ilb-backend-example.
    2. Configura los Números de puerto en 80.
    3. Configura el Modo de balanceo en UTILIZACIÓN.
    4. Haz clic en Listo.
  6. En la sección Verificación de estado, elige Crea una verificación de estado con los parámetros siguientes:
    1. Nombre: l7-ilb-basic-check
    2. Protocolo: HTTP
    3. Puerto: 80
    4. Haz clic en Guardar y continuar.
  7. Haz clic en Crear.

Configura el mapa de URL

  1. Haz clic en Reglas de host y ruta de acceso. Asegúrate de que l7-ilb-backend-service sea el único servicio de backend para cualquier host y ruta de acceso no coincidentes.

Configura los componentes del frontend

  1. Haz clic en Configuración de frontend y edita la sección IP y puerto de frontend nuevos.
  2. Configura el Nombre en l7-ilb-forwarding-rule.
  3. Configura el Protocolo en HTTP.
  4. Configura la Subred en backend-subred.
  5. Selecciona Reservar una dirección IP interna estática en el botón emergente IP interna.
  6. En el panel que aparece, proporciona los detalles siguientes:
    1. Nombre: l7-ilb-ip
    2. En la sección Dirección IP estática, selecciona Permitirme elegir.
    3. En la sección Dirección IP personalizada, ingresa 10.1.2.99.
    4. Haz clic en Reservar.
  7. Configura el Puerto en 80.
  8. Haz clic en Listo.

Completa la configuración

  1. Haz clic en Crear.

gcloud

  1. Define la verificación de estado de HTTP con el comando gcloud compute health-check create http.

    gcloud beta compute health-checks create http l7-ilb-basic-check \
    --region=us-west1 \
    --use-serving-port
    
  2. Define el servicio de backend con el comando gcloud compute backend-services create.

    gcloud beta compute backend-services create l7-ilb-backend-service \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --protocol=HTTP \
    --health-checks=l7-ilb-basic-check \
    --health-checks-region=us-west1 \
    --region=us-west1
    
  3. Agrega backends al servicio de backend con el comando gcloud compute backend-services add-backend.

    gcloud beta compute backend-services add-backend l7-ilb-backend-service \
    --balancing-mode=UTILIZATION \
    --instance-group=l7-ilb-backend-example \
    --instance-group-zone=us-west1-a \
    --region=us-west1
    
  4. Crea el mapa de URL con el comando gcloud compute url-maps create.

    gcloud beta compute url-maps create l7-ilb-map \
    --default-service=l7-ilb-backend-service \
    --region=us-west1
    
  5. Crea el proxy de destino con el comando gcloud compute target-http-proxies create.

    gcloud beta compute target-http-proxies create l7-ilb-proxy \
    --url-map=l7-ilb-map \
    --url-map-region=us-west1 \
    --region=us-west1
    
  6. Crea la regla de reenvío con el comando gcloud compute forwarding-rules create.

    Para redes personalizadas, debes hacer referencia a la subred en la regla de reenvío. Ten en cuenta que esta es la subred de VM, no la subred de proxy.

    gcloud beta compute forwarding-rules create l7-ilb-forwarding-rule \
    --load-balancing-scheme=INTERNAL_MANAGED \
    --network=lb-network \
    --subnet=backend-subnet \
    --address=10.1.2.99 \
    --ports=80 \
    --region=us-west1 \
    --target-http-proxy=l7-ilb-proxy \
    --target-http-proxy-region=us-west1
    

api

Crea la verificación de estado mediante una solicitud POST al método healthChecks.insert, y reemplaza [project-id] con tu ID del proyecto.

POST https://www.googleapis.com/compute/beta/projects/[project-id]/global/healthChecks
{
  "name": "l7-ilb-basic-check",
  "type": "HTTP",
  "httpHealthCheck": {
    "portSpecification": "USE_SERVING_PORT"
  }
}

Crea el servicio de backend regional mediante una solicitud POST al método regionBackendServices.insert y reemplaza [project-id] con tu ID del proyecto.

POST https://www.googleapis.com/compute/beta/projects/[project-id]/regions/us-west1/backendServices
{
  "name": "l7-ilb-backend-service",
  "backends": [
    {
      "group": "projects/[project-id]/zones/us-west1-a/instanceGroups/ig-a",
      "balancingMode": "UTILIZATION"
    }
  ],
  "healthChecks": [
    "projects/[project-id]/global/healthChecks/l7-ilb-basic-check"
  ],
  "loadBalancingScheme": "INTERNAL_MANAGED"
}

Crea el mapa de URL mediante una solicitud POST al método urlMap.insert y reemplaza [project-id] con tu ID del proyecto.

POST https://www.googleapis.com/compute/beta/projects/[project-id]/global/urlMaps
{
  "name": "l7-ilb-map",
  "defaultService": "projects/[project-id]/regions/us-west1/backendServices/l7-ilb-backend-service"
}

Crea el proxy HTTP de destino mediante una solicitud POST al método targetHttpProxies.insert y reemplaza [project-id] con tu ID del proyecto.

POST https://www.googleapis.com/compute/beta/projects/[project-id]/regions/us-west1/targetHttpProxy
{
  "name": "l7-ilb-proxy",
  "urlMap": "projects/[project-id]/global/urlMaps/l7-ilb-map",
  "region": "us-west1"
}

Crea la regla de reenvío mediante una solicitud POST al método forwardingRules.insert y reemplaza [project-id] con tu ID del proyecto.

POST https://www.googleapis.com/compute/beta/projects/[project-id]/regions/us-west1/forwardingRules
{
  "name": "l7-ilb-forwarding-rule",
  "IPAddress": "10.1.2.99",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "projects/[project-id]/regions/us-west1/targetHttpProxies/l7-ilb-proxy",
  "loadBalancingScheme": "INTERNAL_MANAGED",
  "subnetwork": "projects/[project-id]/regions/us-west1/subnetworks/backend-subnet",
  "network": "projects/[project-id]/global/networks/lb-network",
  "networkTier": "PREMIUM",
}

Prueba

Crea una instancia de VM para probar la conectividad

gcloud compute instances create l7-ilb-client-us-west1-a \
    --image-family=debian-9 \
    --image-project=debian-cloud \
    --network=lb-network \
    --subnet=backend-subnet \
    --zone=us-west1-a \
    --tags=allow-ssh

Prueba el balanceador de cargas

Accede a la instancia que acabas de crear y prueba que los servicios HTTP(S) en los backends sean accesibles a través de la dirección IP de la regla de reenvío del balanceador de cargas HTTP(S) interno y que las cargas del tráfico se balanceen en las instancias de backend.

Conecta mediante SSH a cada instancia de cliente

gcloud compute ssh l7-ilb-client-us-west1-a \
    --zone=us-west1-a

Verifica que la IP entregue su nombre de host

curl 10.1.2.99

Ejecuta 100 solicitudes y confirma que tengan balanceo de cargas

for LB_IP in 10.1.2.99; do
    RESULTS=
    for i in {1..100}; do RESULTS="$RESULTS:`curl 10.1.2.99`"; done >/dev/null 2>&1
    IFS=':'
    echo "***"
    echo "*** Results of load-balancing to 10.1.2.99: "
    echo "***"
    echo "$RESULTS" | tr ':' '\n' | grep -Ev "^$" | sort | uniq -c
    echo
done

Pasos siguientes

¿Te ha resultado útil esta página? Enviar comentarios:

Enviar comentarios sobre...