Load balancing avec HAProxy et Keepalived
Ce document décrit la mise en place d'un load balancer avec HAProxy et Keepalived. Ce
load balancer sert de point d'entrée pour un cluster Kubernetes.
Dans le cadre de ce guide, deux machines Ubuntu 22.04 sont utilisés :
isc-botalista-09 ayant le rôle MASTER ;
isc-botalista-10 ayant le rôle BACKUP.
Certificat SSL auto-signé
Générer un certificat auto-signé sur la machine MASTER. Ce dernier est nécessaire
pour HAProxy afin d'établir des connexions SSL.
Bash # Install openssl
sudo apt update && sudo apt install openssl && cd ~
# Generate the certificate and private key
sudo openssl req -newkey rsa:4096 -x509 -sha512 -days 365 -nodes \
-out bota-hepia.crt -keyout bota-hepia.key
# Combine them in a '.pem' file
cat bota-hepia.crt bota-hepia.key | sudo tee /etc/ssl/certs/bota-hepia.pem > /dev/null
# Remove the '.crt' and '.key' files
rm bota-hepia.crt bota-hepia.key
Envoyer une copie du fichier /etc/ssl/certs/bota-hepia.pem à toutes les machines
BACKUP.
HAProxy
HAProxy est utilisé pour rediriger les requêtes reçues sur un ensemble de serveurs
appelés backends .
L'installation et la configuration sont à effectuer sur les deux machines.
Installation
Bash sudo apt update
sudo apt install -y --no-install-recommends software-properties-common
sudo add-apt-repository ppa:vbernat/haproxy-3.0 -y
sudo apt install -y haproxy = 3 .0.\*
Configuration
Bash sudo nano /etc/haproxy/haproxy.cfg
Ajouter le contenu suivant dans le fichier de configuration :
Unix/Linux Config Files frontend apiserver
bind : 6443
mode tcp
option tcplog
default_backend controlplane
frontend default
bind : 80
# Not configured for now...
http-request deny status 501 content-type text/plain lf-string "501 Not Implemented"
backend controlplane
option httpchk
http-check connect ssl
http-check send meth GET uri /healthz
http-check expect status 200
mode tcp
balance roundrobin
server master1 10.136.26.73 : 6443 check verify none
server master2 10.136.26.74 : 6443 check verify none
server master2 10.136.26.75 : 6443 check verify none
Vérifier le fichier de configuration
Bash sudo haproxy -f /etc/haproxy/haproxy.cfg -c
Redémarrer et activer le service
Bash sudo systemctl restart haproxy
sudo systemctl enable haproxy
SSL
Voici un exemple de configuration SSL pour HAProxy.
Unix/Linux Config Files ...
frontend default_https
bind : 443 ssl crt /etc/ssl/certs/bota-hepia.pem
default_backend traefik_https
backend traefik_https
balance roundrobin
server worker01 10.136.26.71 : 30443 check ssl verify none
...
...
Troubleshooting
En cas d'erreur au démarrage de HAproxy, exécuter la commande suivante (en tant que
root) permet de déterminer plus précisément la cause du soucis.
Bash haproxy -f /etc/haproxy/haproxy.cfg -db
Keepalived
Keepalived est utilisé pour assurer la haute disponibilité du load balancer. Il permet
également de définir une adresse IP virtuelle qui est utilisée pour accéder au cluster
kubernetes.
L'installation et la configuration sont à effectuer sur les deux machines.
Installation
La dernière version de Keepalived n'est pas disponible via APT, il faut donc l'installer
via snap.
Bash # Install keepalived
sudo snap install keepalived --classic
# Add /snap/bin to your path
echo "PATH= $PATH :/snap/bin" >> ~/.bashrc && source ~/.bashrc
Configuration
Créer le fichier de configuration /usr/etc/keepalived/keepalived.conf suivant
Bash sudo mkdir -p /usr/etc/keepalived
sudo nano /usr/etc/keepalived/keepalived.conf
Unix/Linux Config Files vrrp_track_process haproxy {
process haproxy
weight 100
}
vrrp_instance haproxy-vip {
state ${STATE}
interface ${INTERFACE}
virtual_router_id 51
priority ${PRIORITY}
advert_int 1
virtual_ipaddress {
10.136.26.70
}
track_process {
haproxy
}
}
Les variables doivent être remplacées avec les valeurs suivantes :
${STATE}: MASTER pour isc-botalista-09, BACKUP pour isc-botalista-10 ;
${INTERFACE}: ens160 (doit correspondre à l'interface de vos machines) ;
${PRIORITY}: 101 pour isc-botalista-09, 51 pour isc-botalista-10 ;
Vérifier la configuration
Bash sudo keepalived -t
# If there is no output then the configuration is good
Redémarrer et activer le service
Bash sudo systemctl restart snap.keepalived.daemon
sudo systemctl enable snap.keepalived.daemon
Ressources
Certificat SSL :
HAProxy documentation :
HAProxy troubleshooting :
Keepalived documentation :
11 août 2024 16:57:40
30 mai 2024 14:32:08