Docker Swarm consente di creare un cluster di host Docker (nodi) per distribuire e gestire applicazioni containerizzate. Il cluster è composto da uno o piú nodi manager (Docker consiglia un massimo di sette per cluster), che orchestrano le attività e comunicano con i worker, che eseguono i singoli task. Questo sistema garantisce tolleranza agli errori: se un nodo fallisce, il manager ridistribuisce automaticamente le attività su altri nodi. Se il nodo manager si blocca, lo swarm continua a funzionare normalmente, poiché i worker eseguono ancora i container assegnati. Tuttavia, non sarà possibile interagire con il cluster (ad esempio per monitorarne lo stato o effettuare nuove distribuzioni) fino a quando non verrà ripristinato o sostituito il nodo manager. Per questo motivo, è consigliabile configurare più nodi manager, in modo che in caso di guasto del manager primario, un altro possa assumere il controllo senza interruzioni nel monitoraggio e nella gestione del cluster.
MicroCeph, invece, è il modo più semplice per iniziare a utilizzare Ceph, un sistema di storage distribuito open source. Grazie alla sua architettura decentralizzata e distribuita, Ceph distribuisce il carico su molteplici nodi, offrendo così una robusta tolleranza ai guasti, garantendo la continuità del servizio. Ceph supporta vari tipi di storage, tra cui:
- storage a oggetti
- storage a blocchi
- file system distribuito
Creazione di un cluster Docker Swarm
Security Group
Innanzitutto, è necessario creare un security group, definendo le regole da applicare alle varie VM, così da non dover creare le regole per ogni singolo host. Per approfondimenti, consultare l’articolo su come gestire il firewall di PVE. In particolare, occorre consentire il traffico dalle seguenti porte:
- porta 2377 TCP: utilizzata per la comunicazione tra i nodi manager
- porta 7946 TCP/UDP: necessaria per il discovery dei nodi
- porta 4789 UDP: Swarm VXLAN port
- porte 6800-7300 TCP: dedicata agli OSD di Ceph
- porta 3300 TCP: utilizzata dai Ceph clients e dai Ceph daemons per connettersi al Ceph Monitor. Questa porta è la scelta preferita rispetto alla 6789
- porta 6789 TCP: alternativa da utilizzare se la porta 3300 non fosse disponibile
- porta 22 (SSH) dalla LAN: per consente connessioni SSH dalla rete
192.168.0.0/24
Per semplicità, si puo’ decidere di consentire tutto il traffico tra i nodi
Creazione VM
Si consiglia di creare una VM template con Docker e MicroCeph già installati, da clonare successivamente per realizzare il cluster. Per procedere con la creazione, seguire questi passaggi:
Aggiungere ora Cloud-Init:
Impostare quindi l’utente, la password, la rete, ecc. e cliccare Regenerate Image
Scaricare sulla propria macchina l’immagine disco genericcloud di Debian da Official Cloud Images nel formato qcow2 e, tramite rsync, spostarla sul nodo PVE in /var/lib/vz/template/qcow:
Quindi importare il disco sulla VM appena creata:
|
|
Assegnare ora il disco alla VM:
Assegnare il security group creato in precedenza:
Infine, possiamo avviare la VM e verificare che la rete funzioni. Si consiglia di installare il pacchetto qemu-guest-agent:
Assicurarsi che il boot order sia corretto
Se tutto é funziona come previsto, si consiglia di eseguire uno snapshot.
Docker
Per installare docker su Debian, seguire la guida ufficiale
MicroCeph
Per installare MicroCeph su Debian, seguire i passaggi indicati da Canonical:
Quindi procedere coi seguenti passaggi:
Infine, dare il comando truncate -s 0 /etc/machine-id.
Creazione dei nodi
Spegnere la VM e procedere con la clonazione, in modo ottenere il numero di nodi desiderato. Nel nostro caso, creeremo tre nodi:
Ricordarsi di assegnare gli indirizzi IP corretti alle VM da
Cloud-Init, cliccando poi il pulsanteRegenerate Image. Nel nostro caso:swarm-master: 10.10.1.10
swarm-worker1: 10.10.1.11
swarm-worker2: 10.10.1.12
Creazione di uno swarm
Dal nodo manager, dare il comando:
L’output dovrebbe essere simile al seguente:
|
|
Aggiungere nodi al cluster swarm
Dai due nodi worker:
|
|
Dal nodo manager si dovrebbero vedere tutti i nodi appartenenti al cluster:
Microceph multi-node cluster
Un cluster Ceph richiede come minimo tre OSD (Object Storage Daemon). Questo significa che, per formare un cluster stabile ed efficiente, ognuna delle tre macchine deve avere un disco dedicato esclusivamente per Ceph.
Iniziamo quindi aggiungendo, su tutte le VM, un secondo disco di storage dedicato a MicroCeph:
Ora bisogna impedire che MicroCeph si aggiorni automaticamente:
|
|
Per creare un cluster, ogni nodo deve avere la stessa versione del software installata e non deve essere soggetto ad aggiornamenti automatici che potrebbero introdurre modifiche non controllate. Quindi, è necessario disabilitare gli aggiornamenti su ciascun nodo.
Sul nodo master eseguire il comando per inizializzare il cluster: microceph cluster bootstrap. Si devono quindi generare i token necessari per aggiungere gli altri nodi. Sempre dal master:
|
|
Aggiunta dei nodi al cluster
Per effettuare il join, eseguire il comando seguente sui rispettivi nodi:
|
|
Aggiunta dello storage
Su tutti i nodi, eseguire il comando seguente per aggiungere il disco al cluster MicroCeph:
|
|
Per vedere la lista dei dischi:
|
|
Controllare lo status di MicroCeph
Su uno qualsiasi dei tre nodi, si puo’ invocare il seguente comando per controllare lo stato di MicroCeph:
|
|
Oltre ai comandi specifici di MicroCeph, è possibile utilizzare gli strumenti nativi di Ceph per compiti amministrativi. Ad esempio, il comando ceph status fornisce informazioni dettagliate sullo stato di salute del cluster e dei servizi (monitor, manager e OSD).
Per maggiori informazioni, leggere la guida Multi-node install.
CephFS
CephFS è un filesystem distribuito progettato per offrire scalabilità, disponibilità e resilienza. Un filesystem Ceph richiede almeno due pool RADOS: uno per i dati e uno per i metadati. I dati sono i file effettivi, mentre i metadati contengono informazioni sul filesystem, come la struttura delle directory e i permessi dei file.
Dal nodo master, dare i seguenti comandi per creare i due pool:
Per creare il filesystem:
Per vedere i filesystem presenti sul sistema:
fstab
Se si desidera che il filesystem si monti automaticamente al boot, aggiungerlo a /etc/fstab su tutti i nodi del cluster:
|
|
Nel nostro caso:
|
|
In particolare:
noatime: impedisce l’aggiornamento dei timestamp di accesso ai file (atime) ogni volta che un file viene letto. È utile per migliorare le prestazioni su filesystem con accessi frequenti_netdev: indica che il filesystem dipende dalla rete. Viene utilizzato per evitare che il sistema tenti di montare il filesystem prima che la rete sia completamente attivax-systemd.automount: questa opzione gestisce il montaggio automatico del filesystem tramite systemd
La secret-key si trova in /var/snap/microceph/current/conf/ceph.keyring o in /etc/ceph/ (se é stato creato il link simbolico, come indicato durante la creazione del template).
Su tutti i nodi, dare quindi il comando systemctl daemon-reload e successivamente mount -a in modo che il filesystem sia montato in automatico.
Perform IO
Un rapido test a filesystem montato:
Deploying di una webpage
Ora che il filesystem é montato, creare da uno qualsiasi dei nodi la directory /mnt/cephfs/html e il file index.html al suo interno, col seguente contenuto:
|
|
Sul nodo master creare il file docker-compose.yml:
Importante: creare la regola per consentire l’accesso alla porta
8080delle VM dalla rete192.168.0.0/24dal Security Group di PVE
Ora possiamo avviare lo stack:
|
|
Vediamo che é correttamente replicato:
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 seguente pagina web:
Nel caso in cui uno dei nodi riscontri problemi, la pagina web rimarrà comunque accessibile tramite gli altri nodi, grazie anche al filesystem distribuito, garantendo così la resilienza e la continuità del servizio.
Per rimuovere lo stack utilizzare il comando: docker stack rm mystack dal master-node dello swarm.
Video
Un ottimo video che riassume molti passaggi:
Riferimenti
Docker
MicroCeph
- Install MicroCeph on Debian
- MicroCeph documentation
- Ceph Firewall Ports
- Try Microceph for an Easy Ceph Install
- How I Deployed a Self-Hosting Stack with Docker Swarm & MicroCeph
- How to mount ceph fs with Microceph?
CephFS
- Create CephFS
- Mount CephFS
- Mount CephFS in fstab
- CephFS for Docker Container Storage
- Ceph Dashboard Install and Configuration for Microceph