Vous êtes sur la page 1sur 11

Construccin de un cluster de 4 nodos con

Raspberry Pi.

Se har un cluster utilizando cuatro tarjetas Raspberry Pi, para ello se utiliz tres tablas
Raspberry Pi 2 para los nodos informticos y una Raspberry Modelo B para el nodo principal. Se
procur que el clster fuera lo ms compacto posible, con solo dos cables saliendo, uno para la
energa y el otro para la red. Se utiliz un concentrador USB para alimentar las placas, y un
conmutador Ethernet, que se modific, para alimentarse tambin desde el concentrador USB
en lugar de un conector de pared separado.

Armado del Hardware


Se cre el armazn que albergar todas las tarjetas Raspberry Pi, el concentrador USB es de 5
puertos, con un puerto para cada una de las cuatro placas Raspberry Pi, y un puerto final para
alimentar un conmutador Ethernet para el clster.

Configuracin del cluster


Lo primero que debemos hacer es copiar en las cuatro tarjetas SD una imagen de iso de la ltima
versin de Raspbian para cada una de nuestras placas Raspberry Pi.

Por ahora estoy tomando un atajo y estoy usando el enrutador de mi casa para asignar
direcciones IP a cada uno de los nodos. Arrancando cada Pi por turno, y tomando una nota de la
direccin IP que se asignan usando la interfaz web del enrutador, termin con el nodo principal
que tiene una direccin IP de 192.168.1.173, con los tres nodos de cmputo que tienen
192.168.1.177, 192.168 .1.178 y 192.168.1.180.

Al iniciar sesin en los nodos, hice la configuracin estndar en cada nodo ejecutando,

% sudo raspi-config
Luego se expande el sistema de archivos al tamao de la tarjeta SD, dndome unos gigabytes
adicionales. Se cambi la contrasea de cada nodo a algo un poco ms seguro y se renombr los
nodos rpi0, rpi1, rpi2 y rpi3, respectivamente.

Despus de hacer eso, se edita el archivo / etc / hosts en cada uno de los nodos,

% cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

127.0.1.1 rpi0
192.168.1.173 rpi0 rpi0.local rpi0.lan
192.168.1.177 rpi1 rpi1.local rpi1.lan
192.168.1.178 rpi2 rpi2.local rpi2.lan
192.168.1.180 rpi3 rpi3.local rpi3.lan

Despus se generan las claves SSH para los cuatro nodos, sin ninguna frase de paso,
distribuyendo las claves pblicas de cada nodo a las otras tres. Esto significa que puedo pasar
ssh entre los nodos sin tener que escribir repetidamente la contrasea todo el tiempo, pero an
se tendr que escribir una contrasea para ssh en el clster.

Agregar disco
Se conect al nodo principal una unidad flash de 64GB. Esto es bastante fcil de montar,

% mkdir /mnt/usb
% sudo chown -R pi:pi /mnt/usb
% sudo mount /dev/sda1 /mnt/usb -o uid=pi, gid=pi

pero si desea que se monte automticamente en el arranque, deber agregarse lo siguiente al


archivo / etc / fstab,

/dev/sda1 /mnt/usb auto defaults,user 0 1

Sin embargo, quera ir un poco ms lejos y hacer que este disco est disponible para los cuatro
nodos. Para hacer esto, utilic NFS y autofs. En los cuatro nodos, deber continuar e instalar el
software de cliente NFS,

% sudo apt-get install nfs-common

y en rpi1, rpi2 y rpi3 necesitars crear un punto de montaje

% sudo mkdir /mnt/nfs


% sudo chown -R pi:pi /mnt/nfs
Luego, en el nodo principal, rpi0, deber instalar el software del servidor NFS

% sudo apt-get install nfs-server

y edite el archivo / etc / exports,

# /etc/exports: the access control list for filesystems which may be exported
/mnt/usb rpi1(rw,sync)
/mnt/usb rpi2(rw,sync)
/mnt/usb rpi3(rw,sync)

para agregar los tres nodos de clculo. Despus de hacerlo, deber reiniciar los servicios RPC,

% sudo update-rc.d rpcbind enable && sudo update-rc.d nfs-common enable


% sudo reboot

