Configurer l'équilibrage de charge TCP/UDP interne avec des NEG zonaux

Ce guide explique comment déployer un équilibreur de charge TCP/UDP interne avec des backends de groupes de points de terminaison du réseau (NEG) zonaux. Les NEG zonaux sont des ressources zonales qui représentent des collections d'adresses IP ou de combinaisons adresses IP/port pour les ressources Google Cloud faisant partie d'un même sous-réseau. Les NEG vous permettent de créer des regroupements logiques d'adresses IP ou de combinaisons d'adresses IP et de ports représentant des services logiciels plutôt que des VM entières.

Avant de suivre ce guide, familiarisez-vous avec les points suivants :

L'équilibrage de charge TCP/UDP interne n'accepte que les NEG zonaux avec les points de terminaison GCE_VM_IP.

Autorisations

Pour suivre ce guide, vous devez créer des instances et modifier un réseau dans un projet. Vous devez être propriétaire ou éditeur du projet, ou disposer de tous les rôles IAM Compute Engine suivants :

Tâche Rôle requis
Créer des réseaux, des sous-réseaux et des composants de l'équilibreur de charge Administrateur réseau
Ajouter et supprimer des règles de pare-feu Administrateur de sécurité
Créer des instances Administrateur d'instances Compute

Pour en savoir plus, consultez les guides suivants :

Vue d'ensemble de la configuration

Ce guide vous explique comment configurer et tester un équilibreur de charge TCP/UDP interne avec des backends de NEG zonaux GCE_VM_IP. Les étapes de cette section décrivent comment configurer les éléments suivants :

  1. Un exemple de réseau VPC appelé lb-network avec un sous-réseau personnalisé
  2. Des règles de pare-feu autorisant les connexions entrantes aux VM de backend
  3. Quatre VM :
    • VM vm-a1 et vm-a2 dans la zone us-west1-a
    • VM vm-c1 et vm-c2 dans la zone us-west1-c
  4. Deux NEG zonaux de backend, neg-a dans la zone us-west1-a et neg-c dans la zone us-west1-c. Chaque NEG possède les points de terminaison suivants :
    • neg-a contient les deux points de terminaison suivants :
      • Adresse IP interne de la VM vm-a1
      • Adresse IP interne de la VM vm-a2
    • neg-c contient les deux points de terminaison suivants :
      • Adresse IP interne de la VM vm-c1
      • Adresse IP interne de la VM vm-c2
  5. VM cliente (vm-client) dans us-west1-a pour tester les connexions
  6. Les composants de l'équilibreur de charge TCP/UDP interne suivants :
    • Un service de backend interne dans la région us-west1 pour gérer la distribution des connexions vers les deux NEG zonaux
    • Règle de transfert interne et adresse IP interne pour l'interface de l'équilibreur de charge

L'architecture de cet exemple se présente comme suit :

Configuration de l'équilibrage de charge TCP/UDP interne avec des NEG zonaux
Configuration de l'équilibrage de charge TCP/UDP interne avec des NEG zonaux

Configurer un réseau, une région et un sous-réseau

L'exemple d'équilibreur de charge TCP/UDP interne décrit sur cette page est créé dans un réseau VPC en mode personnalisé nommé lb-network.

Les VM de backend, les NEG zonaux et les composants de l'équilibreur de charge de cet exemple sont situés dans cette région et ce sous-réseau :

  • Région : us-west1
  • Sous-réseau : lb-subnet, avec plage d'adresses IP principale 10.1.2.0/24

Pour créer les exemples de réseau et de sous-réseaux, procédez comme suit :

Console

  1. Accédez à la page Réseaux VPC dans Google Cloud Console.
    Accéder à la page "Réseaux VPC"
  2. Cliquez sur Créer un réseau VPC.
  3. Saisissez le nom lb-network.
  4. Dans la section Sous-réseaux :
    • Définissez Mode de création du sous-réseau sur Personnalisé.
    • Dans la section Nouveau sous-réseau, saisissez les informations suivantes :
      • Nom : lb-subnet
      • Région : us-west1
      • Plage d'adresses IP : 10.1.2.0/24
      • Cliquez sur OK.
  5. Cliquez sur Créer.

