OVH Guide

Gestire un cluster di server Docker con Swarm

''

  • Cluster
  • Docker
  • Swarm
  • Master
  • Nodi

Con Swarm gestisci un cluster di server Docker come se si trattasse di un'unica macchina. Questo strumento utilizza le API standard di Docker messe a disposizione del cluster e permette di pianificare le attività e la distribuzione dei servizi delle risorse della macchina.

Il master genera codici e certificati necessari ad autenticarti sulle altre macchine; inoltre, grazie al TLS, permette scambi al sicuro da intrusi sui nodi (solo le macchine con i certificati possono connettersi ai client Docker delle macchine distanti).

Per eseguire queste operazioni, consulta la documentazione Docker ufficiale.

Una volta generati i certificati, occupati dei nodi. Nel nostro esempio il cluster è composto da 3 macchine (IP: 1.1.1.1, 2.2.2.2 e 3.3.3.3).

Copia i codici e i certificati generati nella cartella /etc/docker/certs/ sui nodi tramite il comando:

scp ca.pem server-cert.pem server-key.pem user@1.1.1.1:/etc/docker/certs/
scp ca.pem server-cert.pem server-key.pem user@2.2.2.2:/etc/docker/certs/
scp ca.pem server-cert.pem server-key.pem user@3.3.3.3:/etc/docker/certs/

Per una maggiore sicurezza del cluster, inserisci le regole IPtables sulla macchina master e sui nodi. Ecco un esempio delle regole IPtables applicabili.

Sui nodi

Installa le regole IPtables per:

# Conservare le connessioni stabilite
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Autorizzare il loopback
iptables -t filter -A INPUT -i lo -j ACCEPT

# ICMP (Ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT

# SSH In
iptables -t filter -A INPUT -s 4.4.4.4 -p tcp --dport 22 -j ACCEPT

# /!\ ATTENZIONE: verifica l'indirizzo IP inserito, deve corrispondere al tuo IP di connessione o all'indirizzo IP della macchina master, che saranno gli unici a poter accedere ai nodi in SSH.

# HTTP In
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT

# SSL In
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT

# Docker In
iptables -t filter -A INPUT -s 4.4.4.4 -p tcp --dport 2375 -j ACCEPT

# /!\ ATTENZIONE: verifica l'indirizzo IP inserito, deve corrispondere all'indirizzo IP della macchina master che sarà l'unico a poter accedere alla porta 2375.

# Impedire tutte le connessioni in entrata
iptables -P INPUT DROP
iptables -P FORWARD DROP

Quando hai definito le regole, registrale in modo che vengano eseguite all'avvio tramite:

apt-get install iptables-persistent

/!\ATTENZIONE: ti consigliamo di verificare il funzionamento corretto delle regole prima di registrarle. Se non le hai ancora registrate, in caso di problemi esegui un semplice riavvio delle tue macchine per effettuare un reset delle regole.

In qualsiasi momento, puoi aggiungere regole IPtables e registrarle tramite:

iptables-persistent save

Sulla maccina master

Installa le regole IPtables per:

# Conservare le connessioni stabilite
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# Autorizzare il loopback
iptables -t filter -A INPUT -i lo -j ACCEPT

# ICMP (Ping)
iptables -t filter -A INPUT -p icmp -j ACCEPT

# SSH In
iptables -t filter -A INPUT -s «IP pubblico della tua connessione o della tua VPN» -p tcp --dport 22 -j ACCEPT

# /!\ ATTENZIONE: verifica l'indirizzo IP inserito, deve corrispondere al tuo IP di connessione o alla tua VPN, che saranno gli unici a poter accedere alla macchina master in SSH.

# Impedire tutte le connessioni in entrata
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP

Quando hai definito le regole, registrale in modo che si eseguano all'avvio tramite:

apt-get install iptables-persistent

/!\ ATTENZIONE: ti consigliamo di verificare il funzionamento corretto delle regole prima di registrarle. Se non le hai ancora registrate, in caso di problemi esegui un semplice riavvio delle tue macchine per effettuare un reset delle regole.

In qualsiasi momento, puoi aggiungere regole IPtables e registrarle tramite:

iptables-persistent save

Dopo aver installato Docker sulle 3 macchine (cf. la nostra guida, puoi disporre anche delle istanze RunAbove in dotazione con Docker. Per maggiori informazioni, consulta questa guida). Puoi attivare un Docker daemon su una porta (ad esempio la 2375, porta ufficiale assegnata dallo IANA) per far dialogare le macchine con il master. Per farlo, chiudi Docker su tutte le macchine con questo comando:

service docker stop

