HaProxy 3.0 et Cluster Proxmox 8.2

modifié le : 5 juin 2024,
par Guillaume Chéramy
 

HaProxy 3.0

Une nouvelle version majeure du fameux load balancer HaProxy viens de sortir, la version 3.0.

Les nouveautés sont les suivantes : https://www.haproxy.com/blog/announcing-haproxy-3-0

La mise à jour de la 2.9 vers la 3.0 est passé comme une lettre ... juste en changeant les dépôts pour la 3.0.

curl https://haproxy.debian.net/bernat.debian.org.gpg | gpg --dearmor > /usr/share/keyrings/haproxy.debian.net.gpg
echo deb "[signed-by=/usr/share/keyrings/haproxy.debian.net.gpg]"       http://haproxy.debian.net bookworm-backports-3.0 main       > /etc/apt/sources.list.d/haproxy.list
apt update
apt-get install haproxy=3.0.\*
systemctl restart haproxy.service 

Load Balancer devant un cluster Proxmox

J'en profite pour rappeler la sortie récente de Proxmox LE concurrent opensource de VMWare pour la virtualisation, avec notement un assistant d'import de VMs depuis VMWare, une présentation des nouveautés.

Je ferais un article plus tard sur la mise en place d'un cluster, je présente ici ma configuration HaProxy en front du cluster.

Les avantages :

  • gestion du https depuis le proxy, avec notement la gestion des certificats ssl vu ici
  • les noeuds proxmox ne sont pas directement accessible donc protection de la console Proxmox
  • à partir du moment ou les noeuds Proxmox sont dans le cluster n'importe quel noeud peut être accessible depuis le load balancer

Ma configuration

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

    # See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
        ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
        ssl-default-bind-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
        ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets

        # For acme.sh
        setenv ACCOUNT_THUMBPRINT '***************'

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

# Frontends
frontend stats 
        bind 0.0.0.0:8080
        stats enable
        stats hide-version
        stats uri /
        stats realm Haproxy\ Statistics
        stats auth login:password
        stats refresh 10s

frontend web
    bind :80
    bind :443 ssl crt /etc/haproxy/certs/ strict-sni alpn h2,h2c,http/1.1
    http-request return status 200 content-type text/plain lf-string "%[path,field(-1,/)].${ACCOUNT_THUMBPRINT}\n" if { path_beg '/.well-known/acme-challenge/' }

    tcp-request inspect-delay 5s

    # Redirect ssl
    tcp-request content accept if { req_ssl_hello_type 1 }
    http-request redirect scheme https unless { ssl_fc }

    # forward header 
    option forwardfor

    # HSTS (63072000 seconds)
    http-response set-header Strict-Transport-Security max-age=63072000

    # fqdn-proxmox 
    acl host_pmx hdr(host) -i fqdn-proxmox
    use_backend pmx if host_pmx

    # fqdn-backups
    acl host_pmxbkp hdr(host) -i pmx-bkp.aukfood.ovh
    use_backend pmxbkp if host_pmxbkp

# Backends
backend pmx
   description Back-end proxmox
   mode http
   balance roundrobin
   option forwardfor
   option httpchk GET /
   cookie SERVERID insert indirect nocache
   http-request set-header X-Forwarded-Port %[dst_port]
   http-request add-header X-Forwarded-Proto https if { ssl_fc }

   server pmx-01 IP1:8006 cookie S1 check ssl verify none
   server pmx-02 IP2:8006 cookie S1 check ssl verify none
   server pmx-03 IP3:8006 cookie S1 check ssl verify none

backend pmxbkp
   description Back-end proxmox backup
   mode http
   balance roundrobin
   option forwardfor
   option httpchk GET /
   cookie SERVERID insert indirect nocache
   http-request set-header X-Forwarded-Port %[dst_port]
   http-request add-header X-Forwarded-Proto https if { ssl_fc }
   server pmx-bkp1 IP4:8007 cookie S1 check ssl verify none

On vois ici que j'utilises des ACLs pour suivant l'en-tête host qui arrive sur HaProxy la redirection se fasse directement vers le bon backend.

Voilà de quoi avoir une belle configuration HaProxy.