Configurer un routage basé sur un en-tête et un paramètre de requête pour l'équilibreur de charge d'application classique

Cette page comprend deux exemples pour les équilibreurs de charge d'application classiques:

Pour configurer la gestion du trafic pour l'équilibreur de charge d'application externe global et l'équilibreur de charge d'application externe régional, consultez les pages suivantes:

Avant de commencer

Configurer un 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 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. Créez un modèle d'instance. Dans la console Google Cloud, accédez à la page Modèles d'instances.

    Accéder à la page Modèles d'instances

    1. Cliquez sur Create instance template (Créer un modèle d'instance).
    2. Dans le champ Nom, saisissez lb-backend-template.
    3. Assurez-vous que le disque de démarrage est défini sur une image Debian, telle que Debian GNU/Linux 10 (Buster). Ces instructions utilisent des commandes uniquement disponibles dans Debian, comme apt-get.
    4. Cliquez sur Options avancées.
    5. Cliquez sur Mise en réseau et configurez le champ suivant :
      1. Pour Tags réseau, saisissez allow-health-check.
    6. Cliquez sur Gestion. Saisissez 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://metadata.google.internal/computeMetadata/v1/instance/name)"
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      systemctl restart apache2
      
    7. Cliquez sur Créer.

  2. Créez un groupe d'instances géré. Accédez à la page Groupes d'instances de la console Google Cloud.

    Accéder à la page "Groupes d'instances"

    1. Cliquez sur Créer un groupe d'instances.
    2. Sélectionnez Nouveau groupe d'instances géré (sans état). Pour plus d'informations, consultez la page Groupes d'instances gérés (MIG) sans état ou avec état.
    3. Dans le champ Nom, saisissez first-example-ig.
    4. Pour l'emplacement, sélectionnez Zone unique.
    5. Pour Région, sélectionnez la région de votre choix. Cet exemple utilise us-east1.
    6. Pour Zone, sélectionnez us-east1-b.
    7. Dans la section Modèle d'instance, sélectionnez le modèle d'instance lb-backend-template.
    8. Sous Nombre maximal d'instances, saisissez 2.
    9. Sous Mode autoscaling, sélectionnez Off:do not autoscale.
    10. Cliquez sur Create (Créer).

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 un modèle d'instance.

    gcloud compute instance-templates create `lb-backend-template` \
       --region=us-east1 \
       --network=default \
       --subnet=default \
       --tags=allow-health-check \
       --image-family=debian-10 \
       --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. 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. Dans la console Google Cloud, accédez à la page Règles d'administration.
    Accéder à la page "Stratégies de 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 TCP, puis saisissez 80 pour les 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 sur 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

La console Google Cloud 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 d'application externe global, exécutez la commande gcloud CLI avec load-balancing-scheme=EXTERNAL_MANAGED. Ce paramètre offre une fonctionnalité de gestion avancée du trafic.
    • Pour un équilibreur de charge d'application 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

La console Google Cloud 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: /?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. 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

La console Google Cloud 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 d'application externe global, exécutez la commande gcloud CLI avec load-balancing-scheme=EXTERNAL_MANAGED. Ce paramètre offre une fonctionnalité de gestion avancée du trafic.
    • Pour un équilibreur de charge d'application 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 basé sur l'en-tête HTTP

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

Avant de commencer

Vous pouvez utiliser un équilibreur de charge d'application 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

La console Google Cloud 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: 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. 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