Configurer un routage basé sur un en-tête et un paramètre de requête personnalisés pour les équilibreurs de charge HTTP(S) externes globaux (classiques)

Cette page comprend deux exemples pour les équilibreurs de charge HTTP(S) externes globaux (classiques) :

Pour configurer la gestion du trafic pour les équilibreurs de charge HTTP(S) externes globaux et régionaux dotés d'une fonctionnalité de gestion avancée du trafic, consultez les pages suivantes :

Avant de commencer

Configurer le routage basé sur les paramètres de requête

Cet exemple montre comment utiliser des paramètres de requête pour effectuer des tests A/B en fonction de la chaîne de requête.

Ajouter deux groupes d'instances de backend

Pour que le routage soit utile, vous devez disposer de plusieurs backends.

Pour configurer deux backends, vos VM doivent appartenir à deux groupes d'instances. Ce guide explique comment créer des groupes d'instances gérés avec des VM Linux exécutant Apache, ainsi que comment configurer l'équilibrage de charge.

Les groupes d'instances gérés fournissent des machines virtuelles exécutant les serveurs de backend d'un équilibreur de charge HTTP externe. À des fins de démonstration, les backends diffusent leurs propres noms d'hôte.

Pour plus de simplicité, les backends se trouvent dans la même région. Si vous souhaitez une configuration multirégionale, vous devez configurer un modèle d'instance pour la deuxième région.

Console

  1. Accédez à la page Groupes d'instances de Cloud Console.

    Accéder à la page Groupes d'instances

  2. Cliquez sur Créer un groupe d'instances.
  3. Choisissez Nouveau groupe d'instances géré sur la gauche.
  4. Dans le champ Nom, saisissez first-example-ig.
  5. Dans la section Emplacement, sélectionnez Zone unique.
  6. Dans le champ Région, sélectionnez la région de votre choix. Cet exemple utilise us-east1.
  7. Pour la zone, sélectionnez us-east1-b.
  8. Dans la section Modèle d'instance, sélectionnez Créer un modèle d'instance.
  9. Dans le champ Nom, saisissez lb-backend-template.
  10. Assurez-vous que le disque de démarrage est défini sur une image Debian, telle que Debian GNU/Linux 9 (Stretch). Ces instructions utilisent des commandes uniquement disponibles dans Debian, comme apt-get.
  11. Sous Gestion, sécurité, disques, mise en réseau et location unique, dans l'onglet Gestion, insérez le script suivant dans le champ Script de démarrage.

    #! /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
    
  12. Sous Mise en réseau, ajoutez les tags réseau : allow-health-check

  13. Cliquez sur Enregistrer et continuer.

  14. Sous Nombre d'instances, saisissez 2.

  15. Sous Mode autoscaling, sélectionnez Ne pas procéder à un autoscaling.

  16. Cliquez sur Créer pour créer le groupe.

Créez un autre groupe d'instances géré comme celui-ci. Nommez le deuxième élément second-example-ig et basez-le sur le modèle lb-backend-template.

gcloud

  1. Créez le modèle.

    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" \
         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. Créez un groupe d'instances géré basé sur ce modèle.

    gcloud compute instance-groups managed create first-example-ig \
       --template=lb-backend-template --size=2 --zone=us-east1-b
    
  3. Créez un groupe d'instances géré basé sur ce modèle.

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

Configurer une règle de pare-feu

Dans cet exemple, vous créez la règle de pare-feu fw-allow-health-check. Il s'agit d'une règle d'entrée qui autorise le trafic provenant des systèmes de vérification d'état Google Cloud (130.211.0.0/22 et 35.191.0.0/16). Cet exemple utilise le tag cible allow-health-check pour identifier les VM.

Console

  1. Accédez à la page Pare-feu de Google Cloud Console.
    Accéder à la page Pare-feu
  2. Cliquez sur Créer une règle de pare-feu pour créer la deuxième règle de pare-feu :
  3. Saisissez le nom fw-allow-health-check.
  4. Sous Réseau, sélectionnez Default.
  5. Sous Cibles, sélectionnez Tags cibles spécifiés.
  6. Dans le champ Tags cibles, saisissez allow-health-check.
  7. Définissez Filtre source sur Plages IPv4.
  8. Définissez Plages IPv4 sources sur 130.211.0.0/22 et 35.191.0.0/16.
  9. Dans Protocoles et ports, sélectionnez Protocoles et ports spécifiés.
  10. Cochez la case en regard de tcp et saisissez 80 comme numéros de port.
  11. Cliquez sur Créer.

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

Réserver une adresse IP externe

Maintenant que vos instances sont opérationnelles, configurez une adresse IP externe statique globale que vos clients utiliseront pour accéder à votre équilibreur de charge.

Console

  1. Accédez à la page Adresses IP externes de Google Cloud Console.
    Accéder à la page Adresses IP externes
  2. Cliquez sur Réserver une adresse statique pour réserver une adresse IPv4.
  3. Attribuez un Nom à lb-ipv4-1.
  4. Définissez le niveau de réseau sur Standard.
  5. Définissez la Version IP sur IPv4.
  6. Définissez le Type à la valeur Global.
  7. Cliquez sur Réserver.
  8. Assurez-vous que le paramètre Type est bien défini sur Global.
  9. Cliquez sur Réserver.

