Configurer l'équilibrage de charge au niveau du réseau

Ce guide fournit des instructions pour créer une configuration d'équilibrage de charge réseau basique. Dans cet exemple, nous partons du principe que vous disposez de plusieurs serveurs Web déployés sur des instances Google Compute Engine, entre lesquels vous souhaitez équilibrer le trafic. Dans ce scénario, nous mettons en œuvre une configuration d'équilibrage de charge de couche 3 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 l'équilibrage de charge réseau pour équilibrer le trafic UDP, TCP ou SSL. Avant de commencer, consultez la page Concepts d'équilibrage de charge au niveau du réseau pour obtenir des informations conceptuelles sur l'équilibrage de charge réseau.

Avant de commencer

Installez l'outil de ligne de commande gcloud. Pour en savoir plus sur cet outil, consultez la page Présentation de l'outil de ligne de commande gcloud. Vous trouverez des commandes liées à l'équilibrage de charge dans le 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é l'outil de ligne de commande gcloud, vous devez tout d'abord exécuter 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 machines virtuelles (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 sur chaque instance.

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

Configurer des instances 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 de backend pour les équilibreurs de charge réseau doivent exécuter l'environnement invité Linux approprié, l'environnement invité Windows ou d'autres processus offrant des fonctionnalités équivalentes.

Configurer les instances

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. 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 9 (stretch) est déjà sélectionnée.
  7. Cliquez sur Gestion, sécurité, disques, mise en réseau et location unique pour afficher les paramètres avancés.
    1. Dans l'onglet Gestion, insérez 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
          EOF
    2. Sous Réseau, renseignez le champ Tags avec la valeur network-lb-tag.
    3. Conservez les valeurs par défaut des autres champs.
    4. Cliquez sur Créer.
  8. 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
        EOF
  9. 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
        EOF

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-9 \
          --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
            EOF"
        gcloud compute instances create www2 \
          --image-family debian-9 \
          --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
            EOF"
        gcloud compute instances create www3 \
          --image-family debian-9 \
          --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
            EOF"

api

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

    POST https://www.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/eip-images/global/images/debian-9-drawfork-v20181101",
            "diskType": "projects/[PROJECT_ID]/zones/us-central1-b/diskTypes/pd-standard",
            "diskSizeGb": "10"
          }
        }
      ],
      "machineType": "projects/[PROJECT_ID]/zones/us-central1-b/machineTypes/n1-standard-1",
      "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. 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.
  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 le champ Plages d'adresses IP sources sur 0.0.0.0/0 pour autoriser tout trafic, quelle que soit l'adresse IP source.
  8. Sous Protocoles et ports spécifiés, cochez la case en regard de TCP et saisissez 80.
  9. 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://www.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"
      ]
    }
    

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

Console

  1. Accédez à la page "Instances de VM" de Google Cloud Console.
    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.

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://www.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/n1-standard-1",
     "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-9-stretch"
       ],
       "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\n EOF"
       }
      ]
     },
     "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 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 sur chaque instance.

Console

  1. Accédez à la page Créer un équilibreur de charge dans Google Cloud Console.
    Accéder à la page Créer un équilibreur de charge
  2. Sous Équilibrage de charge TCP, cliquez sur le bouton Démarrer la configuration.

  3. Pour Web ou interne, sélectionnez From Internet to my VMs.

  4. Pour Région unique ou multirégion, sélectionnez Single region only.

  5. Cliquez sur le bouton Continuer.

Configurer le backend

  1. Sur l'écran Nouvel équilibreur de charge TCP, saisissez www-network-lb dans le champ Nom du nouvel équilibreur de charge.
  2. Cliquez sur Configuration du backend.
  3. Le nom que vous avez saisi précédemment pour l'équilibreur de charge s'affiche, mais il est impossible de le modifier.
  4. Dans le champ Région, sélectionnez us-central1.
  5. Sous Backends, cliquez sur l'onglet Sélectionner des instances existantes, puis sur Ajouter une instance. Saisissez le nom d'instance www1. Répétez cette étape pour les instances www2 et www3.
  6. Sous Vérification d'état, cliquez sur Créer une vérification d'état ou sur Créer une autre vérification d'état :

    1. Saisissez basic-check comme nom de la vérification d'état.
    2. Conservez les paramètres par défaut.
    3. Cliquez sur le bouton Enregistrer et continuer.

    Si un cercle bleu avec une coche s'affiche à gauche de Configuration du backend, cela indique que la configuration a réussi.

Configurer la règle de transfert

  1. Cliquez sur Configuration du frontend.
  2. Saisissez le nom www-rule.
  3. Sous Adresse IP, cliquez sur le menu déroulant et sélectionnez Créer une adresse IP.
    1. Sur l'écran Réserver une nouvelle adresse IP statique, saisissez lb-ip-1 dans le champ Nom.
    2. Cliquez sur Réserver.
  4. Définissez le champ Port sur 80.
  5. Cliquez sur le bouton OK.

    Si un cercle bleu avec une coche s'affiche à gauche de Configuration du frontend, cela indique que la configuration a réussi.

Vérifier la configuration

  1. Cliquez sur le bouton Vérification et finalisation pour vérifier tous les paramètres de configuration définis pour l'équilibreur de charge.
  2. Si les paramètres sont corrects, cliquez sur Créer. La création de l'équilibreur de charge prend quelques minutes.

    Sur l'écran "Équilibrage de charge", consultez la colonne "Backend" de votre nouvel équilibreur de charge : une coche verte indique normalement que cet équilibreur est sain.

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.

    Dans cet exemple, nous utilisons les paramètres par défaut du système de vérification d'état, mais vous pouvez également définir des paramètres personnalisés.

        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://www.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.

    Dans cet exemple, nous utilisons les paramètres par défaut du système de vérification d'état, mais vous pouvez également définir des paramètres personnalisés.

        POST https://www.googleapis.com/compute/v1/projects/[PROJECT_ID]/global/httpHealthChecks
        {
          "name": "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.

        POST https://www.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://www.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://www.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 définie dans 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://www.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"
    }

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

La réponse de la commande curl alterne 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
    

Étape suivante