gcloud

  1. Créez le réseau VPC personnalisé :

    gcloud compute networks create lb-network --subnet-mode=custom
    
    1. Dans le réseau lb-network, créez un sous-réseau pour les VM de backend dans la région us-west1 :
    gcloud compute networks subnets create lb-subnet \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

Configurer les règles de pare-feu

Cet exemple utilise les règles de pare-feu suivantes :

  • fw-allow-lb-access : règle d'entrée applicable à toutes les cibles du réseau VPC, autorisant tout le trafic provenant de sources comprises dans la plage 10.1.2.0/24. Cette règle autorise le trafic entrant depuis n'importe quel client situé dans lb-subnet.

  • fw-allow-ssh : règle d'entrée, applicable aux instances faisant l'objet d'un équilibrage de charge, qui autorise la connectivité SSH entrante sur le port TCP 22 à partir de n'importe quelle adresse. Vous pouvez choisir une plage d'adresses IP source plus restrictive pour cette règle. Par exemple, vous pouvez spécifier uniquement les plages d'adresses IP du système à partir duquel vous prévoyez de lancer des sessions SSH. Cet exemple utilise le tag cible allow-ssh pour identifier les VM auxquelles la règle doit s'appliquer.

Sans ces règles de pare-feu, la règle d'entrée interdite par défaut bloque le trafic entrant vers les instances backend.

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 et saisissez les informations suivantes pour créer la règle permettant d'autoriser le trafic de sous-réseau :
    • Nom : fw-allow-lb-access
    • Réseau : lb-network
    • Priorité : 1000
    • Sens du trafic : entrée
    • Action en cas de correspondance : autoriser
    • Cibles : toutes les instances du réseau
    • Filtre source : IP ranges
    • Plages d'adresses IP sources : 10.1.2.0/24
    • Protocoles et ports : tout autoriser
  3. Cliquez sur Créer.
  4. Cliquez de nouveau sur Créer une règle de pare-feu pour créer la règle autorisant les connexions SSH entrantes :
    • Nom : fw-allow-ssh
    • Réseau : lb-network
    • Priorité : 1000
    • Sens du trafic : entrée
    • Action en cas de correspondance : autoriser
    • Cibles : tags cibles spécifiés
    • Tags cibles : allow-ssh
    • Filtre source : IP ranges
    • Plages d'adresses IP sources : 0.0.0.0/0
    • Protocoles et ports : choisissez Protocoles et ports spécifiés, puis saisissez tcp:22.
  5. Cliquez sur Créer.
  6. Cliquez une troisième fois sur Créer une règle de pare-feu pour créer la règle autorisant les vérifications d'état Google Cloud :
    • Nom : fw-allow-health-check
    • Réseau : lb-network
    • Priorité : 1000
    • Sens du trafic : entrée
    • Action en cas de correspondance : autoriser
    • Cibles : tags cibles spécifiés
    • Tags cibles : allow-health-check
    • Filtre source : IP ranges
    • Plages d'adresses IP sources : 130.211.0.0/22 et 35.191.0.0/16
    • Protocoles et ports : tout autoriser
  7. Cliquez sur Créer.

gcloud

  1. Créez la règle de pare-feu fw-allow-lb-access pour autoriser la communication depuis le sous-réseau :

    gcloud compute firewall-rules create fw-allow-lb-access \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --source-ranges=10.1.2.0/24 \
        --rules=tcp,udp,icmp
    
  2. Créez la règle de pare-feu fw-allow-ssh pour autoriser la connectivité SSH aux VM avec le tag réseau allow-ssh. Lorsque vous omettez source-ranges, Google Cloud interprète la règle comme désignant n'importe quelle source.

    gcloud compute firewall-rules create fw-allow-ssh \
        --network=lb-network \
        --action=allow \
        --direction=ingress \
        --target-tags=allow-ssh \
        --rules=tcp:22
    
  3. Créez la règle fw-allow-health-check pour autoriser les vérifications d'état Google Cloud.

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

Créer des VM et des groupes de points de terminaison du réseau

Pour démontrer la nature régionale de l'équilibrage de charge TCP/UDP interne, cet exemple utilise deux backends NEG zonaux, neg-a et neg-c, dans les zones us-west1-a et us- west1-c. Le trafic est équilibré à la fois par les NEG et par les points de terminaison de chaque NEG.

