Vous êtes sur la page 1sur 22

Lecoeuvre Aymeric

Load Balancer - HAPROXY


OpenStack

Version : Etat : Date Création :

1.0 Production 05/06/18

Load Balancer - OpenStack 1 / 22


Lecoeuvre Aymeric

AUTEURS
Contributeur Courriel
LECOEUVRE Aymeric Lecoeuvrepro@gmail.com

MISES A JOUR
Version § Commentaires
V1.0 Version initiale

Load Balancer - OpenStack 2 / 22


Lecoeuvre Aymeric

DOCUMENTS ANNEXES

TERMINOLOGIE

Ce sigle signale une remarque importante dont il faut tenir compte.

Ce sigle signale une note, un exemple.

Ce sigle signale une remarque prioritaire.

Ce sigle signale une note technique

Les images utilisées sont libres de droit et issues des sites Microsoft Office® et OpenClipart.org.

Load Balancer - OpenStack 3 / 22


Lecoeuvre Aymeric

TABLE DES MATIERES


1. PRESENTATION DU PROJET ______________________________________________________________________ 5
1.1. OBJECTIFS ______________________________________________________________________________ 6
1.2. PREREQUIS _____________________________________________________________________________ 6

2. PRESENTATION HAPROXY ______________________________________________________________________ 7

3. TEMPLATE RESEAU ET LANCEMENT DES INSTANCES ______________________________________________________ 8


3.1. CREATION TEMPLATE RESEAU _________________________________________________________________ 8
3.2. LANCEMENT DE L’INSTANCE POUR HAPROXY ______________________________________________________ 9
3.2.1. Connexion à l’instance 14

4. LANCEMENT DES INSTANCES POUR NGINX __________________________________________________________ 15

5. CONFIGURATION DE HAPROXY _________________________________________________________________ 16


5.1. EQUILIBRAGE DE CHARGES __________________________________________________________________ 18

6. TESTS DES DIFFERENTS MODE DE BALANCING _________________________________________________________ 20


6.1. LEASTCONN ____________________________________________________________________________ 20
6.2. STATIC-ROUNDROBIN _____________________________________________________________________ 20
6.3. SOURCE ______________________________________________________________________________ 20

7. ANNEXES _________________________________________________________________________________ 21

Load Balancer - OpenStack 4 / 22


Lecoeuvre Aymeric

1. PRESENTATION DU PROJET
Dans ce projet nous allons mettre en place une répartition de charge qui va nous permettre de distribuer
une charge de travail entre différents ordinateurs d’un groupe. Cette répartition de charge ou load balancing
en anglais va nous permettre de réduire l’indisponibilité potentielle d’un service qui pourrait provoquer la
panne logicielle ou matérielle d’un unique serveur.
Nous allons utiliser cette technique dans le domaine des services http pour pouvoir gérer une centaine de
milliers de requêtes par seconde, et ainsi avoir un site web qui puisse gérer une forte audience.
Voici un schéma récapitulatif :

Load Balancer - OpenStack 5 / 22


Lecoeuvre Aymeric

Sur notre répartiteur de charge nous allons utiliser un algorithme qui s’appelle Round-Robin, le principe est
simple la première requête est envoyée au premier serveur, la seconde requête est envoyée au second
serveur et ainsi de suite jusqu’au dernier, puis un tour recommence avec une première requête au premier
serveur, etc…
Nous allons travailler sur un environnement Openstack, Sur Openstack nous avons un réseau externe et un
réseau privée, ce réseau privée sera associé à nos instances, en tout il y aura 4 instances :

 1 Load Balancer (HAPROXY sur Ubuntu)


 3 Serveur Nginx (Avec une Page web affichant le numéro du serveur)
Schéma de la topologie du réseau :

Réseau

Instance

1.1. OBJECTIFS

 Création d’un template pour la création du réseau et sous-réseau


 Lancement d’une instance Ubuntu pour le Load Balancer
 Lancement de 3 instances ubuntu pour les serveurs WEB (NGINX)
 Configuration du Load Balancer
 Test des différents modes de balancing (RoundRobin, Weight, High Avaibility)
 Test de fonctionnement

