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.

Vmclust

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

  1. Installazione di Ubuntu Server

  2. Configurazione di Port Forwarding di VirtualBox

  3. Login senza password

  4. sudo senza password

  5. Collegamento da Gnome Terminal

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

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.

Gnome Terminal

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

Tre VM

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.