Configurez un équilibreur de charge réseau passthrough externe avec un pool cible

Ce guide fournit des instructions pour créer une configuration d'équilibreur de charge réseau passthrough externe avec des backends de pool cible. L'exemple suppose que vous disposez de plusieurs serveurs Web sur des instances Compute Engine sur lesquels vous souhaitez équilibrer le trafic. Dans ce scénario, nous mettons en œuvre une configuration d'équilibrage de charge de couche 4 afin de répartir le trafic HTTP entre des instances saines. Des vérifications d'état HTTP basiques sont configurées pour garantir que le trafic n'est envoyé qu'aux instances saines.

Il s'agit ici de répartir la charge du trafic HTTP, mais vous pouvez bien entendu utiliser des équilibreurs de charge réseau passthrough externes basés sur un pool cible pour équilibrer le trafic TCP, UDP et SSL. Avant de commencer, consultez la page Présentation de l'équilibreur de charge réseau passthrough externe pour obtenir des informations conceptuelles sur les équilibreurs de charge réseau passthrough externes.

Avant de commencer

Installez Google Cloud CLI. Pour une présentation complète de l'outil, consultez le guide de l'outil gcloud. Vous trouverez des commandes associées à l'équilibrage de charge dans la section dédiée au groupe de commandes gcloud compute.

Vous pouvez également obtenir une assistance approfondie pour n'importe quelle commande gcloud à l'aide de l'option --help :

gcloud compute http-health-checks create --help

Si vous n'avez pas encore utilisé Google Cloud CLI, exécutez d'abord gcloud init pour vous authentifier.

En outre, vous devez créer une adresse IP externe statique pour l'équilibreur de charge. Si vous utilisez une image fournie par Compute Engine, vos instances de VM sont automatiquement configurées pour gérer cette adresse IP. Si vous utilisez une autre image, vous devez configurer cette adresse en tant qu'alias sur eth0 ou en tant qu'adresse de rebouclage (loopback) sur chaque instance.

Dans ce guide, nous partons du principe que vous maîtrisez bash.

Configurer les instances de VM Compute Engine

Pour ce scénario d'équilibrage de charge, vous allez créer trois instances de VM Compute Engine et installer Apache dessus. Vous allez ajouter une règle de pare-feu permettant au trafic HTTP d'atteindre les instances.

Les instances qui participent en tant que VM backend pour les équilibreurs de charge réseau passthrough externes doivent exécuter l'environnement invité Linux, l'environnement invité Windows ou d'autres processus appropriés présentant des fonctionnalités équivalentes.

Configurer les instances backend

Console

  1. Dans la console Google Cloud, accédez à la page Instances de VM.

    Accéder à la page "Instances de VM"

  2. Cliquez sur Créer une instance.

  3. Pour Nom, définissez www1.

  4. Définissez le champ Région sur us-central1.

  5. Définissez Zone sur us-central1-b.

  6. Sous Disque de démarrage, l'image d'OS par défaut de Debian GNU/Linux 10 (buster) est déjà sélectionnée.

  7. Cliquez sur Options avancées.

  8. Cliquez sur Mise en réseau et configurez les champs suivants :

    1. Pour Tags réseau, saisissez network-lb-tag.
  9. Cliquez sur Gestion. Saisissez le script suivant dans le champ Script de démarrage.

     #! /bin/bash
     sudo apt-get update
     sudo apt-get install apache2 -y
     sudo service apache2 restart
     echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html
     

    1. Cliquez sur Créer.
  10. Créez une instance nommée www2 en utilisant les mêmes paramètres, excepté pour le champ Automatisation > Script de démarrage, dans lequel vous allez insérer le script suivant :

      #! /bin/bash
      sudo apt-get update
      sudo apt-get install apache2 -y
      sudo service apache2 restart
      echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html
     

  11. Créez une instance nommée www3 en utilisant les mêmes paramètres, excepté pour le champ Automatisation > Script de démarrage, dans lequel vous allez insérer le script suivant :

        #! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html
      

gcloud

Vous devez exécuter toutes les commandes ci-dessous sur votre système local via une invite de commande bash.

Pour afficher les noms, les attributs et l'état de l'image de l'OS, utilisez la commande gcloud compute images list.

  1. Créez trois nouvelles machines virtuelles dans une zone donnée et attribuez-leur le même tag. Cet exemple définit la zone sur "us-central1-b". La définition du champ tags vous permet de faire référence à toutes ces instances à la fois, par exemple lorsque vous souhaitez configurer une règle de pare-feu. Les commandes ci-dessous permettent également d'installer Apache sur chaque instance et d'attribuer à chacune d'elle une page d'accueil unique.

    gcloud compute instances create www1 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www2 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www2</h1></body></html>' | tee /var/www/html/index.html"
    gcloud compute instances create www3 \
      --image-family debian-10 \
      --image-project debian-cloud \
      --zone us-central1-b \
      --tags network-lb-tag \
      --metadata startup-script="#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo service apache2 restart
        echo '<!doctype html><html><body><h1>www3</h1></body></html>' | tee /var/www/html/index.html"

