Configuration Technique de Keepalived, HAProxy et ACL pour l'Équilibrage de Charge

  1. Principes de fonctionnement de Keepalived

Keepalived s'appuie sur le protocole VRRP (Virtual Router Redundancy Protocol) pour assurer la redondance. VRRP est conçu pour les réseaux routés afin d'éviter les pannes causées par un point de défaillance unique au niveau de la passerelle. Plusieurs équipements offrant des fonctions identiques sont virtualisés en un seul routeur. Un appareil master effectue le transfert des données réseau, tandis que les backups restent en veille. En cas de défaillance du master, une élection par priorité VRRP désigne un nouveau master.

Keepalived se compose de trois modules : core, check et vrrp. Le module core gère le démarrage du processus principal, le chargement et l'analyse des fichiers de configuration globaux. Le module check effectue des vérifications de santé périodiques. Le module vrrp implémente le protocole VRRP pour garantir la haute disponibilité entre les nœuds master et backup. De plus, Keepalived intègre IPVS pour contrôler l'état des serveurs backend, assurant ainsi leur disponibilité continue.

  1. Compilation et installation de HAProxy

2.1 Compilation de Lua 5.4

# Installation des dépendances
[root@serveur-principal ~]# yum install gcc readline-devel -y
# Téléchargement et extraction de Lua
[root@serveur-principal ~]# wget http://www.lua.org/ftp/lua-5.4.4.tar.gz
[root@serveur-principal ~]# tar -xzf lua-5.4.4.tar.gz -C /usr/local/src/
# Compilation
[root@serveur-principal ~]# cd /usr/local/src/lua-5.4.4/
[root@serveur-principal lua-5.4.4]# make linux
[root@serveur-principal lua-5.4.4]# src/lua -v
Lua 5.4.4  Copyright (C) 1994-2021 Lua.org, PUC-Rio

2.2 Compilation de HAProxy 2.4

# Installation des paquets requis
[root@serveur-principal ~]# yum install gcc openssl-devel pcre-devel systemd-devel -y
# Extraction du code source
[root@serveur-principal ~]# ls
haproxy-2.4.0.tar.gz
[root@serveur-principal ~]# tar -xzf haproxy-2.4.0.tar.gz -C /usr/local/src
# Compilation avec les modules nécessaires
[root@serveur-principal ~]# cd /usr/local/src/haproxy-2.4.0/
[root@serveur-principal haproxy-2.4.0]# make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_LUA=1 LUA_INC=/usr/local/src/lua-5.4.4/src LUA_LIB=/usr/local/src/lua-5.4.4/src
# Installation dans un répertoire personnalisé
[root@serveur-principal haproxy-2.4.0]# make install PREFIX=/opt/haproxy
# Création d'un lien symbolique
[root@serveur-principal haproxy-2.4.0]# ln -s /opt/haproxy/sbin/haproxy /usr/bin/
# Vérification de la version
[root@serveur-principal haproxy-2.4.0]# haproxy -v
HA-Proxy version 2.4.0 2021/05/14 - https://haproxy.org/

2.3 Configuration du service systemd pour HAProxy

[Unit]
Description=HAProxy Load Balancer
After=syslog.target network.target
[Service]
ExecStartPre=/usr/bin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
ExecStart=/usr/bin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid
ExecReload=/bin/kill -USR2 $MAINPID
LimitNOFILE=100000
[Install]
WantedBy=multi-user.target

2.4 Création du fichier de configuration principal

global
    maxconn 50000
    chroot /opt/haproxy
    stats socket /var/run/haproxy.sock mode 600 level admin
    user haproxy
    group haproxy
    daemon
    pidfile /var/run/haproxy.pid
    log 127.0.0.1 local2 info

defaults
    option http-keep-alive
    option forwardfor
    maxconn 50000
    mode http
    timeout connect 10000ms
    timeout client 50000ms
    timeout server 50000ms

