Configurez simplement la répartition de charge entre des containers
Un article pas-à-pas pour apprendre comment déployer proprement deux serveurs web en containers Docker et répartir la charge entre eux depuis un serveur Nginx frontal.
Docker, la technologie qui est devenue le format de facto des containers ne supporte pas la haute disponibilité. Lorsqu’un nœud Docker défaille, le service qu’il hébergeait est perdu. Pour éviter cet écueil, il est possible d’utiliser en amont le répartiteur de charge de Nginx, lequel apporte haute disponibilité et élasticité.
Nginx est un serveur web Open source qui fournit aussi des fonctions de routage et de répartition de charge de niveau 7, conçues pour optimiser les performances des applications web. Voici comment s’y prendre pour mettre en place une configuration avec deux nœuds applicatifs, accessibles depuis un répartiteur de charge.
Installer les deux serveurs web avec Docker et Nginx
Commençons par nos serveurs web. Installez deux instances Ubuntu sur deux serveurs et attribuez-leur une adresse IP statique. Puis, utilisez la commande suivante sur chacun d’eux pour déployer une instance Docker de base, qui servira à exécuter le serveur web Nginx :
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install docker.io -y
La commande install docker.io installe juste le système Docker depuis le dépôt Ubuntu. Mais avant de mettre en route l’instance Docker à proprement parler, faites-en sorte que vos pages web soient stockées en dehors de celle-ci. Cette étape garantit que toutes les instances Docker iront chercher le même code HTML et elle permettra aux développeurs web de contrôler leurs codes successifs par numéros de version. Sur chaque serveur, créez de fait un nouveau répertoire dans lequel nous hébergerons les données HTML :
mkdir -p /data/www
Puisqu’une page par défaut doit s’afficher lorsque le répartiteur de charge enverra du trafic, créez une page web simple sur chaque nœud avec un texte au format HTML qui fera office de page d’index :
echo "<h1>Hello 1</h1>" > /data/www/index.html
Pensez, sur le second serveur, à remplacer « Hello 1 » par « Hello 2 ». À présent, lancez la commande suivante sur chaque serveur pour y activer le service web :
docker run --name nginx -v /data/www:/usr/share/nginx/html:ro -d -p 80:80 nginx
Cette commande active l’instance Docker, lance Nginx et fait correspondre le chemin /usr/share/nginx/html par défaut au répertoire /data/www du serveur, en lui attribuant un accès en lecture seule. Cette manière de faire économise de l’espace, car elle évite d’avoir des dizaines d’instances. Elle permet aussi d’avoir la même configuration partout.
Ensuite, dans la configuration réseau de chaque serveur, exposez le service web Nginx sur le port 80, de sorte que les requêtes en provenance du répartiteur de charge arrivent bien à Nginx.
Configurer le répartiteur de charge
À présent, passons au répartiteur de charge. Ce service peut tourner dans un container Docker, mais, dans le cadre de cet article, nous l’exécuterons depuis une machine virtuelle standard.
Installez un troisième serveur Ubuntu, puis lancez-y les commandes suivantes pour y installer Nginx :
sudo apt-get update
sudo apt-get upgrade -y
sudo apt-get install nginx -y
Redémarrez la machine virtuelle et assurez-vous que la page par défaut de Nginx s’affiche correctement depuis un navigateur web. Ensuite, configurons Nginx pour qu’il passe de serveur web à répartiteur de charge. Sur un serveur Ubuntu fraîchement installé, le fichier de configuration de Nginx est /etc/nginx/nginx.conf.
La configuration est simple. Le composant de répartition de charge comprend deux étapes : définir un groupe de serveurs vers lesquels répartir la charge, puis dire à Nginx de passer telles requêtes vers l’un des serveurs web du groupe.
Par défaut, Nginx utilise un algorithme de Round-Robin, qui consiste à faire passer les requêtes vers les serveurs à tour de rôle. Des alternatives sont possibles, comme le choix du serveur selon l’adresse IP, notamment pour les sessions qui ont besoin de toujours s’exécuter sur le même serveur, ou si l’on souhaite qu’un même serveur exécute toutes les requêtes d’un même utilisateur.
Faites une copie du fichier de configuration par défaut, au titre de sauvegarde, puis remplacez le contenu du fichier nginx.conf courant par ceci :
http {
upstream backend {
server 192.168.0.97;
server 192.168.0.98;
}
server {
listen 80;
location / {
proxy_pass http://backend;
}
}
}
Le « upstream backend », qui peut d’ailleurs avoir n’importe quel nom, définit le groupe de serveurs vers lesquels répartir la charge. Les deux lignes qui suivent indiquent leur adresse IP ; il est possible d’indiquer des noms de domaine. Le paragraphe « server » indique que le port 80 acceptera les requêtes. Ses deux dernières lignes implémentent le service de proxy : le chemin « / » indique que tout le trafic arrivant sur ce serveur doit passer par le service de répartition de charge, et la commande « proxy_pass » précise quel groupe de serveurs utiliser, en l’occurrence « backend », que l’on a défini juste avant.
Lancez à présent cette commande pour relancer Nginx de sorte qu’il active son service de répartition de charge :
sudo systemctl reload nginx
Enfin, ouvrez un navigateur web et entrez l’adresse IP ou l’URL du serveur de répartition de charge. Si tout s’est passé comme prévu, vous devriez voir apparaître « Hello 1 », ou « Hello 2 », selon le serveur web auquel le répartiteur de charge a décidé de passer la requête.