Configura un enrutamiento personalizado basado en encabezados o en parámetros de búsqueda para balanceadores de cargas HTTP(S) externos globales (clásico)

En esta página, se incluyen dos ejemplos de balanceador de cargas de HTTP(S) externo global (clásico):

Si deseas configurar la administración del tráfico para el balanceador de cargas de HTTP(S) externo global con capacidad de administración de tráfico avanzada y un balanceador de cargas de HTTP(S) externo regional con capacidad de administración de tráfico avanzada, consulta las siguientes páginas:

Antes de comenzar

Configura el enrutamiento basado en parámetros de búsqueda

En este ejemplo, se demuestra el uso de parámetros de consulta para hacer pruebas A/B mediante la coincidencia en la string de consulta.

Agrega dos grupos de instancias de backend

Para que el enrutamiento sea útil, debes tener varios backends.

Para configurar dos backends, tus VM deben estar en dos grupos de instancias. En esta guía, se describe cómo crear un grupo de instancias administrado con las VM de Linux en las que se ejecuta Apache y, luego, configurar el balanceo de cargas.

Los grupos de instancias administrados proporcionan VM que ejecutan los servidores de backend de un balanceador de cargas HTTP externo. A modo de demostración, los backends entregan sus propios nombres de host.

Para hacerlo más simple, los backends residen en la misma región. Si deseas una configuración multirregional, debes tener una plantilla de instancias configurada para la segunda región.

Console

  1. Cree una plantilla de instancias. En la consola de Cloud, ve a la página Plantillas de instancias.

    Ir a Plantillas de instancia

    1. Haga clic en Crear plantilla de instancias.
    2. En Nombre, ingresa lb-backend-template.
    3. Asegúrate de que el disco de arranque esté configurado como una imagen de Debian, como Debian GNU/Linux 9 (stretch). En estas instrucciones, se usan comandos que solo están disponibles en Debian, como apt-get.
    4. En Administración, seguridad, discos, herramientas de redes, usuario único, en la pestaña Administración, inserta la siguiente secuencia de comandos en el campo Secuencia de comandos de inicio.

      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo a2ensite default-ssl
      sudo a2enmod ssl
      sudo vm_hostname="$(curl -H "Metadata-Flavor:Google" \
      http://169.254.169.254/computeMetadata/v1/instance/name)"
      sudo echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      sudo systemctl restart apache2
      
    5. En la pestaña Herramientas de redes, agrega las siguientes etiquetas de red: allow-health-check

    6. Haga clic en Crear.

  2. Cree un grupo de instancias administrado. Ve a la página Grupos de instancias en Cloud Console.

    Ir a Grupos de instancias

    1. Haga clic en Crear grupo de instancias.
    2. Selecciona Nuevo grupo de instancias administrado (sin estado). Para obtener más información, consulta MIG sin estado o con estado.
    3. En Nombre, ingresa first-example-ig.
    4. En Ubicación, selecciona Zona única.
    5. En Región, selecciona tu región preferida. En este ejemplo, se usa us-east1.
    6. En Zona, selecciona us-east1-b.
    7. En Plantilla de instancias, selecciona la plantilla de instancias lb-backend-template.
    8. En Cantidad máxima de instancias, ingresa 2.
    9. En Modo de ajuste de escala automático, selecciona Off:do not autoscale.
    10. Haga clic en Crear.

Crea otro grupo de instancias administrado como este. Nombra la segunda second-example-ig y usa la plantilla lb-backend-template como base.

gcloud

  1. Cree una plantilla de instancias.

    gcloud compute instance-templates create `lb-backend-template` \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --image-family=debian-9 \
       --image-project=debian-cloud \
       --metadata=startup-script='#! /bin/bash
         sudo apt-get update
         sudo apt-get install apache2 -y
         sudo a2ensite default-ssl
         sudo a2enmod ssl
         sudo vm_hostname="$(curl -H "Metadata-Flavor:Google" \
         http://169.254.169.254/computeMetadata/v1/instance/name)"
         sudo echo "Page served from: $vm_hostname" | \
         tee /var/www/html/index.html
         sudo systemctl restart apache2'
    
  2. Crea el primer grupo de instancias administrado en función 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 administrado en función de la plantilla.

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

Configura una regla de firewall

En este ejemplo, se crea la regla de firewall fw-allow-health-check. Esta es una regla de entrada que permite el tráfico de los sistemas de verificación de estado de Google Cloud (130.211.0.0/2235.191.0.0/16). En este ejemplo, se usa la etiqueta de destino allow-health-check para identificar las VM.

