Configurar el enrutamiento basado en encabezados y parámetros de consulta para el balanceador de carga de aplicaciones clásico

En esta página se incluyen dos ejemplos de balanceadores de carga de aplicación clásicos:

Para configurar la gestión del tráfico del balanceador de carga de aplicación externo global y del balanceador de carga de aplicación externo regional, consulta las siguientes páginas:

Antes de empezar

Configurar el enrutamiento basado en parámetros de consulta

En este ejemplo se muestra cómo usar parámetros de consulta para hacer pruebas A/B buscando coincidencias en la cadena de consulta.

Añade dos grupos de instancias de backend

Para que el enrutamiento sea útil, debe tener varios back-ends.

Para configurar dos backends, tus VMs deben estar en dos grupos de instancias. En esta guía se describe cómo crear grupos de instancias gestionados con VMs Linux que tengan Apache en ejecución y, a continuación, configurar el balanceo de carga.

Los grupos de instancias gestionados proporcionan VMs que ejecutan los servidores backend de un balanceador de carga HTTP externo. Con fines de demostración, los backends sirven sus propios nombres de host.

Para simplificar, los backends se encuentran en la misma región. Si quieres configurar varias regiones, debes tener una plantilla de instancia configurada para la segunda región.

Consola

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

    Ir a Plantillas de instancia

    1. Haz clic en Crear plantilla de instancia.
    2. En Nombre, escribe lb-backend-template.
    3. Asegúrate de que el disco de arranque esté configurado con una imagen de Debian, como Debian GNU/Linux 12 (bookworm). En estas instrucciones se usan comandos que solo están disponibles en Debian, como apt-get.
    4. Haz clic en Advanced options (Opciones avanzadas).
    5. Haz clic en Redes y configura el siguiente campo:
      1. En Etiquetas de red, introduzca allow-health-check.
    6. Haz clic en Gestión. Introduce 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://metadata.google.internal/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
    7. Haz clic en Crear.

  2. Crea un grupo de instancias gestionado. Ve a la página Grupos de instancias de la consola de Google Cloud Google Cloud.

    Ir a Grupos de instancias

    1. Haz clic en Crear grupo de instancias.
    2. Selecciona Nuevo grupo de instancias gestionado (sin reconocimiento del estado). Para obtener más información, consulta Grupos de instancias gestionados con o sin reconocimiento del estado.
    3. En Nombre, escribe first-example-ig.
    4. En Ubicación, selecciona Una sola zona.
    5. En Región, selecciona la que prefieras. En este ejemplo se usa us-east1.
    6. En Zona, selecciona us-east1-b.
    7. En Plantilla de instancia, selecciona la plantilla de instancia lb-backend-template.
    8. En Número máximo de instancias, introduce 2.
    9. En Modo de autoescalado, selecciona Off:do not autoscale.
    10. Haz clic en Crear.

Crea otro grupo de instancias gestionado como este. Asigna el nombre second-example-ig a la segunda y básala en la plantilla lb-backend-template.

gcloud

  1. Crea una plantilla de instancia.

    gcloud compute instance-templates create lb-backend-template \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --image-family=debian-12 \
       --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://metadata.google.internal/computeMetadata/v1/instance/name)"
         echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         systemctl restart apache2'
    
  2. Crea el primer grupo de instancias gestionado a partir de la plantilla.

    gcloud compute instance-groups managed create first-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-b
    
  3. Crea el segundo grupo de instancias gestionado a partir de la plantilla.

    gcloud compute instance-groups managed create second-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-c
    

Configurar una regla de cortafuegos

En este ejemplo, se crea la regla de cortafuegos fw-allow-health-check. Se trata de una regla de entrada que permite el tráfico de los sistemas de comprobación del estado de Google Cloud (130.211.0.0/22 y 35.191.0.0/16). En este ejemplo se usa la etiqueta de destino allow-health-check para identificar las VMs.

