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

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 grupos de instancias administrados con VM de Linux que ejecutan 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 simplificar, los backends residen en la misma región. Si deseas una configuración multirregional, debes tener una configuración de plantilla de instancias para la segunda región.

Console

  1. En Cloud Console, ve a la página Grupos de instancias.

    Ir a la página Grupos de instancias

  2. Haz clic en Crear grupo de instancias.
  3. Selecciona Nuevo grupo de instancias administrado a la izquierda.
  4. En Nombre, ingresa first-example-ig.
  5. En Ubicación, selecciona Zona única.
  6. En Región, selecciona la región que prefieras. En este ejemplo, se usa us-east1.
  7. En Zona, selecciona us-east1-b.
  8. En Plantilla de instancias, selecciona Crear una nueva plantilla de instancias.
  9. En Nombre, ingresa lb-backend-template.
  10. Asegúrate de que el disco de arranque esté configurado en 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.
  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" \
    # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying
    http://169.254.169.254/computeMetadata/v1/instance/name)"
    echo "Page served from: $vm_hostname" | \
    tee /var/www/html/index.html
    
  12. En Herramientas de redes, agrega la etiqueta de red: allow-health-check.

  13. Haz clic en Guardar y continuar.

  14. En Cantidad de instancias, ingresa 2.

  15. En Modo de ajuste de escala automático, selecciona Sin ajuste de escala automático.

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

Crea otro grupo de instancias administrado como este. Asígnale el nombre second-example-ig y toma la plantilla lb-backend-template como base.

gcloud

  1. Crea la plantilla.

    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
         apt-get update
         apt-get install apache2 -y
         a2ensite default-ssl
         a2enmod ssl
         vm_hostname="$(curl -H "Metadata-Flavor:Google" \
         # See https://cloud.google.com/compute/docs/storing-retrieving-metadata#querying
         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 el primer grupo de instancias administrado basado en 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 basado en 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/22 y 35.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 Google Cloud Console.
    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. Establece Filtro de fuente como IP ranges.
  8. Configura Rangos de IP de origen como 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. Haga 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 global que tus clientes utilicen para llegar a tu balanceador de cargas.

Console

  1. Ve a la página Direcciones IP externas en Google Cloud Console.
    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 \
    --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.
        gcloud compute backend-services create service-a \
            --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 \
            --global-health-checks \
            --protocol HTTP \
            --health-checks http-basic-check \
            --global
        
  4. Agrega 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. Agrega tu 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
        

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 y asegúrate de sustituir [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
    
  2. 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 entrantes al proxy.
        gcloud compute forwarding-rules create http-content-rule \
            --address=lb-ipv4-1\
            --global \
            --target-http-proxy=http-lb-proxy \
            --ports=80
        

Prueba

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

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, consulta el ejemplo basado en el parámetro de consulta anterior.

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. Crea un archivo YAML /tmp/web-map-http.yaml.

    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.

    defaultService: $[DEFAULT_SERVICE_URL]
    kind: compute#urlMap
    name: web-map-http
    hostRules:
    - hosts:
      - '*'
      pathMatcher: matcher1
    pathMatchers:
    - defaultService: $[DEFAULT_SERVICE_URL]
      name: matcher1
      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
    
  2. Actualiza el mapa de URL.

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