Accedi alla cartella che contiene i certificati:

cd /etc/docker/certs

Avvia Docker utilizzando la porta 2375 con autenticazione TLS eseguendo su tutti i nodi questo comando:

docker -d --tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/server-cert.pem --tlskey=/etc/docker/certs/server-key.pem -H=0.0.0.0:2375 --label name=node1

docker -d --tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/server-cert.pem --tlskey=/etc/docker/certs/server-key.pem -H=0.0.0.0:2375 --label name=node2

docker -d --tlsverify --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/server-cert.pem --tlskey=/etc/docker/certs/server-key.pem -H=0.0.0.0:2375 --label name=node3

/!\ ATTENZIONE: queste opzioni non sono permanenti e, se la macchina si riavvia, bisogna utilizzarle per riavviare Docker. L'ideale è definirle nella variabile d'ambiente $DOCKER_OPTS. In Ubuntu, indicale in /etc/default/docker

Anche qui trovi un « --label name=node1 » con cui puoi assegnare un nome a tutti i nodi con la stessa label (in questo modo, con un sistema di regole, potrai attivare un container Docker su un nodo specifico).

Effettuata questa operazione, esegui la release del cluster via Swarm. Per prima cosa, genera un token (identificativo unico) corrispondente al tuo cluster, eseguendo questo comando sulla macchina master:

docker pull swarm:latest
docker run --rm swarm create
→ e71cc9b24e036030bb76d0a0bd072c2f

Il discovery utilizza di default il Docker Hub pubblico, ma esistono anche altri metodi per non dipendere dall'Hub (ad esempio, salvare tutto su altri server). Per maggiori informazioni, consulta questa documentazione.

Sempre dalla macchina master, avvia Swarm nel cluster su tutti i nodi e sulle loro integrazioni. Per farlo, utilizza il token creato precedentemente tramite questo comando:

docker --tls --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/client-cert.pem --tlskey=/etc/docker/certs/client-key.pem -H=tcp://1.1.1.1:2375 run -d swarm join --addr=1.1.1.1:2375 token://e71cc9b24e036030bb76d0a0bd072c2f

docker --tls --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/client-cert.pem --tlskey=/etc/docker/certs/client-key.pem -H=tcp://2.2.2.2:2375 run -d swarm join --addr=2.2.2.2:2375 token://e71cc9b24e036030bb76d0a0bd072c2f

docker --tls --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/client-cert.pem --tlskey=/etc/docker/certs/client-key.pem -H=tcp://3.3.3.3:2375 run -d swarm join --addr=3.3.3.3:2375 token://e71cc9b24e036030bb76d0a0bd072c2f

In questo modo i nodi sono integrati nel cluster e sono pronti a comunicare con la macchina master.

Ora puoi gestire il cluster dalla macchina master (IP : 4.4.4.4) su cui hai installato Docker:

docker run -v /etc/docker/certs/:/home/ --name swarm -d swarm manage --tls --tlscacert=/home/ca.pem --tlscert=/home/client-cert.pem --tlskey=/home/client-key.pem token://e71cc9b24e036030bb76d0a0bd072c2f

Con il parametro «-v /etc/docker/certs/:/home/» puoi creare una directory comune tra il master e il container Swarm in esecuzione su questa stessa macchina. In questo modo il container può accedere ai certificati generati precedentemente.

Swarm sarà accessibile solo localmente dalla porta 2375 (la stessa porta di comunicazione utilizzata dai nodi) e gestirà il cluster corrispondente al token «e71cc9b24e036030bb76d0a0bd072c2f» che hai creato.

Eseguita questa operazione, puoi generare un elenco delle macchine collegate al tuo cluster tramite il comando:

docker run --rm swarm list token://e71cc9b24e036030bb76d0a0bd072c2f
→ 1.1.1.1:2375
→ 2.2.2.2:2375
→ 3.3.3.3:2375

e verificare il corretto funzionamento di Swarm creando un alias con cui recuperare l'IP del tuo container:

alias dockip="docker inspect --format '{{ .NetworkSettings.IPAddress }}'"

Il comando

docker --tls -H=tcp://$(dockip swarm):2375 info

dovrebbe restituirti la lista dei nodi e il numero di container attivi su di essi.

Per semplificare il comando, puoi creare un altro alias digitando:

alias swarmdock="docker --tls -H=tcp://$(dockip swarm):2375"

e poi:

swarmdock info