Consola

  1. En la Google Cloud consola, ve a la página Políticas de cortafuegos.
    Ve a Políticas de cortafuegos
  2. Haz clic en Crear regla de cortafuegos para crear la segunda regla de cortafuegos:
  3. Asigne un Nombre de fw-allow-health-check.
  4. En Red, selecciona Default.
  5. En Objetivos, seleccione Etiquetas de destino especificadas.
  6. Rellene el campo Etiquetas de destino con allow-health-check.
  7. En Filtro de origen, elija Intervalos de IPv4.
  8. Asigna los valores 130.211.0.0/22 y 35.191.0.0/16 a Intervalos de IPv4 de origen.
  9. En Protocolos y puertos, selecciona Protocolos y puertos especificados.
  10. Marca la casilla TCP e introduce 80 en los números de puerto.
  11. Haz clic en Crear.

gcloud

gcloud compute firewall-rules create fw-allow-health-check \
    --network=default \
    --action=allow \
    --direction=ingress \
    --source-ranges=130.211.0.0/22,35.191.0.0/16 \
    --target-tags=allow-health-check \
    --rules=tcp

Reservar una dirección IP externa

Ahora que tus instancias están en funcionamiento, configura una dirección IP externa estática global que tus clientes usan para llegar a tu balanceador de carga.

Consola

  1. Ve a la página Direcciones IP externas de la Google Cloud consola.
    Ve a la página Direcciones IP externas
  2. Haz clic en Reservar dirección estática para reservar una dirección IPv4.
  3. Asigne un Nombre de lb-ipv4-1.
  4. Configure el nivel de red como Estándar.
  5. Configura IPv4 (versión de IP) como IPv4.
  6. En Tipo, seleccione Global.
  7. Haz clic en Reservar.
  8. Compruebe que el Tipo sea Global.
  9. Haz clic en Reservar.

gcloud

gcloud compute addresses create lb-ipv4-1 \
    --ip-version=IPV4 \
    --network-tier=PREMIUM \
    --global

Anota la dirección IPv4 que se ha reservado:

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

Configurar los backends del balanceador de carga

Consola

Actualmente, la consola Google Cloud no admite la configuración del enrutamiento basado en encabezados y parámetros. En su lugar, usa gcloud o la API.

gcloud

  1. Crea una comprobación del estado.
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. Crea el primer servicio de backend.
    • En el caso de un balanceador de carga de aplicación externo global, usa el comando de gcloud CLI con load-balancing-scheme=EXTERNAL_MANAGED. Este ajuste ofrece funciones avanzadas de gestión del tráfico.
    • En el caso de un balanceador de carga de aplicación clásico, usa load-balancing-scheme=EXTERNAL.
        gcloud compute backend-services create service-a \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  3. Crea el segundo servicio de backend.
        gcloud compute backend-services create service-b \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  4. Añade tu primer grupo de instancias como backend al primer servicio de backend.
        gcloud compute backend-services add-backend service-a \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=first-example-ig \
            --instance-group-zone=us-east1-b \
            --global
        
  5. Añade el segundo grupo de instancias como backend al segundo servicio de backend.
        gcloud compute backend-services add-backend service-b \
            --balancing-mode=UTILIZATION \
            --max-utilization=0.8 \
            --capacity-scaler=1 \
            --instance-group=second-example-ig \
            --instance-group-zone=us-east1-c \
            --global
        

Crear el mapa de URLs

Consola

Actualmente, la consola Google Cloud no admite la configuración del enrutamiento basado en encabezados y parámetros. En su lugar, usa gcloud o la API.

gcloud

  1. Crea un archivo YAML /tmp/web-map-http.yaml. Sustituye PROJECT_ID por el ID de tu proyecto.

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    name: web-map-http
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              queryParameterMatches:
                - name: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    selfLink: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/urlMaps/web-map-http
    tests:
    - description: Test routing for query ABTest with A
      host: example.com
      path: /?ABTest=A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      expectedOutputUrl: http://example.com/?ABTest=A
    - description: Test routing for query ABTest with B
      host: example.com
      path: /?ABTest=B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
      expectedOutputUrl: http://example.com/?ABTest=B
    
  2. Valida el mapa de URLs.

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    Si las pruebas se superan y el comando muestra un mensaje de éxito, guarde los cambios en el mapa de URLs.

  3. Actualiza el mapa de URLs.

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