Créer des VM

Pour utiliser cet exemple, chacune des quatre VM exécute un serveur Web Apache qui écoute sur les ports TCP suivants : 80, 8008, 8080, 8088, 443 et 8443.

Chaque VM reçoit une adresse IP interne dans lb-subnet et une adresse IP externe éphémère (publique). Vous pouvez supprimer les adresses IP externes ultérieurement.

Les adresses IP externes ne sont pas requises pour les VM de backend. Cependant, elles sont utiles dans cet exemple, car elles permettent aux VM de télécharger Apache depuis Internet, en plus de faciliter la connexion via SSH. Par défaut, Apache est configuré pour se lier à n'importe quelle adresse IP. Les équilibreurs de charge TCP/UDP internes distribuent les paquets en conservant l'adresse IP de destination.

Vérifiez que le logiciel serveur exécuté sur les VM écoute l'adresse IP de la règle de transfert interne de l'équilibreur de charge.

Pour plus de simplicité, ces VM de backend exécutent Debian GNU/Linux 10.

Console

Créer des VM

  1. Accédez à la page Instances de VM de Google Cloud Console.
    Accéder à la page "Instances de VM"
  2. Répétez les étapes ci-dessous pour créer quatre VM, en utilisant les combinaisons de noms et de zones suivantes :
    • Nom : vm-a1, zone : us-west1-a
    • Nom : vm-a2, zone : us-west1-a
    • Nom : vm-c1, zone : us-west1-c
    • Nom : vm-c2, zone : us-west1-c
  3. Cliquez sur Créer une instance.
  4. Définissez le Nom comme indiqué à l'étape 2.
  5. Dans le champ Région, choisissez us-west1, puis sélectionnez une zone comme indiqué à l'étape 2.
  6. Dans la section Disque de démarrage, assurez-vous que les options sélectionnées sont Debian pour le système d'exploitation et 10 (Buster) pour la version. Si nécessaire, cliquez sur Sélectionner pour modifier l'image.
  7. Cliquez sur Gestion, sécurité, disques, mise en réseau et location unique et apportez les modifications suivantes :

    • Cliquez sur Mise en réseau et ajoutez les tags réseau suivants : allow-ssh et allow-health-check.
    • Cliquez sur le bouton Modifier () sous Interfaces réseau, apportez les modifications suivantes, puis cliquez sur OK :
      • Réseau : lb-network
      • Sous-réseau : lb-subnet
      • Adresse IP interne principale : éphémère (automatique)
      • Adresse IP externe : Éphémère
    • Cliquez sur Gestion. Dans le champ Script de démarrage, copiez et collez le contenu de script suivant. Le contenu du script est identique pour les quatre VM :

      #! /bin/bash
      if [ -f /etc/startup_script_completed ]; then
      exit 0
      fi
      apt-get update
      apt-get install apache2 -y
      a2ensite default-ssl
      a2enmod ssl
      file_ports="/etc/apache2/ports.conf"
      file_http_site="/etc/apache2/sites-available/000-default.conf"
      file_https_site="/etc/apache2/sites-available/default-ssl.conf"
      http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
      http_vh_prts="*:80 *:8008 *:8080 *:8088"
      https_listen_prts="Listen 443\nListen 8443"
      https_vh_prts="*:443 *:8443"
      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
      echo "Page served from: $vm_hostname" | \
      tee /var/www/html/index.html
      prt_conf="$(cat "$file_ports")"
      prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
      prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
      echo "$prt_conf" | tee "$file_ports"
      http_site_conf="$(cat "$file_http_site")"
      http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
      echo "$http_site_conf_2" | tee "$file_http_site"
      https_site_conf="$(cat "$file_https_site")"
      https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
      echo "$https_site_conf_2" | tee "$file_https_site"
      systemctl restart apache2
      touch /etc/startup_script_completed
      
  8. Cliquez sur Créer.

gcloud