1.2. PREREQUIS

 Un environnement OpenStack avec un environnement client


 Heat
 Horizon (Dashboard Openstack)
 Connaissances des templates et savoir comment les mettre en places
 Connaissance sur la connexion à openstack depuis un client

Load Balancer - OpenStack 6 / 22


Lecoeuvre Aymeric

2. PRESENTATION HAPROXY
HaProxy est un logiciel gratuit et open source, il permet d’améliorer les performances et la fiabilité d’un
environnement serveur en répartissant la charge de travail sur plusieurs serveurs (par exemple, WEB,
application, base de données). Il permet aussi de mettre en place un proxy, il gère les protocoles
TCP/http/HTTPS. HaProxy est une solution qui peut être exécutée sous Linux, Solaris et FreeBSD.
HaProxy est utilisé par un certain nombre de sites Web comme Twitter, Speedtest.net, GitHub etc… il est
aussi utilisé dans le produit OpsWorks d’Amazon Web Services.
HaProxy peut gérer en ce qui concerne l’équilibrage de charge les listes de contrôle d’accès qui sont utilisées
pour tester certains conditions et effecteur une action (par exemple, sélectionner un serveur ou bloquer une
requête) en fonction du résultat du test. Il gére aussi le Backend et le FrontEnd, le backend est un ensemble
de serveurs qui reçoit des demandes renvoyées. Les Backends sont définis par une section appelé backend
dans la configuration d’HaProxy, une configuration dans sa forme la plus basique un backend peut être défini
par :

 Un algorithme de balancing
 Une liste de serveurs et de ports
Le frontend définit comment les requêtes doivent être transmises aux backends. Les interfaces sont définies
dans la section frontend de la configuration d’HaProxy. Leurs définitions sont composées des éléments
suivants :

 Un ensemble d’adresses IP et un port


 Liste de contrôles d’accès (ACL)
 Des règles use_backend, qui définissent les backends à utiliser en fonction des conditions ACL
correspondante.
Haproxy gère de nombreux algorithmes de balancing, voici une liste :

 RoundRobin (Chaque serveur est utilisé à tour de rôle, en fonction de leur poids)
 Static-rr (Algorithme similaire à RoundRobin sauf que le changement de poids ne se fait pas
directement)
 Leastconn (Le serveur avec le plus petit nombre de connexions reçoit la connexion)
 Source (L’adresse IP est hachée et divisée par le total poids des serveurs pour savoir qui recevra la
demande)
 Uri (Même principe que source sauf que le hache se fait sur l’URI)
 Url_param (Le paramètre d’URL spécifié dans l’argument sera recherché dans la chaîne de requête
de chaque requête http GET pour le transmettre au bon serveur)
 Hdr (cherche l’en-tête http dans chaque requête http)
 Rdp-cookie

Load Balancer - OpenStack 7 / 22


Lecoeuvre Aymeric

3. TEMPLATE RESEAU ET LANCEMENT DES INSTANCES


3.1. CREATION TEMPLATE RESEAU

heat_template_version: ocata
description: Non parametrable Private Network
resources:
private_network:
type: OS::Neutron::Net
properties:
name: lbaas-network
private_subnet:
type: OS::Neutron::Subnet
properties:
name: lbaas-subnet
network_id: { get_resource: private_network }
cidr: 172.16.1.0/24
dns_nameservers:
- 192.44.75.10
- 192.108.115.2
private_router:
type: OS::Neutron::Router
properties:
name: lbaas_router
external_gateway_info:
network: external
router-interface:
type: OS::Neutron::RouterInterface
properties:
router_id: { get_resource: private_router }
subnet: { get_resource: private_subnet }

Pour mettre en place le template il faut aller sur son interface client OpenStack et faire cette commande :

Openstack stack create lbaas-network -t hot/lbaas-network.yaml

Ce qui nous donne un réseau et un sous-réseau appelé lbaas-network.

