Bilanciamento del carico con HAProxy

Una semplice introduzione a HAProxy, un versatile load balancer open source, che si occupa di distribuire il traffico web tra più nodi per garantire l’affidabilità del servizio, anche in caso di malfunzionamenti.

  ·   3 min read

HAProxy, che sta per High Availability Proxy, è un software open source TCP/HTTP Load Balancer (bilanciatore di carico), ovvero è un software che permette di distribuire connessioni in ingresso (frontend) verso uno o più server (backend). In questo modo è possibile migliorare sia la qualità del servizio offerto, sia l’affidabilità dello stesso.

ha-proxy

Nell’articolo Docker Swarm e MicroCeph abbiamo configurato un cluster swarm composto da tre nodi, ognuno dei quali serve una semplice pagina web ospitata su uno storage CephFS. Grazie a HAProxy, gli utenti accederanno alla pagina web tramite il proxy, che si occupa di instradare le connessioni verso uno dei tre server, garantendo così una distribuzione equilibrata del traffico e ottimizzando le prestazioni complessive del sistema.

Regole di firewall #

Per una gestione piú semplice, da Datacenter > Firewall > Security Group abilitiamo solo le seguenti regole:

sec-groups

Dalla nostra LAN, potremo accedere solamente al Proxy sulle porte 80 e 443 e questo si occuperà di distribuire il traffico tra i vari nodi. Inoltre, tutto il traffico UDP e TCP tra le VM é consentito.

Installazione #

Ora, creiamo una VM con Debian. Nel nostro caso, il proxy avrá l’indirizzo IP 10.10.1.5, mentre i tre nodi, rispettivamente 10.10.1.2, il master, 10.10.1.3, il nodo 1, e 10.10.1.4 il nodo 2.

HAProxy si installa molto semplicemente col comando apt install haproxy.

A questo punto possiamo fare una copia di backup del file di configurazione (utile nel caso avessimo problemi):

cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.originale

Configurazione #

La configurazione di seguito proposta bilancia le connessioni in ingresso sul loadbalance verso tre server web.

cat /etc/haproxy/haproxy.cfg

[...]

frontend webfrontend
    bind 10.10.1.5:80
    mode http
    option httpclose
    default_backend nodes_backend

backend nodes_backend
    mode http
    balance roundrobin
    option httpchk GET /
    server node1 10.10.1.2:8080 check
    server node2 10.10.1.3:8080 check
    server node3 10.10.1.4:8080 check

La direttiva bind 10.10.1.5:80 indica che HAProxy ascolta solo sull’interfaccia di rete con l’indirizzo IP 10.10.1.5 sulla porta 80, tipicamente utilizzata per traffico HTTP, inoltrando tutte le richieste al backend denominato nodes_backend.

mode http imposta la modalità HTTP per il frontend, permettendo a HAProxy di comprendere e manipolare le richieste e le risposte HTTP. option httpclose garantisce che le connessioni HTTP vengano chiuse correttamente al termine della risposta.

HAProxy riceve le richieste HTTP sulla porta 80 e le distribuisce in modo bilanciato, attraverso l’algoritmo roundrobin, verso i tre server configurati, monitorandone lo stato tramite richieste GET per garantire che solo i nodi disponibili ricevano traffico.

Avviare infine il servizio col comando systemctl enable --now haproxy.

Avvio del cluster swarm #

Con riferimento all’articolo precedente per maggiori dettagli, dal nodo master, assicuriamoci che lo storage CephFS sia correttamente montato e avviamo lo swarm:

root@master:~# docker stack deploy --compose-file docker-compose.yml website

root@master:~# docker service ps website_webapp
ID             NAME               IMAGE          NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
injr9s90j0dh   website_webapp.1   nginx:latest   master    Running         Running 10 seconds ago
eqxavzu5qffa   website_webapp.2   nginx:latest   node1     Running         Running 10 seconds ago
5p9n96dwcb9n   website_webapp.3   nginx:latest   node2     Running         Running 10 seconds ago

root@master:~# docker service ls
ID             NAME             MODE         REPLICAS   IMAGE          PORTS
bpvar0lj2xws   website_webapp   replicated   3/3        nginx:latest   *:8080->80/tcp

Collegandosi all’indirizzo 10.10.1.5 tramite un qualsiasi browser, la richiesta verrà instradata da HAProxy a uno dei tre nodi. Questo approccio garantisce che, in caso di malfunzionamento di uno dei nodi, il sito rimanga comunque accessibile.

ha-proxy-webpage

Riferimenti #