Despus de reiniciar, puede verificar desde uno de los nodos de clculo para asegurarse de que
rpi0 est exportando el disco a travs de NFS correctamente. En este punto, podra simplemente
editar el archivo / etc / fstab y agregar los discos. Sin embargo, eso podra ser problemtico
segn el orden en que se inicien los nodos. En cambio, en los tres nodos de computacin debe
instalar autofs,

% sudo apt-get install autofs

y luego edite el archivo /etc/auto.master aadiendo

/mnt/nfs /etc/auto.nfs

al final. A continuacin, cree el archivo /etc/auto.nfs, agregando,

rpi0 rpi0:/mnt/usb

y reinicie el servicio autofs,

% sudo /etc/init.d/autofs restart.

si todo va bien en este punto, si cambia al directorio / mnt / nfs / rpi0 / y el disco conectado al
nodo principal debe montarse automticamente. Puedes comprobar,

% df h
Filesystem 1K-blocks Used Available Use% Mounted on
rootfs 14984668 2513228 11812356 18% /
/dev/root 14984668 2513228 11812356 18% /
devtmpfs 470416 0 470416 0% /dev
tmpfs 94944 232 94712 1% /run
tmpfs 5120 0 5120 0% /run/lock
tmpfs 189880 0 189880 0% /run/shm
/dev/mmcblk0p1 57288 19448 37840 34% /boot
rpi0:/mnt/usb 60467008 64 60466944 1% /mnt/nfs/rpi0
para ver si se ha montado automticamente.

Prximos pasos
En lugar de conectar directamente el conmutador Ethernet a la red externa, y hacer que el
enrutador local asigne direcciones IP para cada uno de los nodos, como paso siguiente, se
agregar un adaptador Ethernet USB al nodo principal. Esto le dar al nodo principal dos
conexiones Ethernet. El primero se conectar a la red externa, dando al nodo principal, y por lo
tanto al clster, una direccin IP 'externa'. El segundo se conectar al conmutador Ethernet del
clster. A continuacin, podemos configurar el nodo principal como un servidor DHCP para otros
tres nodos 'internos' conectados al conmutador, creando una segunda red visible solo para el
clster. En esta configuracin, an podr enviar ssh al nodo principal, pero solo se podr alcanzar
los tres nodos informticos desde el nodo principal. Sin embargo, hay un problema: cmo se
sabr la direccin IP externa del nodo principal?

Agregar una pantalla LCD


Conectaremos una pantalla LCD al nodo principal.

La conexin del cableado de la tarjeta Raspberry Pi de los pines GPIO (entrada / salida de
propsito general) son solo 4 cables: + 5V, GND, SDA y SCL.
Despus de conectar el panel, se instalar las herramientas I2C y las bibliotecas asociadas de
Python.

% sudo apt-get install python-smbus


% sudo apt-get install i2c-tools
se habilitar I2C en el nodo principal, agregando lo siguiente en la parte inferior del archivo /
boot / config,

device_tree=
dtparam=spi=on
dtparam=i2c1=on
dtoverlay=w1-gpio-pullup,gpiopin=3,pullup=3
dtoverlay=w1-gpio-pullup,gpiopin=5,pullup=5
y agregando los siguientes mdulos al archivo / etc / modules,

i2c_dev
i2c_bcm2708
Despus de reiniciar el nodo principal, debera poder ver el panel con una ID I2C de 27,

% sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
20: -- -- -- -- -- -- -- 27 -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- UU -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Puede usar las bibliotecas ThinkBowl I2C con este panel,

% git clone https://bitbucket.org/thinkbowl/i2clibraries.git

Estas bibliotecas estn pensadas principalmente para Python 3, pero incluye la biblioteca
i2c_lcd_smbus (obviamente obsoleta) escrita para Python 2. El seguimiento, por ejemplo,
empujar la direccin IP actual a la lnea superior de la pantalla.

#!/usr/bin/Python

import socket
from i2clibraries import i2c_lcd_smbus

lcd = i2c_lcd_smbus.i2c_lcd(0x27,1, 2, 1, 0, 4, 5, 6, 7, 3)

lcd.command(lcd.CMD_Display_Control | lcd.OPT_Enable_Display)
lcd.backLightOn()

lcd.writeString([(s.connect(('8.8.8.8', 80)), s.getsockname()[0],


s.close()) for s in [socket.socket(socket.AF_INET,
socket.SOCK_DGRAM)]][0][1])

incluso podemos configurar cosas para llamar a este script desde /etc/rc.local en el arranque,