Créez quatre VM en exécutant la commande suivante quatre fois, en utilisant ces quatre combinaisons pour [VM-NAME] et [ZONE]. Le contenu du script est identique pour les quatre VM.

  • [VM-NAME] : vm-a1 et [ZONE] : us-west1-a
  • [VM-NAME] : vm-a2 et [ZONE] : us-west1-a
  • [VM-NAME] : vm-c1 et [ZONE] : us-west1-c
  • [VM-NAME] : vm-c2 et [ZONE] : us-west1-c

    gcloud compute instances create VM-NAME \
        --zone=ZONE \
        --image-family=debian-10 \
        --image-project=debian-cloud \
        --tags=allow-ssh,allow-health-check \
        --subnet=lb-subnet \
        --metadata=startup-script='#! /bin/bash
    if [ -f /etc/startup_script_completed ]; then
    exit 0
    fi
    apt-get update
    apt-get install apache2 -y
    a2ensite default-ssl
    a2enmod ssl
    file_ports="/etc/apache2/ports.conf"
    file_http_site="/etc/apache2/sites-available/000-default.conf"
    file_https_site="/etc/apache2/sites-available/default-ssl.conf"
    http_listen_prts="Listen 80\nListen 8008\nListen 8080\nListen 8088"
    http_vh_prts="*:80 *:8008 *:8080 *:8088"
    https_listen_prts="Listen 443\nListen 8443"
    https_vh_prts="*:443 *:8443"
    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
    prt_conf="$(cat "$file_ports")"
    prt_conf_2="$(echo "$prt_conf" | sed "s|Listen 80|${http_listen_prts}|")"
    prt_conf="$(echo "$prt_conf_2" | sed "s|Listen 443|${https_listen_prts}|")"
    echo "$prt_conf" | tee "$file_ports"
    http_site_conf="$(cat "$file_http_site")"
    http_site_conf_2="$(echo "$http_site_conf" | sed "s|*:80|${http_vh_prts}|")"
    echo "$http_site_conf_2" | tee "$file_http_site"
    https_site_conf="$(cat "$file_https_site")"
    https_site_conf_2="$(echo "$https_site_conf" | sed "s|_default_:443|${https_vh_prts}|")"
    echo "$https_site_conf_2" | tee "$file_https_site"
    systemctl restart apache2
    touch /etc/startup_script_completed'
    

Créer des NEG zonaux GCE_VM_IP

Les NEG (neg-a et neg-c) doivent être créés dans les mêmes zones que les VM créées à l'étape précédente.

Console

Vous ne pouvez pas créer ni gérer de NEG zonaux GCE_VM_IP à l'aide de Cloud Console. Utilisez plutôt gcloud ou l'API REST.

gcloud

  1. Créez un NEG zonal GCE_VM_IP appelé neg-a dans us-west1-a à l'aide de la commande gcloud compute network-endpoint-groups create :

    gcloud compute network-endpoint-groups create neg-a \
        --network-endpoint-type=gce-vm-ip \
        --zone=us-west1-a \
        --network=lb-network \
        --subnet=lb-subnet
    
  2. Ajoutez des points de terminaison à neg-a :

    gcloud compute network-endpoint-groups update neg-a \
        --zone=us-west1-a \
        --add-endpoint='instance=vm-a1' \
        --add-endpoint='instance=vm-a2'
    
  3. Créez un NEG zonal GCE_VM_IP appelé neg-c dans us-west1-c à l'aide de la commande gcloud compute network-endpoint-groups create :

    gcloud compute network-endpoint-groups create neg-c \
        --network-endpoint-type=gce-vm-ip \
        --zone=us-west1-c \
        --network=lb-network \
        --subnet=lb-subnet
    
  4. Ajoutez des points de terminaison à neg-c :

    gcloud compute network-endpoint-groups update neg-c \
        --zone=us-west1-c \
        --add-endpoint='instance=vm-c1' \
        --add-endpoint='instance=vm-c2'
    

Créer une VM cliente

Cet exemple crée une VM cliente (vm-client) dans la même région que les VM de backend (serveur). Le client est utilisé pour valider la configuration de l'équilibreur de charge et faire la démonstration du comportement attendu, tel que décrit dans la section consacrée aux tests.