Load Balancer - OpenStack 8 / 22


Lecoeuvre Aymeric

3.2. LANCEMENT DE L’INSTANCE POUR HAPROXY


Pour le lancement de l’instance il faut aller sur le DashBoard d’Openstack et s’y connecter

Pour se connecter à OpenStack il faut aller sur un navigateur et rentrer l’adresse qui correspond à OpenStack pour
arriver sur l’interface de connexion:

Load Balancer - OpenStack 9 / 22


Lecoeuvre Aymeric

Une fois sur l’interface de connexion il faut entrer ses identifiants :

Une fois les identifiants rentrés on arrive sur un dashboard, ce dashboard est un service qui s’appelle Horizon.

Voici une vue d’ensemble du menu :

Pour la création des instances


il faut aller dans ce menu :

Puis il faut aller dans ce sous-


menu :

Load Balancer - OpenStack 10 / 22


Lecoeuvre Aymeric

Pour le lancement d’une instance il faut aller dans « Lancer une Instance », ensuite une fenêtre s’ouvre, il faudra
remplir le nom de l’instance :

Load Balancer - OpenStack 11 / 22


Lecoeuvre Aymeric

Ensuite il faut définir une source :

Il faut définir non pour la création d’un nouveau volume et choisir Ubuntu comme source de démarrage. Ensuite il faut
définir un Gabarit :

Pour Le Load Balancer j’ai choisi un gabarit m1.small avec 1 cpu virtuel, 1 GO de Ram et un stockage de 3 GO.

Ensuite il faut définir le réseau :

Il faut sélectionner notre réseau créé par le template.

Load Balancer - OpenStack 12 / 22


Lecoeuvre Aymeric

Ensuite il faut selectionner notre paire de clé :

Et mettre un script de configuration pour permettre à l’instance de se connecter avec un mot de passe et d’avoir une
connexion internet.

#!/bin/bash

# Ubuntu User
sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
service sshd restart
echo "ubuntu:ubuntu" | chpasswd

# Proxy
echo 'Acquire::http::Proxy "http://VotreProxySiVousenavezun:3142";' > /etc/apt/apt.conf.d/01proxy

Ensuite il faut cliquer sur lancer l’instance.

Load Balancer - OpenStack 13 / 22


Lecoeuvre Aymeric

Ensuite il faut associer une adresse IP Flottante à l’instance :

Ensuite une fenêtre s’ouvre et il faut sélectionner l’adresse IP Flottante qu’on souhaite, s’il n’y a pas D’IP il faut cliquer
sur le petit plus à côté. Ensuite cliquer sur le bouton Associer.

3.2.1. Connexion à l’instance


Pour pouvoir se connecter à l’instance il faut ouvrir un connecteur SSH et rentrer l’adresse IP flottante dessus ainsi
que ça clé privée. Le nom d’utilisateur est ubuntu et le mot de passe est ubuntu aussi si vous n’avez pas de clé.

Load Balancer - OpenStack 14 / 22


Lecoeuvre Aymeric

4. LANCEMENT DES INSTANCES POUR NGINX


Pour le lancement des instances NGINX c’est exactement la même trame que pour l’instance HAPROXY sauf pour le
script de démarrage il y a un petit truc qui change, voici le script à mettre quand on lance les instances :

#!/bin/bash
# Ubuntu User
sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /etc/ssh/sshd_config
service sshd restart
echo "ubuntu:ubuntu" | chpasswd
# Proxy
echo 'Acquire::http::Proxy " http://VotreProxySiVousenavezun:3142";' > /etc/apt/apt.conf.d/01proxy
#update
apt-get update
#Nginx
sudo apt-get install -y nginx
echo "<h1>Serveur 1</h1>" > /var/www/html/index.nginx-debian.html

Ce qui a été rajouté c’est l’installation de Nginx et la modification de sa page html, entre les balises h1 se situe le
numéro du serveur Il faudra le changer pour le serveur 2 et le serveur 3. Ce qui nous donne :