gcloud

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

Notez l'adresse IPv4 réservée :

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

Configurer des backends d'équilibreur de charge

Console

Cloud Console n'est actuellement pas compatible avec la configuration du routage basé sur les en-têtes et sur les paramètres. Utilisez plutôt gcloud ou l'API.

gcloud

  1. Créez une vérification d'état.
        gcloud compute health-checks create http http-basic-check \
            --port 80
        
  2. Créez le premier service de backend.
    • Pour un équilibreur de charge HTTP(S) externe global (version bêta), utilisez la version beta de la commande de l'outil gcloud et load-balancing-scheme=EXTERNAL_MANAGED. Ce paramètre offre une fonctionnalité de gestion avancée du trafic.
    • Pour un équilibreur de charge HTTP(S) externe global (classique), utilisez 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. Créez le deuxième service 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. Ajoutez votre premier groupe d'instances en tant que backend au premier service 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. Ajoutez votre deuxième groupe d'instances en tant que backend au deuxième service 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
        

Créer le mappage d'URL

Console

Cloud Console n'est actuellement pas compatible avec la configuration du routage basé sur les en-têtes et sur les paramètres. Utilisez plutôt gcloud ou l'API.

gcloud

  1. Créez un fichier YAML /tmp/web-map-http.yaml. Remplacez PROJECT_ID par l'ID de votre projet.

    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: /?foo=bar&ABTest=A&bar=foo
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-a
      expectedOutputUrl: http://example.com/?foo=bar&ABTest=A&bar=foo
    - description: Test routing for query ABTest with B
      host: example.com
      path: /?foo=bar&ABTest=B&bar=foo
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendService/service-b
      expectedOutputUrl: http://example.com/?foo=bar&ABTest=B&bar=foo
    
  2. Validez le mappage d'URL.

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

    Si les tests réussissent et que le résultat de la commande est positif, enregistrez les modifications dans le mappage d'URL.

  3. Mettez à jour le mappage d'URL.

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

Créer le proxy cible et la règle de transfert

Console

Cloud Console n'est actuellement pas compatible avec la configuration du routage basé sur les en-têtes et sur les paramètres. Utilisez plutôt gcloud ou l'API.

gcloud

  1. Créez un proxy HTTP cible pour acheminer les requêtes vers votre mappage d'URL.
        gcloud compute target-http-proxies create http-lb-proxy \
            --url-map web-map-http
        
  2. Créez une règle de transfert globale pour acheminer les requêtes entrantes vers le proxy.
    • Pour un équilibreur de charge HTTP(S) externe global (version bêta), utilisez la version beta de la commande de l'outil gcloud et load-balancing-scheme=EXTERNAL_MANAGED. Ce paramètre offre une fonctionnalité de gestion avancée du trafic.
    • Pour un équilibreur de charge HTTP(S) externe global (classique), utilisez 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
        

Tests

Notez l'adresse IPv4 réservée :

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

Testez cette configuration en exécutant :

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

Dans un navigateur, ouvrez http://IP_ADDRESS?ABTest=A et http://IP_ADDRESS?ABTest=B.

Configurer le routage personnalisé basé sur l'en-tête HTTP

Cet exemple montre comment ajouter et supprimer des en-têtes HTTP personnalisés pour effectuer un routage intelligent.

Avant de commencer

Vous pouvez utiliser un équilibreur de charge HTTP(S) externe existant ou en créer un.

Vous pouvez utiliser cette fonctionnalité avec n'importe quel type de backend compatible. Cet exemple suppose que vous utilisez des VM dans un groupe d'instances.

Pour configurer un équilibreur de charge simple, consultez l'exemple basé sur les paramètres de requête ci-dessus.

Mettre le mappage d'URL à jour

Console

Cloud Console n'est actuellement pas compatible avec la configuration du routage basé sur les en-têtes et sur les paramètres. Utilisez plutôt gcloud ou l'API.

gcloud

  1. Cet exemple montre comment utiliser des en-têtes de requêtes HTTP pour effectuer des tests A/B en fonction des valeurs des en-têtes HTTP de la requête.

    Créez un fichier YAML /tmp/web-map-http.yaml. Remplacez PROJECT_ID par l'ID de votre projet.

    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: foobar
      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: foobar
      path: /
      headers:
      - name: ABTest
        value: B
      service: https://www.googleapis.com/compute/v1/projects/PROJECT_ID/global/backendServices/service-b
    
  2. Validez le mappage d'URL.

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

    Si les tests réussissent et que le résultat de la commande est positif, enregistrez les modifications dans le mappage d'URL.

  3. Mettez à jour le mappage d'URL.

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

Tests

À l'aide de l'adresse IPv4 de l'équilibreur de charge associé, testez cette configuration en exécutant la commande suivante :

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

Étape suivante