Console

  1. Accédez à la page Instances de VM de Google Cloud Console.
    Accéder à la page Instances de VM
  2. Cliquez sur Créer une instance.
  3. Définissez le paramètre Nom sur vm-client.
  4. Définissez le paramètre Zone sur us-west1-a.
  5. Cliquez sur Gestion, sécurité, disques, mise en réseau et location unique et apportez les modifications suivantes :
    • Cliquez sur Mise en réseau et ajoutez allow-ssh aux tags réseau.
    • Cliquez sur le bouton de modification sous Interfaces réseau, apportez les modifications suivantes, puis cliquez sur OK :
      • Réseau : lb-network
      • Sous-réseau : lb-subnet
      • Adresse IP interne principale : éphémère (automatique)
      • Adresse IP externe : Éphémère
  6. Cliquez sur Créer.

gcloud

La VM cliente peut se trouver dans n'importe quelle zone de la même région que l'équilibreur de charge, et utiliser n'importe quel sous-réseau de cette région. Dans cet exemple, le client se situe dans la zone us-west1-a et utilise le même sous-réseau que les VM de backend.

gcloud compute instances create vm-client \
    --zone=us-west1-a \
    --image-family=debian-10 \
    --image-project=debian-cloud \
    --tags=allow-ssh \
    --subnet=lb-subnet

Configurer les composants de l'équilibreur de charge

Ces étapes permettent de configurer tous les composants de l'équilibreur de charge TCP/UDP interne :

  • Service de backend : pour cet exemple, vous devez transmettre le trafic HTTP via l'équilibreur de charge. Vous devez donc utiliser TCP, et non UDP.

  • Règle de transfert : Cet exemple crée une seule règle de transfert interne.

  • Adresse IP interne : dans cet exemple, vous spécifiez une adresse IP interne, 10.1.2.99, lors de la création de la règle de transfert.

Console

gcloud

  1. Créez une vérification d'état HTTP régionale.

    gcloud compute health-checks create http hc-http-80 \
        --region=us-west1 \
        --port=80
    
  2. Créez le service de backend :

    gcloud compute backend-services create bs-ilb \
        --load-balancing-scheme=internal \
        --protocol=tcp \
        --region=us-west1 \
        --health-checks=hc-http-80 \
        --health-checks-region=us-west1
    
  3. Ajoutez les deux NEG zonaux, neg-a et neg-c, au service de backend :

    gcloud compute backend-services add-backend bs-ilb \
        --region=us-west1 \
        --network-endpoint-group=neg-a \
        --network-endpoint-group-zone=us-west1-a
    
    gcloud compute backend-services add-backend bs-ilb \
        --region=us-west1 \
        --network-endpoint-group=neg-c \
        --network-endpoint-group-zone=us-west1-c
    
  4. Créez une règle de transfert pour le service de backend. Lorsque vous créez la règle de transfert, indiquez 10.1.2.99 pour l'adresse IP interne dans le sous-réseau.

    gcloud compute forwarding-rules create fr-ilb \
        --region=us-west1 \
        --load-balancing-scheme=internal \
        --network=lb-network \
        --subnet=lb-subnet \
        --address=10.1.2.99 \
        --ip-protocol=TCP \
        --ports=80,8008,8080,8088 \
        --backend-service=bs-ilb \
        --backend-service-region=us-west1
    

Tests

Ce test contacte l'équilibreur de charge à partir d'une VM cliente distincte (autre qu'une VM de backend de l'équilibreur de charge). Le comportement attendu est une répartition du trafic entre les quatre VM de backend, car aucune affinité de session n'a été configurée.

  1. Connectez-vous à l'instance de VM cliente.

    gcloud compute ssh vm-client --zone=us-west1-a
    
  2. Envoyez une requête Web à l'équilibreur de charge à l'aide de curl pour contacter son adresse IP. Répétez la requête pour que les réponses proviennent de différentes VM de backend. Le nom de la VM qui génère la réponse est affiché dans le texte de la réponse HTML, selon le contenu de /var/www/html/index.html sur chaque VM de backend. Les réponses attendues ressemblent à ceci : Page served from: vm-a1, Page served from: vm-a2, etc.

    curl http://10.1.2.99
    

    La règle de transfert est configurée pour desservir les ports 80, 8008, 8080 et 8088. Pour envoyer du trafic vers ces autres ports, ajoutez deux points (:) et le numéro de port après l'adresse IP, comme ceci :

    curl http://10.1.2.99:8008
    

Étape suivante