listen stats
    mode http
    bind 0.0.0.0:8080
    stats enable
    log global
    stats uri /status
    stats auth admin:securite

listen web_service
    bind 10.0.0.1:80
    mode http
    log global
    server backend1 192.168.1.10:8080 check inter 2000 fall 2 rise 5

2.5 Démarrage et activation de HAProxy

# Création du répertoire pour le socket
[root@serveur-principal ~]# mkdir -p /var/run
# Création de l'utilisateur haproxy
[root@serveur-principal ~]# useradd -r -s /sbin/nologin haproxy
# Activation et démarrage du service
[root@serveur-principal ~]# systemctl enable --now haproxy.service
# Vérification du statut
[root@serveur-principal ~]# systemctl status haproxy.service
● haproxy.service - HAProxy Load Balancer
   Loaded: loaded (/usr/lib/systemd/system/haproxy.service; enabled)
   Active: active (running) since ...

  1. Algorithmes de répartition de charge dans HAProxy

3.1 static-rr

Algorithme de répartition par poids basé sur le round-robin. Il ne permet pas l'ajustement dynamique des poids via socat pendant l'exécution (seulement valeurs 0 et 1) et ne supporte pas le démarrage lent. Il n'y a pas de limite sur le nombre de serveurs backend. Similaire au wrr de LVS. Convient aux clusters web avec partage de session.

listen web_cluster
    bind 10.0.0.1:80
    mode http
    balance static-rr
    server node1 192.168.1.10:80 weight 1 check
    server node2 192.168.1.20:80 weight 2 check

3.2 first

Algorithme qui dirige les requêtes vers le premier serveur de la liste jusqu'à atteindre sa capacité maximale, puis passe au suivant. Ignore les poids. Ajustement dynamique limité à 0 et 1.

listen web_service
    bind 10.0.0.1:80
    mode http
    balance first
    server srv1 192.168.1.10:80 maxconn 100 weight 1 check
    server srv2 192.168.1.20:80 weight 1 check

3.3 roundrobin

Algorithme par défaut basé sur les poids avec support de l'ajustement dynamique et du démarrage lent. Chaque backend peut contenir jusqu'à 4095 serveurs réels. Très répandu pour les environnements web.

listen app_cluster
    bind 10.0.0.1:80
    mode http
    balance roundrobin
    server app1 192.168.1.10:80 weight 3 check
    server app2 192.168.1.20:80 weight 5 check

3.4 leastconn

Algorithme dynamique qui favorise le serveur avec le moins de connexions actives, pondéré par les poids. Supporte l'ajustement dynamique et le démarrage lent. Idéal pour les connexions longues comme les bases de données.

listen db_proxy
    bind 10.0.0.1:3306
    mode tcp
    balance leastconn
    server db1 192.168.1.30:3306 weight 1 check
    server db2 192.168.1.40:3306 weight 1 check

3.5 random

Utilise une clé de hachage basée sur un nombre aléatoire pour la répartition. Convient aux grands clusters ou aux environnements où les serveurs sont fréquemment ajoutés ou retirés. Les serveurs avec un poids élevé ont plus de chances de recevoir des requêtes.

listen cache_layer
    bind 10.0.0.1:80
    mode http
    balance random
    server cache1 192.168.1.50:80 weight 1 check
    server cache2 192.168.1.60:80 weight 2 check

3.6 source

Algorithme de hachage basé sur l'adresse IP source. Les requêtes provenant de la même source sont dirigées vers le même serveur. Utile pour maintenir les sessions sans cookies. Peut utiliser la méthode modulo ou le hachage cohérent via hash-type.

listen client_sessions
    bind 10.0.0.1:80
    mode tcp
    balance source
    hash-type consistent
    server backend1 192.168.1.70:80 check
    server backend2 192.168.1.80:80 check

3.7 uri

Hache l'URI de la requête pour diriger vers un serveur spécifique. Adopté aux serveurs de cache. Supporte les méthodes modulo et cohérente. Limité au mode HTTP.

