Macchine Virtuali
Si può creare un cluster Swarm con un cero numero di macchine virtuali. Questa è la soluzione più intuitiva, ma richiede un periodo di preparazione lungo: provisioning manuale.
Il nostro progetto è dato dal diagramma.
Componenti
- 3 servers con Ubuntu Server su VirtualBox
- 1.5 GB RAM
- connessione NAT a internet tramite host
- Port Forwarding per accedere da host
- connessione a rete interna
- Docker installato
Steps di preparazione
-
Installazione di Ubuntu Server
-
Configurazione di Port Forwarding di VirtualBox
-
Login senza password
-
sudo senza password
-
Collegamento da Gnome Terminal
-
Clonare altre VM e modificarne
- hostname
- indirizzo IP
Installazione di Ubuntu Server
Ubuntu Server:
- E’ supportato da Docker
- E’ relativamente veloce nel boot e shutdown
- Non ha grafica
- Cut & Paste da terminale collegato in SSH
Installare la prima VM
- Settings: Adapter 1 in NAT, Adapter 2 su Internal network
- Seguire la procedura di installazione
- Lo hostname è gandalf
- Indirizzo IP su [eth1]: 192.168.10.2/24
- Utente john, password ‘password’
- Togliere richiesta di password a sudo
Installare Docker
sudo apt install docker.io
Test: pull di un’immagine Alpine
docker pull alpine
Port Forwarding da host a VM
Per la VM gandalf, dal manager VirtualBox:
- Aprire i
Settings
- Andare su
Networks -> Adapter 1
- Espandere
Advanced
- Cliccare su
Port Forwarding
- Salvare
Login senza password
Vogliamo compiere il login alle VM senza dover dare la password
Prima attivare la macchina virtuale e collegarsi (Esempio: gandalf, con porta 5682)
- Da Host, collegarsi:
ssh john@127.0.0.1 -p 5682
- Accettare la chiave crittografica
- Dare la password
- Scollegarsi
Ora installare l’utility sshpass:
sudo apt install sshpass
Creare un file con la password:
echo "password" > ~/.sshpass
Il collegamento è ora:
sshpass -f ~/.sshpass ssh john@127.0.0.1 -p 5682
sudo senza password
Assicurarsi prima che root abbia una password:
sudo passwd root
Modificare /etc/sudoers
su gandalf
:
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
In vi va salvato con :wq!
- NON SBAGLIARE
Logout da terminale e login di nuovo
Collegamento da Gnome Terminal
Nel terminale aprire le Preferenze:
Nel tab Command
inserire il Custom command
:
bash -c "sshpass -f ~/.sshpass ssh john@127.0.0.1 -p 5682"
Eventualmente cambiare colori, dimensioni, ecc.
Altre VM
Le altre VM sono clonate dalla prima
Modifiche, una per una, poi reboot
- Configurare il Port Forwarding al NAT prima del boot
- Settare il nome in /etc/hostname
- Settare gli indirizzi in
/etc/netplan/00-installer-config.yaml
Start di gollum, da solo (gandalf non deve essere attivo)
Modifiche ai file: /etc/hostname
sostituire gandalf con gollum
Modifiche al file /etc/netplan/00-installer-config.yaml
che deve diventare:
network:
ethernets:
enp0s3:
dhcp4: true
enp0s8:
addresses:
- 192.168.10.3/24
nameservers:
addresses: []
search: []
version: 2
Reboot
Clonare anche la VM grendel (192.168.10.4) ed apportare modifiche simili
Generare opportuni Gnome Terminal per gollum e grendel
Le tre VM collegate
Porte usate da Swarm
Le porte seguenti devono essere accessibili sui nodi dello Swarm. In qualche versione di sistema operativo sono aperte di default.
- 2377 TCP - per comunicazioni con i nodi manager
- 7946 TCP/UDP - per la scoperta dei nodi sulla rete overlay
- 4789 UDP - per il traffico sulla rete overlay
Il traffico sulla porta 4789 UDP, altrimenti detta porta VXLAN, non ha autenticazione. E' importante usare una rete intrinsecamente sicura. L'alternativa, non considerata qui, è di creare una rete overlay crittata, utilizzando IPSec ESP.
Se le porte non sono aperte, p.es. su sistemi Red Hat, Oracle o CentOS, su ogni nodo eseguire:
firewall-cmd --add-port=2376/tcp --permanent
firewall-cmd --add-port=2377/tcp --permanent
firewall-cmd --add-port=7946/tcp --permanent
firewall-cmd --add-port=7946/udp --permanent
firewall-cmd --add-port=4789/udp --permanent
firewall-cmd --reload
Quindi
systemctl restart docker
In caso di errori
firewall-cmd --remove-port=port-number/tcp —permanent.
Porte su Ubuntu e simili
Anche sui sistemi Debian occorre assicurarsi che le porte necessarie siano aperte.
Su ogni nodo dare il comando:
sudo iptables -A INPUT -p tcp --dport 2376 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 7946 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 4789 -j ACCEPT
sudo iptables -A INPUT -p esp -j ACCEPT
In particolare la porta 7946 viene usata dalla rete Ingress, e permette la visibilità all'esterno dei servizi del cluster.