Xavi Bonet

hola@xavibonet.cat

Crear un clúster de 3 nodes amb VirtualBox

Global Data Nodes

En aquesta entrada, aprendrem a crear un clúster de 3 nodes d’Ubuntu allotjats en màquines virtuals amb VirtualBox en un equip amb Windows 10.

Les màquines estan pensades per provar aplicacions de Big Data amb un sistema de fitxers distribuït i, per tant, es presenten uns requisits concrets:

  • Els nodes han de poder parlar entre ells mitjançant ssh
  • Des de la màquina host s’ha de poder accedir a totes les màquines mitjançant ssh

Software necessari

Creació de la màquina virtual del primer node del clúster

Abans de començar, ens hem d’assegurar que tenim instal·lat VirtualBox i haver descarregat una imatge d’Ubuntu Server 16.04.

Obrim VirtualBox i pitgem a Nova per crear una nova Màquina Virtual (a partir d’ara VM).

Captura VirtualBox - nova Màquina Virtual
Captura VirtualBox – nova Màquina Virtual

Els següents paràmetres dependran de l’ús que es vulgui donar a les VM i de les característiques de l’equip des del que s’estigui treballant. En el meu cas, he fet servir:

  • Mida de la memòria: 2048MB
  • Disc dur: Crea un disc virtual ara
  • Tipus de disc dur: VDI (VirtualBox Disk Image)
  • Mida del fitxer: 10GB
  • Emmagatzematge al disc dur físic: Ubicat de forma dinàmica

Un cop creada la VM, configurarem els paràmetres de xarxa de manera que ens permetin:

  1. Tenir accés a les màquines virtuals des de l’equip hoste.
  2. Disposar de connexió a internet (a través de la xarxa de l’equip hoste)
  3. Disposar d’una xarxa “local” pròpia del clúster per a que les màquines puguin comunicar-se entre si.

Seleccionem la VM, en aquest cas la node1, i entrem a paràmetres. S’obrirà una nova finestra on es poden acabar d’ajustar alguns aspectes de configuració.

Seleccionem Xarxa, i ens assegurem de que els Adaptadors 1 i 2:

  1. Tinguin marcada la casella “Habilita l’adaptador de xarxa
  2. Estiguin connectats a un “adaptador pont

Els altres paràmetres seran els que ja estan per defecte. Els adaptadors 3 i 4 els deixarem deshabilitats.

Instal·lació i configuració d’Ubuntu Server al node1

Amb tots els paràmetres configurats, arranquem la VM per primera vegada. Se’ns demanarà un disc d’arrencada. Cerquem la imatge d’Ubuntu Server 16.04 i la marquem com a dic d’arrencada. A partir d’aquí haurem de seguir els passos habituals per a instal·lar Ubuntu amb els paquets i configuracions mínims.

NOTA: És important fer servir aquesta versió d’Ubuntu, ja que en les versions posteriors han canviat algunes instruccions de configuració i aquest tutorial, possiblement, no serà vàlid.

Captura VirtualBox - Inserir Disc d'arrencada
Captura VirtualBox – Inserir Disc d’arrencada

Amb el Sistema Operatiu ja funcionant, comprovem que hi podem accedir sense problemes introduint el nom d’usuari i la contrasenya. Els següents passos seran instal·lar Python i el paquet d’OpenSSH per tal de poder accedir a la màquina via SSH.

$sudo apt-get update
$sudo apt-get install python
$sudo apt-get install openssh-server

Configurar l’adaptador de xarxa

A continuació, caldrà configurar l’adaptador de xarxa de la VM per a que compleixi els requisits ja esmentats.

Podem consultar el nom de la màquina i l’adreça IP assignada de manera automàtica pel DHCP mitjançant les comandes:

$hostname
$hostname -I

Se’ns retornarà el nom de la màquina que haguem introduït durant la instal·lació i la seva adreça IP. Aquesta adreça és dinàmica i pot canviar o, fins i tot, ser assignada a una altra màquina. Per ara servirà per connectar-se a la VM des de la màquina hoste via ssh.