api

Créer une instance www1 dans la zone us-central1-b avec la méthode instances.insert

POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances

{
  "canIpForward": false,
  "deletionProtection": false,
  "disks": [
    {
      "type": "PERSISTENT",
      "boot": true,
      "mode": "READ_WRITE",
      "autoDelete": true,
      "deviceName": "www1",
      "initializeParams": {
        "sourceImage": "projects/debian-cloud/global/images/debian-10-buster-v20220719",
        "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
        "diskSizeGb": "10"
      }
    }
  ],
  "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
  "metadata": {
    "items": [
      {
        "key": "startup-script",
        "value": "sudo apt-get update\nsudo apt-get install apache2 -y\nsudo a2ensite default-ssl\nsudo a2enmod ssl\nsudo service apache2 restart\necho '<!doctype html><html><body><h1>www1</h1></body></html>' | tee /var/www/html/index.html"
      }
    ]
  },
  "name": "www1",
  "networkInterfaces": [
    {
      "network": "projects/[PROJECT_ID]/global/networks/default",
      "subnetwork": "projects/[PROJECT_ID]/regions/us-central1/subnetworks/default"
    }
  ],
  "tags": {
    "items": [
      "network-lb-tag"
    ]
  }
}

Créez des instances nommées www2 et www3 en utilisant les mêmes paramètres, mais en remplaçant www1 dans les champs deviceName, value et name.

Créer une règle de pare-feu pour autoriser le trafic externe vers ces instances de 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.

  3. Saisissez le nom www-firewall-network-lb.

  4. Sélectionnez le réseau auquel s'applique la règle de pare-feu (par défaut).

  5. Sous Cibles, sélectionnez Tags cibles spécifiés.

  6. Dans le champ Tags cibles, saisissez network-lb-tag.

  7. Définissez Filtre source sur Plages IPv4.

  8. Définissez le champ Plages IPv4 sources sur 0.0.0.0/0 pour autoriser tout trafic, quelle que soit l'adresse IP source.

  9. Dans le champ Protocoles et ports spécifiés, cochez la case TCP, puis saisissez 80.

  10. Cliquez sur Créer. L'affichage de la nouvelle règle de pare-feu dans la console peut prendre un certain temps. Vous devrez peut-être cliquer sur Actualiser pour qu'elle apparaisse.

gcloud

gcloud compute firewall-rules create www-firewall-network-lb \
    --target-tags network-lb-tag --allow tcp:80

api

Créer une règle de pare-feu qui autorise tout le trafic au sein du sous-réseau à l'aide de la **méthode** firewalls.insert

POST https://compute.googleapis.com/compute/projects/[PROJECT_ID]/global/firewalls

{
  "name": "www-firewall-network-lb",
  "direction": "INGRESS",
  "priority": 1000,
  "targetTags": [
    "network-lb-tag"
  ],
  "allowed": [
    {
      "IPProtocol": "tcp",
      "ports": [
        "80"
      ]
    }
  ],
  "sourceRanges": [
    "0.0.0.0/0"
  ]
}

Obtenir les adresses IP externes de vos instances et vérifier qu'elles sont en cours d'exécution

Console

  1. Dans la console Google Cloud, accédez à la page Instances de VM.

    Accéder à la page "Instances de VM"

  2. Vous pouvez visualiser les adresses de vos instances dans la colonne Adresse IP externe.

  3. Pour vérifier que vos instances sont en cours d'exécution, recherchez la présence d'une coche verte à gauche du nom de chaque instance. Si vous ne voyez pas de coche verte, reportez-vous à la page Dépannage d'ordre général relative aux instances.

gcloud

  1. Répertoriez vos instances afin d'obtenir les adresses IP consignées dans la colonne EXTERNAL_IP.

    gcloud compute instances list
    
  2. Vérifiez que chaque instance est en cours d'exécution.

    Dans la ligne de commande, exécutez curl en utilisant l'adresse IP externe de chaque instance pour vérifier que toutes les instances répondent.

    curl http://[IP_ADDRESS]
    

api

Obtenir des informations sur l'instance www1 avec la méthode instances.get

Assurez-vous que le champ status indique la valeur RUNNING, et recherchez l'adresse IP externe dans le champ natIP.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1