Console

  1. Ve a la página Firewalls en la consola de Google Cloud.
    Ir a la página Firewalls
  2. Haz clic en Crear regla de firewall para crear la segunda regla de firewall:
  3. Ingresa un Nombre de fw-allow-health-check.
  4. En Red selecciona Default.
  5. En Destinos, selecciona Etiquetas de destino especificadas.
  6. Propaga el campo Etiquetas de destino con allow-health-check.
  7. Configura Filtro de fuente como Rangos de IPv4.
  8. Establece Rangos de IPv4 de origen en 130.211.0.0/2235.191.0.0/16.
  9. En Protocolos y puertos, selecciona Protocolos y puertos especificados.
  10. Selecciona la casilla de verificación junto a tcp y escribe 80 para el número 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

Reserva una dirección IP externa

Ahora que tus instancias están en funcionamiento, configura una dirección IP externa, estática y global que tus clientes usarán para llegar al balanceador de cargas.

Console

  1. Ve a la página Direcciones IP externas en la consola de Google Cloud.
    Ir a la página Direcciones IP externas
  2. Haz clic en Reservar dirección estática para reservar una dirección IPv4.
  3. Asigna un Nombre de lb-ipv4-1.
  4. Establece el nivel de red en Estándar.
  5. Configura la Versión de IP como IPv4.
  6. Configura el Tipo como Global.
  7. Haz clic en Reservar.
  8. Asegúrate de que el Tipo esté configurado como Global.
  9. Haz clic en Reservar.

gcloud

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

Préstale atención a la dirección IPv4 que estaba reservada:

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

Configura los backends del balanceador de cargas

Console

Por el momento, Cloud Console no es compatible con la configuración del enrutamiento basado en encabezados y parámetros. En su lugar, usa gcloud o la API.

gcloud

  1. Crea una verificación de estado.
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. Crea el primer servicio de backend.
    • Para un balanceador de cargas de HTTP(S) externo global, usa el comando de la CLI de gcloud con load-balancing-scheme=EXTERNAL_MANAGED. Esta configuración ofrece capacidad avanzada de administración de tráfico.
    • Para un balanceador de cargas HTTP(S) externo global (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. Agrega tu primer grupo de instancias como backend del 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. Agrega tu segundo grupo de instancias como backend del 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
        

Crea el mapa de URL

Console

Por el momento, Cloud Console no es compatible con 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. Reemplaza PROJECT_ID por el ID del 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/backendService/service-b
      expectedOutputUrl: http://example.com/?ABTest=B
    
  2. Valida el mapa de URL.

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

    Si las pruebas pasan y el comando genera un mensaje de éxito, guarda los cambios en el mapa de URL.

  3. Actualiza el mapa de URL.

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

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

Console

Por el momento, Cloud Console no es compatible con 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 URL.
        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 de contenido nuevo al proxy.
    • Para un balanceador de cargas de HTTP(S) externo global, usa el comando de la CLI de gcloud con load-balancing-scheme=EXTERNAL_MANAGED. Esta configuración ofrece capacidad avanzada de administración de tráfico.
    • Para un balanceador de cargas HTTP(S) externo global (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
        

Prueba

Préstale atención a la dirección IPv4 que se reservó:

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

Ejecuta el siguiente comando para probar esta configuración:

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.

Configura el enrutamiento basado en encabezados HTTP personalizados

En este ejemplo, se muestra cómo agregar y quitar encabezados HTTP personalizados para realizar un enrutamiento inteligente.

Antes de comenzar

Puedes usar un balanceador de cargas HTTP(S) existente o crear uno nuevo.

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

Para configurar un balanceador de cargas simple, revisa el ejemplo anterior basado en parámetros de consulta.

Actualiza el mapa de URL

Console

Por el momento, Cloud Console no es compatible con 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 demuestra el uso de encabezados de solicitud HTTP para hacer pruebas A/B mediante la coincidencia de valores en los encabezados HTTP de la solicitud.

    Crea un archivo YAML /tmp/web-map-http.yaml. Reemplaza PROJECT_ID por el ID del 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 URL.

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

    Si las pruebas pasan y el comando genera un mensaje de éxito, guarda los cambios en el mapa de URL.

  3. Actualiza el mapa de URL.

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

Prueba

Con la dirección IPv4 del balanceador de cargas asociado, ejecuta el siguiente comando para probar esta configuración:

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

¿Qué sigue?