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
Dans la console Google Cloud, accédez à la page Instances de VM.
Cliquez sur Créer une instance.
Pour Nom, définissez
www1
.Définissez le champ Région sur us-central1.
Définissez Zone sur us-central1-b.
Sous Disque de démarrage, l'image d'OS par défaut de
Debian GNU/Linux 10 (buster)
est déjà sélectionnée.Cliquez sur Options avancées.
Cliquez sur Mise en réseau et configurez les champs suivants :
- Pour Tags réseau, saisissez
network-lb-tag
.
- Pour Tags réseau, saisissez
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
- Cliquez sur Créer.
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
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
.
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-12 \ --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-12 \ --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-12 \ --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-12-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
Dans la console Google Cloud, accédez à la page Règles d'administration.
Cliquez sur Créer une règle de pare-feu.
Saisissez le nom
www-firewall-network-lb
.Sélectionnez le réseau auquel s'applique la règle de pare-feu (par défaut).
Sous Cibles, sélectionnez Tags cibles spécifiés.
Dans le champ Tags cibles, saisissez
network-lb-tag
.Définissez Filtre source sur Plages IPv4.
Définissez le champ Plages IPv4 sources sur
0.0.0.0/0
pour autoriser tout trafic, quelle que soit l'adresse IP source.Dans le champ Protocoles et ports spécifiés, cochez la case TCP, puis saisissez
80
.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
Dans la console Google Cloud, accédez à la page Instances de VM.
Vous pouvez visualiser les adresses de vos instances dans la colonne Adresse IP externe.
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
Répertoriez vos instances afin d'obtenir les adresses IP consignées dans la colonne
EXTERNAL_IP
.gcloud compute instances list
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-12-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
Créez une adresse IP externe statique pour votre équilibreur de charge.
gcloud compute addresses create network-lb-ip-1 \ --region us-central1
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
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
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 zoneus-central1-b
dans un même pool cible, car elles se trouvent dans la même régionus-central1
.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
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" }
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" }
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" ] }
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
etwww3
.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 zoneus-central1-b
dans un même pool cible, car elles se trouvent dans la même régionus-central1
.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
- 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 - Localisez
www-rule
, la règle de transfert utilisée par l'équilibreur de charge. - 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
- Pour en savoir plus sur le fonctionnement des équilibreurs de charge réseau passthrough externes avec pools cibles, consultez la présentation de l'équilibreur de charge réseau passthrough externe basé sur un pool cible.
- Pour savoir comment les équilibreurs de charge réseau passthrough externes fonctionnent avec les services de backend régionaux au lieu des pools cibles, consultez les pages suivantes :
- Pour configurer la protection DDoS avancée du réseau pour un équilibreur de charge réseau passthrough externe à l'aide de Google Cloud Armor, consultez la section Configurer la protection DDoS avancée du réseau.
- Pour en savoir plus sur les problèmes et les solutions en cas d'utilisation d'un équilibreur de charge réseau passthrough externe UDP, consultez la page Utiliser UDP avec des équilibreurs de charge réseau passthrough externes.
- Pour supprimer des ressources afin qu'elles ne vous soient pas facturées, consultez la section Nettoyer une configuration d'équilibrage de charge.