Tutoriel : Équilibrer la charge des machines virtuelles pour la haute disponibilité

S’applique à : ✔️ Machines virtuelles Linux ✔️ Ensembles d'échelle flexibles

L’équilibrage de charge offre un niveau de disponibilité plus élevé en répartissant les requêtes entrantes sur plusieurs machines virtuelles. Dans ce tutoriel, vous allez découvrir les différents composants de l’équilibreur de charge Azure qui distribuent le trafic et fournissent une haute disponibilité. Vous apprenez à :

  • Créer un équilibreur de charge
  • Créer une sonde de santé
  • Créer des règles de trafic
  • Utiliser cloud-init pour installer une application de base Node.js
  • Créer des machines virtuelles et les attacher à l’équilibreur de charge
  • Afficher l’équilibreur de charge en action
  • Ajouter et supprimer des machines virtuelles de l’équilibreur de charge

Ce tutoriel utilise l’interface CLI dans Azure Cloud Shell, qui est constamment mise à jour vers la dernière version. Pour ouvrir Cloud Shell, sélectionnez Essayer dans le haut de n’importe quel bloc de code.

Si vous choisissez d’installer et d’utiliser l’interface de ligne de commande localement, ce didacticiel nécessite que vous exécutiez Azure CLI version 2.0.30 ou ultérieure. Exécutez az --version pour trouver la version. Si vous avez besoin d’installer ou de mettre à niveau, consultez Installer Azure CLI.

Vue d’ensemble de l’équilibreur de charge Azure

Un équilibreur de charge Azure est un équilibreur de charge de couche 4 (TCP, UDP) qui fournit une haute disponibilité en distribuant le trafic entrant entre des machines virtuelles saines. Une sonde d’intégrité de l’équilibreur de charge surveille un port donné sur chaque machine virtuelle et distribue uniquement le trafic vers une machine virtuelle opérationnelle.

Vous définissez une configuration d’adresse IP frontale qui contient une ou plusieurs adresses IP publiques. Cette configuration IP frontale permet à votre équilibreur de charge et à vos applications d’être accessibles via Internet.

Les machines virtuelles se connectent à un équilibreur de charge à l’aide de leur carte d’interface réseau virtuelle. Pour distribuer le trafic vers les machines virtuelles, un pool d’adresses back-end contient les adresses IP des cartes réseau connectées à l’équilibreur de charge.

Pour contrôler le flux de trafic, vous définissez des règles d’équilibreur de charge pour des ports et protocoles spécifiques mappés à vos machines virtuelles.

Si vous avez suivi le tutoriel précédent pour créer un groupe de machines virtuelles identiques, un équilibreur de charge a été créé pour vous. Tous ces composants ont été configurés pour vous dans le cadre de l'ensemble de mise à l’échelle.

Créer un équilibreur de charge Azure

Cette section explique comment créer et configurer chaque composant de l’équilibreur de charge. Avant de pouvoir créer votre équilibreur de charge, créez un groupe de ressources avec az group create. L’exemple suivant crée un groupe de ressources nommé myResourceGroupLoadBalancer à l’emplacement eastus :

az group create --name myResourceGroupLoadBalancer --location eastus

Créer une adresse IP publique

Pour accéder à votre application sur Internet, vous avez besoin d’une adresse IP publique pour l’équilibreur de charge. Créez une adresse IP publique avec az network public-ip create. L’exemple suivant crée une adresse IP publique nommée myPublicIP dans le groupe de ressources myResourceGroupLoadBalancer :

az network public-ip create \
    --resource-group myResourceGroupLoadBalancer \
    --name myPublicIP

Créer un équilibreur de charge

Créez un équilibreur de charge avec az network lb create. L’exemple suivant crée un équilibreur de charge nommé myLoadBalancer et affecte l’adresse myPublicIP à la configuration IP frontale :

az network lb create \
    --resource-group myResourceGroupLoadBalancer \
    --name myLoadBalancer \
    --frontend-ip-name myFrontEndPool \
    --backend-pool-name myBackEndPool \
    --public-ip-address myPublicIP