Ensuite on peut vérifier que ça à fonctionner en allant sur un navigateur et en tapant les adresses IP Flottantes des
instances pour voir s’il y a bien NGINX dessus.

Load Balancer - OpenStack 15 / 22


Lecoeuvre Aymeric

5. CONFIGURATION DE HAPROXY
Tout d’abord il faut se connecter en ssh à la machine qui héberge le HAPROXY, on va d’abord vérifier que l’instance à
une connexion internet pour cela on va faire un ping vers google :

Ping 8.8.8.8

La réponse devrait être :

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.


64 bytes from 8.8.8.8: icmp_seq=1 ttl=53 time=12.1 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=53 time=12.1 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=53 time=12.1 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=53 time=12.5 ms

Ensuite on va installer HAPROXY :

Sudo apt-get install –y haproxy

Pour vérifier que l’installation à bien fonctionné il faut faire :

Haproxy -v

Ça devrait répondre :

HA-Proxy version 1.6.3 2015/12/25


Copyright 2000-2015 Willy Tarreau <willy@haproxy.org>

Load Balancer - OpenStack 16 / 22


Lecoeuvre Aymeric

La configuration principale de HAProxy se trouve dans /etc/haproxy/haproxy.cfg.

global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon

# Default SSL material locations


ca-base /etc/ssl/certs
crt-base /etc/ssl/private

# Default ciphers to use on SSL-enabled listening sockets.


# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
ssl-default-bind-
ciphersECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AES
GCM:RS+AES:RSA+3DES:!aNULL:!MD5:!DSS
ssl-default-bind-options no-sslv3

defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http

La section globale contient les paramètres qui s’appliquent au processus HAProxy lui-même. Cette section
contient les utilisateurs, les groupes, les directives de consignation et les statistiques. La section defaults
contient tous les paramètres des proxys
Après l'édition du fichier /etc/haproxy/haproxy.cfg, redémarrez le service haproxy pour que les
modifications prennent effet:
sudo service haproxy restart

Load Balancer - OpenStack 17 / 22


Lecoeuvre Aymeric

5.1. EQUILIBRAGE DE CHARGES

Maintenant, mettons HAProxy devant nos serveurs web.


Au bas du fichier /etc/haproxy/haproxy.cfg, en dessous des configurations listées ci-dessus, nous
ajouterons une ou plusieurs nouvelles sections. En plus de global et defaults on peut ajouter:

 Frontend: Définit un proxy inverse qui va écouter les demandes entrantes sur une adresse IP et un
port spécifiques.
 Backend: Définit un pool de serveurs vers lequel les requêtes frontend seront transférées.
 Listen: Une notation abrégée qui combine frontend et backend en une seule commande.

Définissons un premier frontend. Nous allons l'écouter sur l'adresse IP HAProxy au port 80. Pour cela il faut
ouvrir le fichier etc/haproxy/haproxy.cfg et rajouter ceci en bas du fichier:
frontend firstbalance
bind *:80
option forwardfor
default_backend webservers

On peut utiliser une adresse IP ou un astérisque qui signifie toute adresse IP configurée sur l’instance. On
peut ajouter autant de directives bind frontend qu’on le veut.
On peut également capturer l’adresse IP source du client dans les journaux de notre serveur WEB, pour
cela on a ajouté un en-tête appelé forwardfor à la requête entrante avant de la transmettre aux serveurs
Web. Ensuite, le serveur web peut rechercher et analyser cet en-tête pour obtenir l’adresse IP d’origine du
client.
On peut également ajouter une directive forwardfor à la section defaults afin qu’elle s’applique à tous les
mandataires.
Notre section frontend est configurée, via sa directive default_backend, pour rediriger les requêtes vers un
pool de serveurs défini dans une section backend appelée webservers. On peut distribuer la charge sur de
nombreux serveurs, il faut juste ajouter plus de directives server. Backend webservers partage le trafic de
manière égale entre deux serveurs web en utilisant l’algorithme roundrobin.
RoundRobin est l’algorithme d’équilibrage de charge par défaut si on n’utilise pas la directive balance. Une
directive balance peut-être définie dans une section backend ou globalement dans la section defaults.
On peut maintenant ajouter ceci en bas du fichier de configuration :
backend webservers
balance roundrobin
server webserver1 Your-Webserver1-IP:80
server webserver2 Your-Webserver2-IP:80