Crear el proxy de destino y la regla de reenvío

Consola

Actualmente, la consola Google Cloud no admite la configuración del enrutamiento basado en encabezados y parámetros. En su lugar, usa gcloud o la API.

gcloud

  1. Crea un proxy HTTP de destino para enrutar las solicitudes a tu mapa de URLs.
        gcloud compute target-http-proxies create http-lb-proxy \
            --url-map web-map-http
        
  2. Crea una regla de reenvío global para enrutar las solicitudes entrantes al proxy.
    • En el caso de un balanceador de carga de aplicación externo global, usa el comando de gcloud CLI con load-balancing-scheme=EXTERNAL_MANAGED. Este ajuste ofrece funciones avanzadas de gestión del tráfico.
    • En el caso de un balanceador de carga de aplicación clásico, usa load-balancing-scheme=EXTERNAL.
        gcloud compute forwarding-rules create http-content-rule \
            --load-balancing-scheme=LOAD_BALANCING_SCHEME \
            --network-tier=PREMIUM \
            --address=lb-ipv4-1 \
            --global \
            --target-http-proxy=http-lb-proxy \
            --ports=80
        

Pruebas

Anota la dirección IPv4 que se ha reservado:

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

Para probar esta configuración, ejecuta el siguiente comando:

curl http://IP_ADDRESS?ABTest=A
curl http://IP_ADDRESS?ABTest=B

En un navegador, abre http://IP_ADDRESS?ABTest=A y http://IP_ADDRESS?ABTest=B.

Configurar el enrutamiento basado en encabezados HTTP

En este ejemplo se muestra cómo añadir y quitar encabezados HTTP para hacer un enrutamiento inteligente.

Antes de empezar

Puede usar un balanceador de carga de aplicación externo que ya tenga o crear uno.

Puedes usar esta función con cualquiera de los tipos de backend admitidos. En este ejemplo, se presupone que usas VMs en un grupo de instancias.

Para configurar un balanceador de carga sencillo, consulta el ejemplo basado en parámetros de consulta que se muestra más arriba.

Actualizar el mapa de URLs

Consola

Actualmente, la consola Google Cloud no admite la configuración del enrutamiento basado en encabezados y parámetros. En su lugar, usa gcloud o la API.

gcloud

  1. En este ejemplo se muestra cómo usar encabezados de solicitud HTTP para hacer pruebas A/B. Para ello, se comparan los valores de los encabezados HTTP de la solicitud.

    Crea un archivo YAML /tmp/web-map-http.yaml. Sustituye PROJECT_ID por el ID de tu proyecto.

    defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    kind: compute#urlMap
    name: web-map-http
    hostRules:
    - hosts:
      - '*'
      pathMatcher: path-matcher-1
    pathMatchers:
    - defaultService: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      name: path-matcher-1
      routeRules:
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: A
          priority: 0
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
        - matchRules:
            - prefixMatch: /
              headerMatches:
                - headerName: ABTest
                  exactMatch: B
          priority: 1
          service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    tests:
    - description: Test routing for query ABTest with A
      host: example.com
      path: /
      headers:
      - name: ABTest
        value: A
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
    - description: Test routing for query ABTest with B
      host: example.com
      path: /
      headers:
      - name: ABTest
        value: B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    
  2. Valida el mapa de URLs.

    gcloud compute url-maps validate --source /tmp/web-map-http.yaml
    

    Si las pruebas se superan y el comando muestra un mensaje de éxito, guarde los cambios en el mapa de URLs.

  3. Actualiza el mapa de URLs.

    gcloud compute url-maps import web-map-http \
       --source /tmp/web-map-http.yaml \
       --global
    

Pruebas

Con la dirección IPv4 del balanceador de carga asociado, prueba esta configuración ejecutando el siguiente comando:

curl http://IP_ADDRESS -H "ABTest: A"
curl http://IP_ADDRESS -H "ABTest: B"

Siguientes pasos