Créer une sonde de santé

Pour permettre à l'équilibreur de charge de surveiller l'état de votre application, vous utilisez une sonde de santé. La sonde d’intégrité ajoute ou supprime dynamiquement les machines virtuelles de la rotation de l’équilibreur de charge en fonction de leur réponse aux vérifications d’intégrité. Par défaut, une machine virtuelle est supprimée de la distribution de l’équilibreur de charge après deux échecs consécutifs à des intervalles de 15 secondes. Vous créez une sonde d’intégrité basée sur un protocole ou une page de vérification d’intégrité spécifique pour votre application.

L’exemple suivant crée une sonde TCP. Vous pouvez également créer des sondes HTTP sur mesure pour des contrôles de santé plus détaillés. Lorsque vous utilisez une sonde HTTP personnalisée, vous devez créer la page de vérification d’intégrité, telle que healthcheck.js. La sonde doit retourner une réponse HTTP 200 OK pour que l’équilibreur de charge conserve l’hôte en rotation.

Pour créer une sonde d’intégrité TCP, vous devez utiliser az network lb probe create. L’exemple suivant crée une sonde d’intégrité appelée myHealthProbe :

az network lb probe create \
    --resource-group myResourceGroupLoadBalancer \
    --lb-name myLoadBalancer \
    --name myHealthProbe \
    --protocol tcp \
    --port 80

Créer une règle d’équilibreur de charge

Une règle d’équilibrage de charge est utilisée pour définir la distribution du trafic vers les machines virtuelles. Vous définissez la configuration IP frontale pour le trafic entrant et le pool d’adresses IP principal pour recevoir le trafic, ainsi que le port source et le port de destination requis. Pour vous assurer que seules les machines virtuelles saines reçoivent du trafic, vous définissez également la sonde d’intégrité à utiliser.

Créez une règle d’équilibreur de charge avec az network lb rule create. L’exemple suivant crée une règle nommée myLoadBalancerRule, utilise la sonde d’intégrité myHealthProbe et équilibre le trafic sur le port 80 :

az network lb rule create \
    --resource-group myResourceGroupLoadBalancer \
    --lb-name myLoadBalancer \
    --name myLoadBalancerRule \
    --protocol tcp \
    --frontend-port 80 \
    --backend-port 80 \
    --frontend-ip-name myFrontEndPool \
    --backend-pool-name myBackEndPool \
    --probe-name myHealthProbe

Configurer un réseau virtuel

Avant de déployer des machines virtuelles et de tester votre répartiteur de charges, créez les ressources de réseau virtuel nécessaires. Pour plus d’informations sur les réseaux virtuels, consultez le didacticiel Gérer les réseaux virtuels Azure .

Créer des ressources réseau

Créez un réseau virtuel avec az network vnet create. L’exemple suivant crée un réseau virtuel nommé myVnet avec un sous-réseau nommé mySubnet :

az network vnet create \
    --resource-group myResourceGroupLoadBalancer \
    --name myVnet \
    --subnet-name mySubnet

Pour ajouter un groupe de sécurité réseau, vous utilisez az network nsg create. L’exemple suivant crée un groupe de sécurité réseau nommé myNetworkSecurityGroup :

az network nsg create \
    --resource-group myResourceGroupLoadBalancer \
    --name myNetworkSecurityGroup

Créez une règle de groupe de sécurité réseau avec az network nsg rule create. L’exemple suivant crée une règle de groupe de sécurité réseau nommée myNetworkSecurityGroupRule :

az network nsg rule create \
    --resource-group myResourceGroupLoadBalancer \
    --nsg-name myNetworkSecurityGroup \
    --name myNetworkSecurityGroupRule \
    --priority 1001 \
    --protocol tcp \
    --destination-port-range 80

Les cartes réseau virtuelles sont créées avec az network nic create. L’exemple suivant crée trois cartes réseau virtuelles. (Une carte d’interface réseau virtuelle pour chaque machine virtuelle que vous créez pour votre application dans les étapes suivantes). Vous pouvez créer des cartes réseau virtuelles et des machines virtuelles supplémentaires à tout moment et les ajouter à l’équilibreur de charge :

