GlusterFS
è un file system di rete open source sviluppato da RedHat. A differenza di CephFS, è ideale per soluzioni semplici e rapide da deployare. Al contrario, Ceph offre funzionalità più avanzate e una migliore gestione dei carichi di lavoro intensi, a costo di una maggiore complessità di configurazione e manutenzione.
La situazione finale sarà quella di avere N nodi con un volume GlusterFS condiviso tra tutti. Su ciascun nodo verrà installato Docker e configurato un cluster Swarm. Per maggiori informazioni, si rimanda alla lettura dei precedenti articoli Docker Swarm e MicroCeph e anche Bilanciamento del carico con HAProxy.
Configurazione degli host #
Dal nostro nodo PVE, possiamo creare tre VM a partire da un template, avendo cura di aggiungere un secondo disco di storage dedicato a GlusterFS. Per ulteriori dettagli, leggere la guida dedicata alla creazione di una VM in PVE.
Nel nostro caso, abbiamo creato i seguenti 3 nodi basati su Debian:
- swarm-master: 10.10.1.10
- swarm-worker1: 10.10.1.11
- swarm-worker2: 10.10.1.12
Su ciascun nodo, si deve partizionare il secondo disco e formattarlo in ext4
, tramite i comandi fdisk
e mkfs
.
Per l’automount della partizione, una volta recuperato l’ID, creato la directory in cui questa sarà montata, si deve modificare il file /etc/fstab
di conseguenza. Ad esempio:
root@master:~# ll /dev/disk/by-uuid/
lrwxrwxrwx 1 root root 10 May 2 14:37 99c6a00f-e14d-4791-90a5-291b121421bd -> ../../sdb1
root@master:~# mkdir -p /mnt/glusterfs
root@master:~# cat /etc/fstab
UUID=99c6a00f-e14d-4791-90a5-291b121421bd /mnt/glusterfs ext4 defaults 0 0
Su ciascun nodo, dare quindi il comando systemctl daemon-reload
e successivamente mount -a
in modo che il filesystem sia montato in automatico.
La situazione finale dovrebbe essere simile alla seguente:
root@master:~# lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
sda
├─sda1 ext4 1.0 69b8ba3e-57a4-4ec6-abf8-cd5aff4935bc 13.7M 94% /
├─sda14
└─sda15 vfat FAT16 4E07-7ABB 112.1M 9% /boot/efi
sdb
└─sdb1 ext4 1.0 99c6a00f-e14d-4791-90a5-291b121421bd 29.7G 0% /mnt/glusterfs
Installazione di GlusterFS e Docker #
Per l’installazione di GlusterFS su Debian, seguire la documentazione ufficiale. Infine abilitare il seguente servizio: systemctl enable --now glusterfsd.service
.
Anche per l’installazione di Docker su Debian, si consiglia di seguire la guida ufficiale.
Inizializzazione dello storage #
Dal nodo master, dare i seguenti comandi per la creazione del cluster storage:
gluster peer probe <ip-node>
gluster peer probe 10.10.1.11
gluster peer probe 10.10.1.12
Per verificarne lo stato di salute esiste il comando gluster peer status
:
root@master:~# gluster peer status
Number of Peers: 2
Hostname: 10.10.1.12
Uuid: 4d03ab18-ef27-4d30-adfc-90c1359f6155
State: Peer in Cluster (Connected)
Hostname: 10.10.1.11
Uuid: fad285cd-23c9-43ff-aec7-c9e60e947e42
State: Peer in Cluster (Connected)
Per visualizzare i nodi attivi all’interno del cluster storage, esiste anche il comando gluster pool list
, che fornisce un elenco dettagliato dei nodi che compongono il cluster, mostrando informazioni chiave come l’UUID, l’indirizzo IP e lo stato di connessione di ciascun nodo:
root@master:~# gluster pool list
UUID Hostname State
4d03ab18-ef27-4d30-adfc-90c1359f6155 10.10.1.12 Connected
fad285cd-23c9-43ff-aec7-c9e60e947e42 10.10.1.11 Connected
0ed2edbd-908a-4430-b69b-a0498c7b6b97 localhost Connected
Creazione del volume GlusterFS #
Per creare e avviare il volume, dare i seguenti comandi:
gluster volume create <volume-name> replica <number-of-replicas> <node1>:<path> <node2>:<path> force
root@master:~# gluster volume create docker replica 3 10.10.1.10:/mnt/glusterfs/ 10.10.1.11:/mnt/glusterfs/ 10.10.1.12:/mnt/glusterfs/ force
root@master:~# gluster volume start docker
Per visualizzare tutte le informazioni in merito al volume appena creato:
root@master:~# gluster volume info
Volume Name: docker
Type: Replicate
Volume ID: faa0d6b7-be58-4064-a809-1be3b6f9107d
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: 10.10.1.10:/mnt/glusterfs
Brick2: 10.10.1.11:/mnt/glusterfs
Brick3: 10.10.1.12:/mnt/glusterfs
Options Reconfigured:
performance.client-io-threads: off
transport.address-family: inet
storage.fips-mode-rchecksum: on
cluster.granular-entry-heal: on
Montare il volume GlusterFS #
Su ciascun nodo, creare il punto di mount che verrà utilizzato per i volumi docker tramite il comando mkdir -p /opt/docker
. Quindi, creare il file /etc/systemd/system/opt-docker.mount
per gestire il mount del volume:
[Unit]
Description=GlusterFS Mount
After=glusterd.service
Requires=glusterd.service
[Mount]
What=localhost:/docker
Where=/opt/docker
Type=glusterfs
Options=defaults,_netdev,noatime
[Install]
WantedBy=multi-user.target
Avviare e abilitare il mount col comando systemctl enable --now opt-docker.mount
A questo punto si avrà a disposizione /opt/docker
come storage ridondato e sincronizzato per i vari volumi Docker. Questo approccio garantisce che i dati siano distribuiti e replicati attraverso i nodi, migliorando la disponibilità e la resilienza.
In alternativa alla creazione di un file di mount systemd, si può configurare il mount di GlusterFS aggiungendo la seguente riga nel file /etc/fstab
di ciascun nodo:
localhost:/docker /opt/docker glusterfs defaults,_netdev,noatime,x-systemd.automount 0 0
Dopo aver aggiornato il file /etc/fstab
, eseguire il seguente comando per ricaricare la configurazione di systemd e montare tutte le voci specificate:
systemctl daemon-reload && mount -a
Docker Swarm #
Riferirsi alla seguente guida per creare il cluster e aggiungere i vari nodi.
Una volta completata la configurazione del cluster, creare la seguente directory e il file index.html
:
mkrir -p /opt/docker/nginx/html && echo "NGINX SWARM" > /opt/docker/nginx/html/index.html
Infine, solo sul nodo master, creare il file docker-compose.yml
di esempio, che configura un web server NGINX per servire la pagina index.html
:
services:
webapp:
image: nginx:latest
volumes:
- /opt/docker/nginx/html:/usr/share/nginx/html
ports:
- "8080:80"
deploy:
replicas: 3
Infine, avviare lo stack con il seguente comando:
root@master:~# docker stack deploy -c docker-compose.yml website
Accedendo al browser web e collegandosi agli indirizzi http://10.10.1.10:8080/
(master), http://10.10.1.11:8080/
(nodo1) o http://10.10.1.12:8080/
(nodo2), sarà visibile la pagina web creata in precedenza.
HAProxy #
Per avere maggiori informazioni e dettagli, riferirsi all’articolo Bilanciamento del carico con HAProxy. In particolare, un esempio del file di configurazione /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.10:8080 check
server node2 10.10.1.11:8080 check
server node3 10.10.1.12:8080 check
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.