Aller au contenu

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
1
2
3
4
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
1
2
3
4
5
# 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 :