Si volem canviar el nom de la màquina, podem fer-ho editant el fitxer de configuració de hostnames obrint-lo en un editor amb la comanda

$sudo nano /etc/network/hostname

Hem de tenir en compte que cada màquina ha de ser fàcilment identificable, així que ens assegurarem de que cadascuna tingui un nom únic.

Ara, configurarem un segon adaptador de xarxa amb una IP estàtica. Per fer-ho haurem d’editar el fitxer de configuració d’interfícies de xarxa

$sudo nano /etc/network/interfaces

Que en obrir-lo s’hauria d’assemblar a una cosa així

# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
source /etc/network/interfaces.d/*

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto enp0s3
iface enp0s3 inet dhcp

A continuació del fitxer, haurem d’afegir una nova secció que configuri un adaptador de xarxa secundari que ens assigni l’IP estàtica

# The secondary network interface
auto enp0s8
iface enp0s8 inet static
address 192.168.0.50
netmask 255.255.255.0
network 192.168.0.0
broadcast 192.168.0.255

Guardem el fitxer i sortim de l’editor. Amb aquest pas s’ha definit el segon adaptador de xarxa amb el nom enp0s8, que és estàtic i assigna l’adreça IP 192.168.0.50 al nostre servidor. Per a que els canvis siguin efectius, cal reiniciar la xarxa.

 $sudo service networking restart

Per verificar que les dues interfícies funcionen correctament, podem executar la comanda

$hostname -I

Hauríem d’obtenir les dues IP, la primera assignada per DHCP i la segona estàtica.

192.168.1.55  192.168.0.50

Creació de les màquines per als nodes 2 i 3 del clúster

Arribats a aquest punt, és un bon moment per crear els altres dos nodes del clúster. Fer-ho serà tan fàcil com clonar dues vegades la VM en la que hem estat treballant i modificar el hostname i l’adreça IP estàtica de les VM resultants.

A la finestra principal de VirtualBox, ubiquem el ratoli sobre la VM del primer node i premem el botó dret. Al menú desplegable seleccionarem l’opció “Clona“. S’obrirà una nova finestra on haurem de posar nom a la nova màquina virtual, node2, i hi indicarem que es “generin noves adreces MAC per a tots els adaptadors de xarxa“. A la finestra següent especificarem que volem realitzar una “clonació completa“.

Captura VirtualBox - Clona la màquina virtual
Captura VirtualBox – Clona la màquina virtual

Acte seguit, entrarem a les noves VM i modificarem els fitxers hostnames i interfaces per assignar-los els noms node2 i node3 i les IP estàtiques 192.168.0.51 i 192.168.0.52 respectivament. Ara hauríem de ser capaços de fer crides via ssh entre les màquines virtuals. Per exemple, per connectar-nos des del node1 al node2 executarem aquesta comanda.

xavi@node1:~$ ssh 192.168.0.51

Si es la primera vegada que ens connectem d’una màquina a l’altra, se’ns pregunarà si volem afegir-la a la llista de connexions de confiança, haurem d’escriure ‘yes’ i acceptar. Si la connexió dóna problemes proveu a reiniciar les màquines.

Configuració de l’adaptador de xarxa de la màquina hoste

Ja tenim una xarxa de maquines virtuals que poden comunicar-se entre elles, però des de la màquina hoste (l’equip amb Windows 10 des d’on ho estem aixecant tot) som incapaços de connectar-nos via SSH a qualsevol d’aquestes tres màquines. Posem-hi solució.

Obtenció de les dades per defecte

Obrim un terminal de Windows i excutem la comanda

ipconfig /all

Obtindrem la informació de tots els dispositius de xarxa actius a la sessió de Windows. Ens interessen les dades del nostre dispositiu principal, que alhora serà el que sortia per defecte quaan configuravem la VM des del VirtualBox. El resultat hauria de ser similar a això:

Adaptador de LAN inalámbrica Wi-Fi: 

Sufijo DNS específico para la conexión. . :
Descripción . . . . . . . . . . . . . . . : Intel(R) Dual Band Wireless-AC 8260
Dirección física. . . . . . . . . . . . . : 44-85-00-E0-66-DB
DHCP habilitado . . . . . . . . . . . . . : no
Configuración automática habilitada . . . : sí
Vínculo: dirección IPv6 local. . . : fe80::9c97:3ab5:1d63:d4da%24(Preferido)
Dirección IPv4. . . . . . . . . . . . . . : 192.168.1.37(Preferido)
Máscara de subred . . . . . . . . . . . . : 255.255.255.0
Puerta de enlace predeterminada . . . . . : 192.168.1.1
IAID DHCPv6 . . . . . . . . . . . . . . . : 155485440
DUID de cliente DHCPv6. . . . . . . . . . : 00-01-00-01-1F-76-2C-B7-44-85-00-E0-66-DB
Servidores DNS. . . . . . . . . . . . . . : 8.8.8.8
                                            8.8.4.4
NetBIOS sobre TCP/IP. . . . . . . . . . . : habilitado

Prendrem nota d’aquests valors (podem fer-ne una captura o guardar-los en un document de text) per fer-los servir ens els següents passos.

Modificació manual dels paràmetres de la xarxa

Obrim el Centre de xarxes i recursos compartits de Windows i pitgem sobre el valor de connexions (al costat de les barres de cobertura de la xarxa Wi-Fi).

Centre de xarxes i recursos compartits
Centre de xarxes i recursos compartits

Entrem a Propietats per veure la finestra de propetats de al connexió wi-fi

Propietats de Wi-Fi
Propietats de Wi-Fi

Seleccionem Protocol d’Internet versió 4 (TCP/IPv4) de la llista i anem a Propietats. A la nova finestra que s’obrirà, normalment hi ha marcada l’opció d’obtenir una adreça IP de manera automàtica. Haurem de marcar la casella Utilitzar la sigüent direcció IP per poder introduir manualment els valors que hem obtingut i apuntat fa uns moments.

Completem tots els camps i acceptem els canvis per tancar la finestra. És probable que durant uns segons perdem la connexió a Internet, ja que la xarxa s’està reconfigurant.

Propietats del Protocol d'Internet versió 4
Propietats del Protocol d’Internet versió 4

Configurant la segona xarxa de l’equip hoste

Un cop recuperada la connexió a internet tornem a obrir la finestra de propietats que acabame de tancar per comprovar que tot segueix com ho havíem definit. Seguidament pitgem a Opcions avançades… per obrir una nova finestra.

A la secció d’adreces IP agregarem un nou registre amb la IP 192.168.0.49 i la màscara de xarxa 255.255.255.0. Aquesta acció unirà la nostra màquina a la xarxa privada del clúster.

Guardem els canvis i ja podem tancar totes les finestres de configuració de les connexions de xarxa. Ara ja hauríem de ser capaços de connectar-nos via SSH des de la màquina Windows a qualsevol de les tres VM configurades al nostre clúster.

Comprovant que ens podem connectar al clúster via SSH

Per obrir una connexió SSH des de Windows hi ha diversos programes disponibles. A mi m’agrada fer servir MobaXterm, que a més inclou un gestor sFTP per a les connexions obertes, facilitant així l’intercanvi de fitxers entre dispositius.

Per comprovar que la connexió es pot realitzar, ens hem d’asssegurar que les VM estan engegades i obrir un nou terminal a mobaXterm per connectar-nos al primer node introduint la comanda

ssh [nomUsuari]@192.168.0.50

Connexió SSH sense posar contrasenyes

Ja ens podem connectar a totes les màquines, però haver d’introduir la contrasenya cada vegada pot resultar incòmode. A més, si volem crear un clúster que realitzi tasques de manera automatitzada, ens interessa que les VM es reconeguin entre sí i que no donin cap tipus d’error quan intentin intercanviar paquets de dades. Per resoldre-ho, crearem les claus SSH de cada màquina i les compartirem amb les altres màquines del clúster.

Primer de tot hem de crear a totes les VM la carpeta on emmagatzemar tota la informació referent a les claus. Executarem les següents comandes a totes les màquines virtuals.

$ mkdir ~/.ssh
$ chmod 700 ~/.ssh

Generació de les claus SSH dels nodes del clúster

Seguidament, cal crear les claus SSH de cada VM. Els següents passos caldrà que els realitzem a les tres VM.

Iniciem sessió al node1, executem la comanda:

$ ssh-keygen

I n’acceptem tots els valors que surten per defecte. Aquesta acció ens haurà creat una clau privada (id_rsa) i una clau pública (id_rsa.pub) al directori ~/.ssh.

Per evitar confusions quan haguem de compartir les claus entre les màquines, crearem una còpia de la clau on poguem veure’n el nom:

$ cp .ssh/id_rsa.pub .ssh/id_rsa_node1.pub

Compartició de la clau pública amb els altres nodes

A través de la connexió SSH, enviarem la clau pública recentment generada a les altres màquines, a l’exemple l’enviarem del node1 al node2, i l’afegirem al fitxer de claus autoritzades.

$ scp ~/.ssh/id_rsa_node1.pub [nomUsuari]@192.169.0.51:~
$ ssh [nomUsuari]@192.168.0.51
$ cat ~/id_rsa_node1.pub >> ~/.ssh/authorized_keys
$ chmod 644 ~/.ssh/authorized_keys
$ exit

Arribats a aquest punt, el node1 hauria de poder connectar-se al node2 i al node3 sense demanar autenticació.

Repetim aquest procés per als altres 2 nodes per a que el clúster es pugui comunicar sense problemes. No oblideu renombrar les claus públiques per evitar confusions.

Generació de la clau pública de l’equip hoste

Ens interessa que el nostre equip es pugui connectar al clúster, però no volem que el clúster es connecti al nostre equip.

Per generar les claus de l’equip hoste seguirem els mateixos passos que hem utilitzat per crear les claus dels nodes fent ús de la tarminal de MobaXterm. A l’exemple les enviarem al node1, però també les haurem d’enviar als altres dos nodes modificant la IP al connectar-nos.

ssh-keygen
cp ~/.ssh/id_rsa.pub ~/.ssh/id_rsa_win10.pub
scp ~/.ssh/id_rsa_win10.pub [nomUsuari]@192.168.0.50:~
ssh [nomUsuari]@192.168.0.50
cat ~/id_rsa_win10.pub >> ~/.ssh/authorized_keys
exit

Ara ja hauríem de ser capaços de connectar-nos lliurement a totes les VM del clúster.

Assignar àlies a les IP dels nodes

Quan hem de treballar connectant-nos reiteradament entre nodes, treballar amb les IP pot generar confusions. Per tal d’estalviar-nos ensurts, podem assignar un àlies a cada IP del clúster de manera que ens poguem connectar via SSH amb una comanda de l’estil

$ ssh node2

Per aconseguir-ho, només cal modificar el fitxer de hosts de cada node:

$ sudo nano /etc/hosts

A continuació veiem l’exemple de com hauria de quedar el fitxer del node1

192.168.0.50 node1
192.168.0.50 localhost
127.0.0.1    localhost

# cluster
192.168.0.49 win10
192.168.0.51 node2
192.168.0.52 node3

És important que es respecti aquest ordre en les IP i noms de node , ja que és l’ordre en que es resolen les peticions, altrament podríem tenir problemes quan treballessim amb un sistema de fitxers distribuït, com podria ser HDFS de Hadoop.

Conclusió

A aquestes alçades hauríem de tenir completament operatiu un clúster de 3 nodes instal·lats en màquines virtuals, capaços de comunicar-se automàticament entre ells i accessibles des d’un equip hoste a través de connexió SSH.

Aquesta configuració hauria de servir de base per configurar un sistema distribuït capaç de gestionar un ecosistema Hadoop, incloent HDFS, HBase i Spark.

Referències