On peut vérifier que le fichier de configuration est valide en utilisant la commande suivante :
haproxy -f /etc/haproxy/haproxy.cfg -c

Load Balancer - OpenStack 18 / 22


Lecoeuvre Aymeric

Une fois qu’on a vérifié que le fichier était bon on peut redémarrer le service haproxy :
Sudo service haproxy restart

On peut avoir une autre alternative à la construction du fichier de configuration, au lieu d’avoir deux
sections frontend et backend on peut avec une section listen comme alternative par exemple :
listen firstbalance
bind *:80
balance roundrobin
option forwardfor
server webserver1 Your-Webserver1-IP:80
server webserver2 Your-Webserver2-IP:80

Voilà pour la configuration simple de Ha-Proxy. Pour essayer si ça fonctionne il faut aller sur un navigateur
et entrer l’IP flottante de l’instance dans la barre de navigation puis recharger la page pour voir s’il y a bien
un changement de serveur à chaque demande.

Voilà ça fonctionne.

Load Balancer - OpenStack 19 / 22


Lecoeuvre Aymeric

6. TESTS DES DIFFERENTS MODE DE BALANCING


Le mode de balancing RoundRobin a déjà été testé juste avant, on va donc se concentrer sur d’autre mode
de balancing

6.1. LEASTCONN

Le serveur avec le plus petit nombre de connexions reçoit la connexion. L’utilisation de cet algorithme est
recommandée lorsque de très longues sessions sont attendu, comme LDAP, SQL, TSE, etc ... mais ne va pas
très bien s’adapter aux protocoles utilisant des sessions courtes telles que HTTP. Cet algorithme est
dynamique, ce qui signifie que les poids de serveur peuvent être ajusté à la volée pour des démarrages
lents par exemple.
Voici la configuration d’HaProxy à mettre dans le fichier /etc/haproxy/haproxy.cfg :

listen firstbalance
bind *:80
balance leastconn
option forwardfor
server webserver1 Your-Webserver1-IP:80
server webserver2 Your-Webserver2-IP:80

6.2. STATIC-ROUNDROBIN

Cet algorithme est similaire à roundrobin sauf qu'il est statique, ce qui signifie que changer le poids d'un
serveur à la volé n'aura aucun effet.

listen firstbalance
bind *:80
balance static-rr
option forwardfor
server webserver1 Your-Webserver1-IP:80 weight 100
server webserver2 Your-Webserver2-IP:80 weight 50

6.3. SOURCE

L'adresse IP source est hachée et divisée par le total poids des serveurs en cours d'exécution pour désigner
quel serveur sera recevoir la demande. Cela garantit que la même adresse IP client atteindra toujours le
même serveur tant que le serveur répond.

listen firstbalance
bind *:80
balance Source
option forwardfor
server webserver1 Your-Webserver1-IP:80 weight 100
server webserver2 Your-Webserver2-IP:80 weight 50

Load Balancer - OpenStack 20 / 22


Lecoeuvre Aymeric

7. CONCLUSION
Pour conclure Nous avons pu mettre en place un load balancer HAPROXY qui peut gérer des serveurs WEB, nous avons
pu tester les différents modes de balancing que propose HAPROXY.

Load Balancer - OpenStack 21 / 22


Lecoeuvre Aymeric

8. ANNEXES
https://www.digitalocean.com/community/tutorials/an-introduction-to-haproxy-and-load-balancing-concepts

https://devops.profitbricks.com/tutorials/install-and-configure-haproxy-load-balancer-on-ubuntu-1604/

https://wiki.evolix.org/HowtoHaproxy

http://cbonte.github.io/haproxy-dconv/

Load Balancer - OpenStack 22 / 22

Vous aimerez peut-être aussi