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.
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:
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.