{
 "kind": "compute#instance",
 "id": "6734015273571474749",
 "creationTimestamp": "2018-11-09T11:45:23.487-08:00",
 "name": "www1",
 "description": "",
 "tags": {
  "items": [
   "network-lb-tag"
  ],
  "fingerprint": "9GVlO4gPawg="
 },
 "machineType": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/e2-standard-2",
 "status": "RUNNING",
 "zone": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b",
 "canIpForward": false,
 "networkInterfaces": [
  {
   "kind": "compute#networkInterface",
   "network": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/networks/default",
   "subnetwork": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/subnetworks/default",
   "networkIP": "10.128.0.2",
   "name": "nic0",
   "accessConfigs": [
    {
     "kind": "compute#accessConfig",
     "type": "ONE_TO_ONE_NAT",
     "name": "External NAT",
     "natIP": "35.192.37.233",
     "networkTier": "PREMIUM"
    }
   ],
   "fingerprint": "lxD5f5ua_sw="
  }
 ],
 "disks": [
  {
   "kind": "compute#attachedDisk",
   "type": "PERSISTENT",
   "mode": "READ_WRITE",
   "source": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/disks/www1",
   "deviceName": "www1",
   "index": 0,
   "boot": true,
   "autoDelete": true,
   "licenses": [
    "https://www.googleapis.com/compute/v1/projects/debian-cloud/global/licenses/debian-10-buster"
   ],
   "interface": "SCSI",
   "guestOsFeatures": [
    {
     "type": "VIRTIO_SCSI_MULTIQUEUE"
    }
   ]
  }
 ],
 "metadata": {
  "kind": "compute#metadata",
  "fingerprint": "IyHRmHoJx6E=",
  "items": [
   {
    "key": "startup-script",
    "value": "#! /bin/bash\n sudo apt-get update\n sudo apt-get install apache2 -y\n sudo service apache2 restart\n echo '\u003c!doctype html\u003e\u003chtml\u003e\u003cbody\u003e\u003ch1\u003ewww1\u003c/h1\u003e\u003c/body\u003e\u003c/html\u003e' | tee /var/www/html/index.html"
   }
  ]
 },
 "serviceAccounts": [
  {
   "email": "674259759219-compute@developer.gserviceaccount.com",
   "scopes": [
    "https://www.googleapis.com/auth/devstorage.read_only",
    "https://www.googleapis.com/auth/logging.write",
    "https://www.googleapis.com/auth/monitoring.write",
    "https://www.googleapis.com/auth/servicecontrol",
    "https://www.googleapis.com/auth/service.management.readonly",
    "https://www.googleapis.com/auth/trace.append"
   ]
  }
 ],
 "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/zones/us-central1-b/instances/www1",
 "scheduling": {
  "onHostMaintenance": "MIGRATE",
  "automaticRestart": true,
  "preemptible": false
 },
 "cpuPlatform": "Intel Haswell",
 "labelFingerprint": "42WmSpB8rSM=",
 "startRestricted": false,
 "deletionProtection": false
}

Répétez cet appel d'API pour www2 et www3.

Configurer le service d'équilibrage de charge

Configurez ensuite le service d'équilibrage de charge.

Lorsque vous configurez le service d'équilibrage de charge, vos instances de machines virtuelles reçoivent les paquets destinés à l'adresse IP externe statique configurée. Si vous utilisez une image fournie par Compute Engine, vos instances de VM sont automatiquement configurées pour gérer cette adresse IP. Si vous utilisez une autre image, vous devez configurer cette adresse en tant qu'alias sur eth0 ou en tant qu'adresse de rebouclage (loopback) sur chaque instance.

Console

Vous ne pouvez pas utiliser la console Google Cloud pour créer des équilibreurs de charge réseau passthrough externes basés sur un pool cible. Utilisez plutôt gcloud ou l'API REST.

gcloud

  1. Créez une adresse IP externe statique pour votre équilibreur de charge.

    gcloud compute addresses create network-lb-ip-1 \
        --region us-central1
    
  2. Ajoutez une ancienne ressource de vérification d'état HTTP.

    Cet exemple utilise les paramètres par défaut du mécanisme de vérification d'état, mais vous pouvez également personnaliser la vérification de l'état par vous-même.

    gcloud compute http-health-checks create basic-check
    
  3. Ajouter un pool cible

    Ajoutez un pool cible dans la région où sont déployées vos instances de machines virtuelles. Utilisez la vérification d'état créée à l'étape précédente pour ce pool cible. Les pools cibles nécessitent un service de vérification d'état pour fonctionner.

    gcloud compute target-pools create www-pool \
        --region us-central1 --http-health-check basic-check
    
  4. Ajoutez vos instances au pool cible.

    gcloud compute target-pools add-instances www-pool \
        --instances www1,www2,www3 \
        --instances-zone us-central1-b
    

    Les instances d'un pool cible doivent appartenir à la même région, mais elles peuvent être réparties dans différentes zones de la même région. Par exemple, vous pouvez avoir des instances dans la zone us-central1-f et des instances dans la zone us-central1-b dans un même pool cible, car elles se trouvent dans la même région us-central1.

  5. Ajouter une règle de transfert

    Ajoutez une règle de transfert diffusant du trafic pour le compte d'une adresse IP externe et d'une plage de ports pointant vers votre pool cible. Pour le champ --address, utilisez soit l'adresse IP numérique, soit le nom complet de cette adresse.

    gcloud compute forwarding-rules create www-rule \
        --region us-central1 \
        --ports 80 \
        --address network-lb-ip-1 \
        --target-pool www-pool
    