for i in `seq 1 3`; do
    az network nic create \
        --resource-group myResourceGroupLoadBalancer \
        --name myNic$i \
        --vnet-name myVnet \
        --subnet mySubnet \
        --network-security-group myNetworkSecurityGroup \
        --lb-name myLoadBalancer \
        --lb-address-pools myBackEndPool
done

Lorsque les trois cartes réseau virtuelles sont créées, passez à l’étape suivante

Créer des machines virtuelles

Créer une configuration cloud-init

Dans un tutoriel précédent sur la personnalisation d’une machine virtuelle Linux lors du premier démarrage, vous avez appris à automatiser la personnalisation des machines virtuelles avec cloud-init. Vous pouvez utiliser le même fichier de configuration cloud-init pour installer NGINX et exécuter une application simple « Hello World » Node.js à l’étape suivante. Pour afficher l’équilibreur de charge en action, à la fin du tutoriel, vous accédez à cette application simple dans un navigateur web.

Dans votre interpréteur de commandes actuel, créez un fichier nommé cloud-init.txt et collez la configuration suivante. Par exemple, créez le fichier dans l’interpréteur de commandes Cloud et non sur votre ordinateur local. Entrez sensible-editor cloud-init.txt pour créer le fichier et voir la liste des éditeurs disponibles. Vérifiez que l’intégralité du fichier cloud-init est copiée, en particulier la première ligne :

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
  - path: /etc/nginx/sites-available/default
    content: |
      server {
        listen 80;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
  - path: /home/azureuser/myapp/index.js
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

Créer des machines virtuelles

Pour améliorer la haute disponibilité de votre application, placez vos machines virtuelles dans un groupe à haute disponibilité. Pour plus d’informations sur les groupes à haute disponibilité, consultez le didacticiel précédent sur la création de machines virtuelles hautement disponibles .

Créez un set de disponibilité avec az vm availability-set create. L’exemple suivant crée un groupe à haute disponibilité nommé myAvailabilitySet :

az vm availability-set create \
    --resource-group myResourceGroupLoadBalancer \
    --name myAvailabilitySet

Vous pouvez maintenant créer les machines virtuelles avec az vm create. L’exemple suivant crée trois machines virtuelles et génère des clés SSH si elles n’existent pas déjà :

for i in `seq 1 3`; do
    az vm create \
        --resource-group myResourceGroupLoadBalancer \
        --name myVM$i \
        --availability-set myAvailabilitySet \
        --nics myNic$i \
        --image UbuntuLTS \
        --admin-username azureuser \
        --generate-ssh-keys \
        --custom-data cloud-init.txt \
        --no-wait
done

Certaines tâches en arrière-plan continuent à s’exécuter une fois que l’interface CLI Azure vous renvoie à l’invite de commandes. Le --no-wait paramètre n’attend pas que toutes les tâches se terminent. Un délai de quelques minutes peut être nécessaire avant que vous puissiez accéder à l’application. La sonde d’intégrité de l’équilibreur de charge détecte automatiquement le moment où l’application s’exécute sur chaque machine virtuelle. Une fois l’application en cours d’exécution, la règle d’équilibreur de charge commence à distribuer le trafic.

Tester l’équilibreur de charge

Obtenez l’adresse IP publique de votre équilibreur de charge avec az network public-ip show. L’exemple suivant obtient l’adresse IP de myPublicIP créée précédemment :

az network public-ip show \
    --resource-group myResourceGroupLoadBalancer \
    --name myPublicIP \
    --query [ipAddress] \
    --output tsv

Vous pouvez ensuite entrer l’adresse IP publique dans un navigateur web. N’oubliez pas : quelques minutes sont nécessaires pour que les machines virtuelles soient prêtes avant que l’équilibreur de charge commence à distribuer le trafic vers eux. L’application s’affiche, y compris le nom d’hôte de la machine virtuelle vers laquelle l’équilibreur de charge a distribué le trafic comme dans l’exemple suivant :

Exécution d’une application Node.js

Pour voir l’équilibreur de charge distribuer le trafic sur l'ensemble des trois machines virtuelles exécutant votre application, vous pouvez effectuer un rafraîchissement forcé de votre navigateur web.

Ajouter et supprimer des machines virtuelles

Vous devrez peut-être effectuer une maintenance sur les machines virtuelles exécutant votre application, telles que l’installation des mises à jour du système d’exploitation. Pour gérer l’augmentation du trafic vers votre application, vous devrez peut-être ajouter des machines virtuelles supplémentaires. Cette section vous montre comment supprimer ou ajouter une machine virtuelle de l’équilibreur de charge.

Supprimer une machine virtuelle de l’équilibreur de charge

Vous pouvez supprimer une machine virtuelle du pool d'adresses back-end avec az network nic ip-config address-pool remove. L’exemple suivant supprime la carte réseau virtuelle pour myVM2 de myLoadBalancer :

az network nic ip-config address-pool remove \
    --resource-group myResourceGroupLoadBalancer \
    --nic-name myNic2 \
    --ip-config-name ipConfig1 \
    --lb-name myLoadBalancer \
    --address-pool myBackEndPool 

Pour voir l’équilibreur de charge répartir le trafic entre les deux machines virtuelles restantes exécutant votre application, vous pouvez actualiser votre navigateur web de manière forcée. Vous pouvez maintenant effectuer une maintenance sur la machine virtuelle, comme l’installation des mises à jour du système d’exploitation ou l’exécution d’un redémarrage de machine virtuelle.

Pour afficher la liste des machines virtuelles avec des cartes réseau virtuelles connectées à l’équilibreur de charge, utilisez az network lb address-pool show. Interrogez et filtrez l’ID de la carte réseau virtuelle de la manière suivante :

az network lb address-pool show \
    --resource-group myResourceGroupLoadBalancer \
    --lb-name myLoadBalancer \
    --name myBackEndPool \
    --query backendIpConfigurations \
    --output tsv | cut -f5

La sortie est similaire à l’exemple suivant, ce qui montre que la carte réseau virtuelle pour la machine virtuelle 2 ne fait plus partie du pool d’adresses back-end :

/subscriptions/<guid>/resourceGroups/myResourceGroupLoadBalancer/providers/Microsoft.Network/networkInterfaces/myNic1/ipConfigurations/ipconfig1
/subscriptions/<guid>/resourceGroups/myResourceGroupLoadBalancer/providers/Microsoft.Network/networkInterfaces/myNic3/ipConfigurations/ipconfig1

Ajouter une machine virtuelle à l’équilibreur de charge

Après avoir effectué une maintenance de machine virtuelle ou si vous avez besoin d’étendre la capacité, vous pouvez ajouter une machine virtuelle au pool d'adresses back-end avec az network nic ip-config address-pool add. L’exemple suivant ajoute la carte réseau virtuelle pour myVM2 à myLoadBalancer :

az network nic ip-config address-pool add \
    --resource-group myResourceGroupLoadBalancer \
    --nic-name myNic2 \
    --ip-config-name ipConfig1 \
    --lb-name myLoadBalancer \
    --address-pool myBackEndPool

Pour vérifier que la carte réseau virtuelle est connectée au pool d’adresses backend, utilisez à nouveau az network lb address-pool show comme à l’étape précédente.

Étapes suivantes

Dans ce tutoriel, vous avez créé un équilibreur de charge et des machines virtuelles attachées à celui-ci. Vous avez appris à :

  • Crée un équilibrage de charge Azure
  • Créer une sonde de santé de l’équilibreur de charge
  • Créer des règles de trafic de l'équilibreur de charge
  • Utiliser cloud-init pour créer une application de base Node.js
  • Créer des machines virtuelles et les attacher à un équilibreur de charge
  • Afficher un équilibreur de charge en action
  • Ajouter et supprimer des machines virtuelles d’un équilibreur de charge

Passez au tutoriel suivant pour en savoir plus sur les composants de réseau virtuel Azure.