Se vuoi che gli alias siano permanenti, crea un file .bash_aliases nella tua cartella personale (per farlo, consulta la documentazione ufficiale disponibile: http://tldp.org/LDP/abs/html/aliases.html).

Se invece vuoi avere l'elenco di tutti i container attivi nel tuo cluster, utilizza questo comando:

swarmdock ps

Per visualizzare separatamente l'elenco dei container attivi sui singoli nodi, utilizza questi comandi:

docker --tls --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/client-cert.pem --tlskey=/etc/docker/certs/client-key.pem -H=tcp://1.1.1.1:2375 ps

docker --tls --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/client-cert.pem --tlskey=/etc/docker/certs/client-key.pem -H=tcp://2.2.2.2:2375 ps

docker --tls --tlscacert=/etc/docker/certs/ca.pem --tlscert=/etc/docker/certs/client-cert.pem --tlskey=/etc/docker/certs/client-key.pem -H=tcp://3.3.3.3:2375 ps

Ciò significa che puoi eseguire indipendentemente i comandi Docker della versione base (docker images, docker run, docker inspect...) su ciascuno dei nodi.

A questo punto, dalla tua macchina master puoi riempire i container sui tuoi nodi.

Esempio → esegui un'istanza MySQL su uno dei nodi del cluster:

docker --tls -H=tcp://$(dockip swarm):2375 run -e MYSQL_ROOT_PASSWORD=tuapassword --name db -v /home/mysql/:/var/lib/mysql/ -d mysql:latest

o utilizzando l'alias creato:

swarmdock run -e MYSQL_ROOT_PASSWORD=tuapassword --name db -v /home/mysql/:/var/lib/mysql/ -d mysql:latest

Verifica che l'esecuzione del tuo container su uno dei nodi sia corretta con «docker --tls -H=tcp://$(dockip swarm):2375 ps» o «swarmdock ps»:

cc4fbda67cf4 mysql:latest "/entrypoint.sh mysq 29 seconds ago Up Less than a second 3306/tcp swarmjo/db

Grazie a un algoritmo di tipo Bin Packing, quando la prima macchina è piena si passa automaticamente alla seconda. È possibile anche creare regole più specifiche con label personalizzate o utilizzare un sistema di regole per gestire delle preferenze, cioè ordinare al sistema di dare priorità a una certa istanza su un host specifico. Ad esempio, se vuoi mettere in esecuzione un container MySQL sul nodo con nome «node3»:

swarmdock run -e MYSQL_ROOT_PASSWORD=tuapassword -e constraint:name==node3 --name bdd2 -v /home/mysql/:/var/lib/mysql/ -d mysql:latest

Nell'esempio, la regola «name==node3» stabilisce che il container venga eseguito solo sulla macchina 3.3.3.3. Attenzione: la cartella /home/mysql sarà localizzata sul node3. Se devi ricreare il container, assicurati di farlo sul nodo giusto.

Se vuoi avviare WordPress sulla stessa macchina:

swarmdock run --name wp1 --link bdd2:mysql -e constraint:name==node3 -v /home/wp/:/var/www/html/ -p 80:80 -d wordpress:latest

Esempi di regole:

constraint:name!=node1 apre il container su tutti i nodi, escluso il nodo 1. constraint:name==/node[12]/ apre il container sui nodi 1 e 2. constraint:name!=/node[12]/ apre il container su tutti i nodi, esclusi i nodi 1 e 2.

Per maggiori informazioni sulle regole possibili, consulta la documentazione ufficiale di Docker: https://docs.docker.com/swarm/scheduler/filter/

A questo punto hai un sistema di gestione delle tue macchine Docker e puoi occuparti delle applicazioni/container nel tuo cluster in modo semplice e veloce. Inoltre Docker Inc ha intenzione di diffondere container su grande scala ancora più performanti, integrando Docker Compose(1) a Swarm. Oltre ai servizi già elencati, Docker Inc. ospita e gestisce la soluzione Docker Hub Enterprise (DHE), che completa il Docker Public Hub e propone alle società la possibilità di disporre di un registro privato. La rivoluzione Docker continua: se vuoi farne parte e provare questa soluzione, accedi alla nostra Alpha Sailabove disponibile su https://labs.runabove.com/docker/. Stiamo realizzando anche un template Ubuntu 14.04 preinstallato su VPS Cloud e VPS Classic (disponibile con tutte le nostre offerte VPS, tranne Classic 1), in modo che la tua macchina sia pronta ad avviare i container usufruendo dei vantaggi delle offerte VPS OVH.

Con Docker Compose(1) gli sviluppatori possono utilizzare applicazioni di container Docker autonome e interoperanti, utilizzando un semplice file di configurazione YAML con la definizione di ogni container. Per maggiori informazioni, consulta la documentazione Docker ufficiale https://docs.docker.com/compose/.