#!/bin/sh -e
#
# rc.local

cd /home/pi
python ip.py
exit 0
as se mostrar al arrancar en el panel LCD del clster, la direccin IP externa del nodo principal.
Con dicha IP siempre sabremos a dnde llegar a travs del ssh, sin importar donde este el clster.

Agregar una segunda conexin Ethernet


Usando otro adaptador USB a Ethernet compatible, se verifica la direccin MAC del adaptador,

% ifconfig

que se mostrar como eth1. Luego edite / etc / network / interfaces de la siguiente manera,

auto lo
iface lo inet loopback

auto eth1
allow-hotplug eth1
iface eth1 inet dhcp

auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.50.1
netmask 255.255.255.0
network 192.168.50.0
broadcast 192.168.50.255

Desde la configuracin, intencionalmente dejaremos eth0, el socket Ethernet integrado,


conectado al conmutador Ethernet y que servir como conexin interna al clster, mientras que
eth1 tendr una conexin al exterior.

Se debe tener en cuenta que, dado que la direccin MAC del adaptador que est con el
enrutador domstico va a cambiar, nuestra direccin IP "externa" del nodo principal tambin va
a cambiar.

Luego tenemos que instalar el servidor DHCP,


% sudo apt-get install isc-dhcp-server

se editar el archivo /etc/dhcp/dhcpd.conf de la siguiente manera,

ddns-update-style none;
authoritative;
log-facility local7;

# No service will be given on this subnet


subnet 192.168.1.0 netmask 255.255.255.0 {
}

# The internal cluster network


group {
option broadcast-address 192.168.50.255;
option routers 192.168.50.1;
default-lease-time 600;
max-lease-time 7200;
option domain-name "cluster";
option domain-name-servers 8.8.8.8, 8.8.4.4;
subnet 192.168.50.0 netmask 255.255.255.0 {
range 192.168.50.14 192.168.50.250;

host rpi0 {
hardware ethernet b8:27:eb:22:60:fb;
fixed-address 192.168.50.1;
}
host rpi1 {
hardware ethernet b8:27:eb:a0:a1:7f;
fixed-address 192.168.50.11;
}
host rpi2 {
hardware ethernet b8:27:eb:68:b6:a3;
fixed-address 192.168.50.12;
}
host rpi3 {
hardware ethernet b8:27:eb:0b:4e:2c;
fixed-address 192.168.50.13;
}
}
}
Aqu definimos una red de clster interna y asignamos a cada uno de los cuatro nodos su propia
direccin IP esttica en la red interna. Luego se edita el archivo / etc / default / isc-dhcp-server
para reflejar la configuracin de nuestro servidor DHCP

DHCPD_CONF=/etc/dhcp/dhcpd.conf
DHCPD_PID=/var/run/dhcpd.pid
INTERFACES="eth0"

A continuacin, se edita el archivo / etc / hosts en los cuatro nodos para reflejar los cambios;
por ahora, todava puede comunicarse con ellos en sus direcciones IP anteriores.

127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

127.0.1.1 rpi0 rpi0.local rpi0.lan rpi0.cluster

192.168.50.1 rpi0 rpi0.local rpi0.lan rpi0.cluster


192.168.50.11 rpi1 rpi1.local rpi1.lan rp1.cluster
192.168.50.12 rpi2 rpi2.local rpi2.lan rpi2.cluster
192.168.50.13 rpi3 rpi3.local rpi3.lan rpi3.cluster

Finalmente, se actualizar la secuencia de comandos para el panel LCD en el nodo principal para
mostrar nuestras direcciones IP internas y externas,

#!/usr/bin/python

import socket
import fcntl
import struct
from i2clibraries import i2c_lcd_smbus

def get_ip_address(ifname):
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
return socket.inet_ntoa(fcntl.ioctl(
s.fileno(),
0x8915, # SIOCGIFADDR
struct.pack('256s', ifname[:15])
)[20:24])

lcd = i2c_lcd_smbus.i2c_lcd(0x27,1, 2, 1, 0, 4, 5, 6, 7, 3)

lcd.command(lcd.CMD_Display_Control | lcd.OPT_Enable_Display)
lcd.backLightOn()

lcd.writeString( "e0 " )


lcd.writeString( get_ip_address('eth0' ) )
lcd.setPosition( 2, 0 )
lcd.writeString( "e1 " )
lcd.writeString( get_ip_address('eth1' ) )