listen web_content
    bind 10.0.0.1:80
    mode http
    balance uri
    hash-type consistent
    server static1 192.168.1.90:80 check
    server static2 192.168.1.100:80 check

3.8 url_param

Hache la valeur d'un paramètre spécifique dans l'URL pour assurer la continuité des sessions utilisateur. Si le paramètre est absent, utilise round-robin. Utile pour le suivi des utilisateurs.

listen user_tracking
    bind 10.0.0.1:80
    mode http
    balance url_param session_id
    hash-type consistent
    server node1 192.168.1.110:80 check
    server node2 192.168.1.120:80 check

3.9 hdr

Effectue un hachage sur une valeur d'en-tête HTTP spécifique, comme User-Agent. Si l'en-tête est manquant, utilise round-robin. Permet une répartition basée sur les caractéristiques du client.

listen client_based
    bind 10.0.0.1:80
    mode http
    balance hdr(Accept-Language)
    hash-type consistent
    server server1 192.168.1.130:80 check
    server server2 192.168.1.140:80 check

3.10 rdp-cookie

Pour le trafic de bureau à distance Windows (RDP), utilise un cookie pour maintenir les sessions. Supporte les méthodes modulo et cohérente.

listen rdp_services
    bind 10.0.0.1:3389
    mode tcp
    balance rdp-cookie
    hash-type consistent
    server rdp_host1 192.168.1.150:3389 check
    server rdp_host2 192.168.1.160:3389 check

  1. Implémentation de la séparation dynamique/statique avec ACL

4.1 Installation de HAProxy

Référez-vous à la section 2 pour les étapes d'installation.

4.2 Configuration des fichiers ACL

# Création du répertoire de configuration
[root@serveur-principal ~]# mkdir /etc/haproxy/conf.d

# Fichier de configuration pour la séparation
[root@serveur-principal ~]# cat /etc/haproxy/conf.d/web_split.cfg
frontend http_in
    bind 10.0.0.1:80
    mode http
    balance roundrobin
    log global
    option httplog

    acl static_content path_end -i .png .jpg .css .js
    acl dynamic_content path_end -i .php .asp

    use_backend static_servers if static_content
    use_backend dynamic_servers if dynamic_content
    default_backend dynamic_servers

backend static_servers
    mode http
    server file_server1 192.168.1.200:80 check inter 2000 fall 3 rise 5

backend dynamic_servers
    mode http
    server app_server1 192.168.1.210:80 check inter 2000 fall 3 rise 5

# Mise à jour du service systemd
[root@serveur-principal ~]# vim /usr/lib/systemd/system/haproxy.service
[Service]
ExecStartPre=/usr/bin/haproxy -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/ -c -q
ExecStart=/usr/bin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -f /etc/haproxy/conf.d/ -p /var/run/haproxy.pid

# Redémarrage du service
[root@serveur-principal ~]# systemctl daemon-reload
[root@serveur-principal ~]# systemctl restart haproxy.service

4.3 Configuration des serveurs backend

# Serveur pour contenu statique
[root@static-serveur ~]# yum install httpd -y
[root@static-serveur ~]# systemctl enable --now httpd
[root@static-serveur ~]# echo "Contenu statique" > /var/www/html/index.html

# Serveur pour contenu dynamique
[root@dynamic-serveur ~]# yum install httpd php -y
[root@dynamic-serveur ~]# systemctl enable --now httpd
[root@dynamic-serveur ~]# echo "<?php echo 'Contenu dynamique'; ?>" > /var/www/html/index.php

4.4 Validation du fonctionnement

# Test d'accès au contenu dynamique
[root@client ~]# curl http://10.0.0.1/index.php
Contenu dynamique

# Test d'accès au contenu statique
[root@client ~]# curl http://10.0.0.1/index.html
Contenu statique

Étiquettes: Keepalived VRRP HAProxy ACL Linux

Publié le 15 juin à 05h51