api

  1. Créez une adresse IP externe statique pour votre équilibreur de charge.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID/regions/us-central1/addresses
    {
      "name": "network-lb-ip-1"
    }
    
  2. Ajoutez une ancienne vérification d'état HTTP.

    Cet exemple utilise les paramètres par défaut pour le mécanisme de vérification d'état, mais vous pouvez également définir des paramètres personnalisés.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks
    {
      "name": "basic-check"
    }
    
  3. Ajoutez un pool cible.

    Ajoutez un pool cible dans la région où sont déployées vos instances de machines virtuelles. Utilisez la vérification d'état créée à l'étape précédente pour ce pool cible. Les pools cibles nécessitent un service de vérification d'état pour fonctionner.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools
    {
      "name": "www-pool",
      "healthChecks": [
        "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks/basic-check"
      ]
    }
    
  4. Ajoutez vos instances au pool cible.

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-pool/addInstance
    {
      "instances": [
        {
          "instance": "projects/[PROJECT_ID]/zones/us-central1-b/instances/www1"
        }
      ]
    }
    

    Répétez cet appel d'API pour les instances www2 et www3.

    Les instances d'un pool cible doivent appartenir à la même région, mais elles peuvent être réparties dans différentes zones de la même région. Par exemple, vous pouvez avoir des instances dans la zone us-central1-f et des instances dans la zone us-central1-b dans un même pool cible, car elles se trouvent dans la même région us-central1.

  5. Ajouter une règle de transfert

    POST https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules
    {
      "name": "www-rule",
      "portRange": "80",
      "loadBalancingScheme": "EXTERNAL",
      "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb"
    }
    

Envoyer du trafic vers vos instances

Maintenant que le service d'équilibrage de charge est configuré, vous pouvez commencer à envoyer le trafic vers la règle de transfert et surveiller la répartition du trafic entre les différentes instances.

Rechercher l'adresse IP externe associée à la règle de transfert

Console

  1. Accédez à l'onglet Règles de transfert via le menu Avancé de la page "Équilibrage de charge" dans Google Cloud Console.
    Accéder à l'onglet Règles de transfert
  2. Localisez www-rule, la règle de transfert utilisée par l'équilibreur de charge.
  3. Notez l'adresse IP externe indiquée dans la colonne Adresse IP associée à www-rule.

gcloud

Saisissez la commande suivante pour afficher l'adresse IP externe de la règle de transfert www-rule utilisée par l'équilibreur de charge.

gcloud compute forwarding-rules describe www-rule --region us-central1

api

Afficher l'adresse IP externe de la règle de transfert www-rule avec la méthode forwardingRules.get

Dans le résultat, recherchez le champ IPAddress.

GET https://compute.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule
{
  "kind": "compute#forwardingRule",
  "id": "5133886346582800002",
  "creationTimestamp": "2018-11-09T14:21:33.574-08:00",
  "name": "www-rule",
  "description": "",
  "region": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1",
  "IPAddress": "35.232.228.9",
  "IPProtocol": "TCP",
  "portRange": "80-80",
  "target": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/targetPools/www-network-lb",
  "selfLink": "https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/regions/us-central1/forwardingRules/www-rule",
  "loadBalancingScheme": "EXTERNAL",
  "networkTier": "PREMIUM"
}

Protocole ICMP non compatible avec les instances backend

Les équilibreurs de charge réseau passthrough externes ne transmettent pas les paquets ICMP aux instances de backend. Si vous envoyez un paquet ICMP, par exemple avec ping ou traceroute, la réponse ne provient pas des instances backend de l'équilibreur de charge.

L'infrastructure Google Cloud peut envoyer une réponse ICMP, même si vous disposez de règles de pare-feu qui interdisent le trafic ICMP sur les instances backend de l'équilibreur de charge. Ce comportement ne peut pas être modifié.

Utiliser la commande curl pour accéder à l'adresse IP externe

La réponse de la commande curl est alternée de manière aléatoire entre les trois instances. En cas d'échec au début de la phase de réponse, il vous faudra probablement patienter environ 30 secondes pour que la configuration soit entièrement chargée et que vos instances soient identifiées comme saines avant de réessayer :

$ while true; do curl -m1 IP_ADDRESS; done

Étapes suivantes