Antes de reiniciar el clster, debemos sacar nuestro cable Ethernet externo del interruptor y
conectarlo al adaptador USB a Ethernet conectado al nodo principal. Esto dejar un socket vaco
en el conmutador Ethernet.
En este punto, podremos reiniciar el clster. Por lo tanto, desconecte la clavija de alimentacin
del concentrador USB y retire todos los nodos. Al reiniciar, se deber ver algo como esto en la
pantalla LCD,

Se observa que eth0 tiene la direccin IP interna esttica que le asignamos, mientras que eth1
tiene una nueva direccin IP asignada por nuestro enrutador domstico. Ahora se debera poder
ingresar al nodo principal usando su nueva direccin IP externa, y ver algo como esto,

% ifconfig
eth0 Link encap:Ethernet HWaddr b8:27:eb:22:60:fb
inet addr:192.168.50.1 Bcast:192.168.50.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2470 errors:0 dropped:0 overruns:0 frame:0
TX packets:2267 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:215730 (210.6 KiB) TX bytes:237032 (231.4 KiB)

eth1 Link encap:Ethernet HWaddr ac:29:3a:da:74:37


inet addr:192.168.1.194 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:15245 errors:0 dropped:1 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1787746 (1.7 MiB) TX bytes:283761 (277.1 KiB)

lo Link encap:Local Loopback


inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:4 errors:0 dropped:0 overruns:0 frame:0
TX packets:4 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:260 (260.0 B) TX bytes:260 (260.0 B)

Y esto,

% route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.254 0.0.0.0 UG 0 0 0 eth1
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
192.168.50.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0

Si ha habido algn error, y no podemos alcanzar el nodo principal a travs de la red, es posible
que tengamos que utilizar un monitor con conexin HDMI ms un teclado USB y conectarlos
directamente al nodo principal. Podremos retirar temporalmente el disco USB para obtener el
puerto USB libre para el teclado, para que se pueda diagnosticar y solucionar cualquier problema
de red.
Sin embargo, si se consigue llegar al nodo principal desde la red externa. Debera poder hacer
ping a los hosts externos en la red 192.168.1. * Adems de los hosts internos en la red
192.168.50. *. Si ingresamos a uno de los nodos de cmputo, mientras pueden ver el nodo
principal y entre ellos, an no pueden ver el enlace de red con el exterior. Vamos a tener que
reenviar paquetes desde la red interna a la externa antes de que sea posible.

En el nodo principal se realizar,


% sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"

y luego edite el archivo /etc/sysctl.conf sin comentar la lnea,

net.ipv4.ip_forward=1

Despus de activar el reenvo, tendremos que configurar iptables,

% sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE


% sudo iptables -A FORWARD -i eth1 -o eth0 -m state --state RELATED,ESTABLISHED -j ACEP
T
% sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
% sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

y luego agregue en la parte inferior del archivo / etc / network / interfaces una lnea para cargar
las tablas en el arranque,

up iptables-restore < /etc/iptables.ipv4.nat


Reiniciando el nodo principal en este punto, ahora debera poder ingresarse a cualquiera de los
nodos de computacin desde el nodo principal y ser capaz de hacer ping a la red exterior.

% ssh rpi1
Linux rpi2 3.18.11-v7+ #781 SMP PREEMPT Tue Apr 21 18:07:59 BST 2015 armv7l
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

Last login: Sat Sep 5 20:49:07 2015 from rpi0


% ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=54 time=23.8 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=54 time=21.4 ms
64 bytes from 8.8.8.8: icmp_req=3 ttl=54 time=23.2 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 21.470/22.838/23.829/1.014 ms
%

Con esto ya tendremos un cluster trabajando.


En otras palabras, todo est funcionando en este punto.
A partir de aqu, hay un par de cosas que podramos hacer, el siguiente paso ms obvio sera
agregar algunas monitorizaciones de SNMP y un panel de "estado" orientado hacia afuera en el
nodo principal para monitorear el estado del clster. Sin embargo, a ms largo plazo, el puerto
Ethernet gratuito en el conmutador significa que podemos expandir el clster con bastante
facilidad agregando otro bastidor de cuatro nodos de cmputo sin demasiado esfuerzo
adicional.

Vous aimerez peut-être aussi