Bouw je eigen Raspberry Pi-cluster met deze instructies
Het aantal Raspberry Pi’s in mijn huis begon onhandelbaar te worden en het kluwen van kabels en voedingsadapters was me al even een doorn in het oog. Ik besloot een aantal van deze Raspberry Pi’s op elkaar te stapelen in een clusterbehuizing, aangesloten op één voeding en één netwerkswitch. Lijkt dat je ook wat? Lees hier dan hoe je voor jezelf een Raspberry Pi-cluster maakt.
Zoals elke zichzelf respecterende Raspberry Pi-fan heb ik door de jaren heen heel wat modellen van het minicomputertje bij elkaar verzameld. Er staan diverse exemplaren in heel mijn huis en zelfs in mijn kippenhok. De Pi’s hebben uiteenlopende doeleinden zoals een ip-camera, domoticacontroller, om sensorgegevens via bluetooth uit te lezen enzovoort.
Een groot deel van die Raspberry Pi’s staat op mijn bureau. Dat levert een kluwen van netwerk- en voedingskabels op, met allerlei bordjes met en zonder behuizing op mijn bureau, en verspreid in en op mijn boekenkasten. Ik vond het tijd om daar een wat nettere oplossing voor te vinden.
Bovendien zetten al die voedingsadapters elk individueel de netspanning om naar een 5V-gelijkspanning voor het computerbordje. Het zou efficiënter zijn als dat één keer gebeurt en dat ik alle Raspberry Pi’s op die ene voeding kan aansluiten. Het zou me ook weer wat extra vrije stopcontacten opleveren.
Al vrij snel realiseerde ik me dat de oplossing was om een computercluster te bouwen van de Raspberry Pi’s. Er zijn diverse projecten online te vinden die dat doen. Zelfs al gebruik ik de Pi’s voorlopig niet als computercluster (enkele computers die als één computer berekeningen uitvoeren), de hardware die ik nodig heb om de voorgaande problemen op te lossen, is exact hetzelfde.
De oplossing ziet er dan ook als volgt uit: de Raspberry Pi’s stapel je in een clusterbehuizing op elkaar. Daardoor nemen ze samen maar weinig plaats in. Elke Pi voed je via een laadstation met meerdere usb-poorten, en sluit je via een platte ethernetkabel aan op een ethernetswitch. De switch en het laadstation plaats je gewoon naast de stapel Pi’s. Als je de kabels kort genoeg houdt, ziet het geheel er heel netjes uit en blijft het vrij compact.
Raspberry Pi-cluster benodigdheden
Bovenstaande uitleg lijkt eenvoudig, maar bij de keuze van de componenten komt heel wat kijken en de juiste keuze hangt ook af van wat je exact met je Raspberry Pi’s wilt doen. In deze DIY leg ik uit welke keuzes ik gemaakt heb voor mijn situatie. Het is één configuratievoorstel, waarop je kunt variëren als je andere vereisten hebt.
De belangrijkste keuze die je eerst dient te maken, is hoeveel Raspberry Pi’s je in je cluster wilt opnemen en welke modellen. Wil je een krachtige rekencluster maken, dan kies je wellicht voor Raspberry Pi 4B’s met 4 GB ram. In mijn geval ging het vooral om het netjes bij elkaar brengen van enkele Raspberry Pi’s die ik al had: een Raspberry Pi 2B, een Raspberry Pi 3B, een Raspberry Pi 3B+ en drie Raspberry Pi 4B’s (van elk model één: met 1 GB, 2 GB en 4 GB ram). Zo kwam ik dus op een systeem met zes Raspberry Pi’s.
Ik heb in het boodschappenlijstje geen ventilatoren voorzien, maar voor de beste prestaties heb je die wel nodig, zeker bij de Raspberry Pi 4. In plaats van een afzonderlijke HAT met ventilator voor elke Raspberry Pi zou je ook een tafelventilator op je cluster kunnen richten.
Elk van die Raspberry Pi’s heeft een micro-sd-kaart nodig voor het besturingssysteem. Strikt gezien kun je ze ook zonder lokale opslag laten opstarten. Dan downloaden ze via het netwerk hun besturingssysteem. Maar ik raad aan om eerst de hele opstelling toch eens te testen op de normale manier met een micro-sd-kaart in elke Raspberry Pi.
Dat gezegd hebbende, is dit het lijstje dat ik hanteerde:
Clusterbenodigdheden
- ILS acrylclusterbehuizing met 6 lagen (€ 20,-)
- TP-Link LS108G 8-poorts gitabit-ethernetswitch (€ 25,-)
- set van 7 platte Cat7-ethernetkabels 25 cm (€ 3,81)
- Anker PowerPort 12 A 60 W laadstation met 6 poorten (€ 29,-)
- 2x set van 4 usb-c-laadkabels 25 cm (2x € 9,-)
- 6x Open-Smart 10-Segment Mini Battery Display (6x € 1,30)
- 40x m/f-jumperwires 20 cm (€ 4,95)
- 830-punts breadboard (€ 6,95) Cluster van 6 Raspberry Pi 4’s
- 6x Raspberry Pi 4 Model B 1 GB ram (6x € 39,95)
- 6x 8 GB micro-sd-kaart (6x € 8,99)
Totale kostprijs: ca. € 409,-
Clusterbehuizing in elkaar schroeven
Als je op internet zoekt naar ‘raspberry pi cluster case’ vind je al snel talloze mogelijkheden om meerdere Raspberry Pi’s in één behuizing te steken, voor elk budget. Op Amazon vond ik voor 20 euro een acrylclusterbehuizing voor zes Raspberry Pi’s. Dit soort stapelbare behuizingen is een populaire en niet al te dure oplossing, en nog leuk om te zien ook omdat ze transparant zijn.
De Raspberry Pi’s zijn niet volledig beschermd, want er zit alleen boven en onder elk processorbordje een plaatje. Maar een voordeel van deze opstelling is dat ze gemakkelijk uit te breiden is: als je later nog Raspberry Pi’s aan je cluster wilt toevoegen, hoef je alleen maar enkele plaatjes en bijbehorende afstandshouders bij te kopen (op voorwaarde dat je voeding en netwerk de uitbreiding aankunnen uiteraard).
©PXimport
Als je de foto’s van de behuizing bekijkt, is de verleiding groot om eerst de hele toren op te bouwen en dan de Raspberry Pi’s erin te monteren. Maar het is eenvoudiger om elke Pi laag voor laag direct op zijn bodemplaatje te monteren. Let daarbij op: plaats de micro-sd-kaart boven de uitsparing aan de zijkant en plaats de ELPIDA-chip aan de onderkant van de oudere Pi-modellen (de Pi 4 heeft deze niet) boven de uitsparing net naast het midden van het plaatje.
Gebruik de langere schroefjes om de Raspberry Pi vast te zetten op het plaatje, met de meegeleverde plastic moeren tussen de bodemplaat en de Raspberry Pi, en de kleinere metalen moeren bovenaan de Raspberry Pi. De grotere moeren zijn om de afstandshouders helemaal onderaan vast te zetten aan het onderste bodemplaatje en de grotere schroeven zijn om de afstandshouders helemaal bovenaan vast te zetten aan het afdekplaatje met het logo van de Raspberry Pi erop. Draai alles niet muurvast. Dat is niet nodig voor de stabiliteit en het maakt het alleen maar moeilijker om de behuizing later weer te demonteren.
Op het eerste gezicht lijken alle plaatsen uitwisselbaar en denk je dat het niet uitmaakt waar je elke Pi plaatst. Toch denk je hier maar beter goed over na voordat je de hele stapel monteert. Hangt er aan een van je Pi’s namelijk een extra kabel, bijvoorbeeld voor een externe harde schijf, of heb je er een usb-transceiver voor Z-Wave of iets anders dat uitsteekt aan hangen, plaats die Pi dan bij voorkeur onderaan, zodat je geen kabels of uitsteeksels al te hoog hebt waarachter je per ongeluk kunt blijven hangen.
Heb je een HAT met display op een Pi staan, plaats die dan bovenaan. En steek je een Pi in de clusterbehuizing die je zo nu en dan er uit wilt halen om hem op een andere plaats te gebruiken, plaats die dan onderaan of bovenaan, zodat hij gemakkelijk te demonteren is. De nieuwere modellen, zeker de Raspberry Pi 4, plaats je (in geval van een mix van oude en nieuwe modellen) ook het best bovenaan: deze genereren meer warmte en warmte stijgt, dus bovenaan kan die het snelste weg.
©PXimport
Over de voeding
Al die Raspberry Pi’s met een eigen voeding van stroom voorzien is geen nette oplossing. Gelukkig bestaan er laadstations die meerdere apparaten tegelijk via usb van stroom kunnen voorzien. Populaire laadstations voor Raspberry Pi-clusters zijn die van Anker, vooral de versies met zes poorten en tien poorten.
Uiteraard kies je voor een laadstation met voldoende poorten voor je cluster. In mijn geval kwam de versie met zes poorten goed uit voor mijn cluster met zes Raspberry Pi’s. Wil je de volledige opstelling via het laadstation voeden, dan dien je een extra poort te voorzien en naar een ethernetswitch te zoeken die via usb te voeden is. In mijn geval vond ik de meerkosten van een laadstation met meer poorten en een duurdere switch niet opwegen tegen die ene voeding minder die ik dan nodig zou hebben.
De aansluiting is eenvoudig. Je koopt gewoon een setje usb-laadkabels en sluit elke Pi zo op het laadstation aan. In het boodschappenlijstje heb ik voor de configuratie met zes Raspberry Pi 4’s allemaal usb-c-laadkabels opgenomen, maar in mijn geval gaat het om drie micro-usb-laadkabels en drie usb-c-laadkabels. Het laadstation steek je dan in het stopcontact, waardoor je zes voedingsadapters en bijbehorende stekkers door één stekker hebt vervangen. Laadkabels van 25 cm zijn net lang genoeg om zes Raspberry Pi’s in een verticale opstelling te voeden met de Anker PowerPort. Je plaatst die laatste het best aan de kant van de voedingspoorten van de Pi’s.
©PXimport
Maar het belangrijkste aan je keuze voor een laadstation is dat het voldoende vermogen moet kunnen leveren aan je Raspberry Pi’s. Ga daarbij uit van het meest extreme scenario. Ik ging daarom uit van het vermogensverbruik van zes Raspberry Pi 4’s op volle kracht. Uit een benchmark van MagPi blijkt dat dit model in een stresstest tot 7 W verbruikt. Ik heb dus zes keer 7 W ofwel 42 W nodig om een veiligheidsmarge te hebben.
De Anker PowerPort levert 60 W, dus dat is ruim voldoende. Maar let op: veel laadstations adverteren niet alleen met hun maximaal vermogen, maar ook met maximale stroomsterktes per poort. Zo levert de Anker PowerPort tot 2,4 A stroom per poort, waaruit je kunt afleiden dat die maximaal 12 W (2,4 A maal 5 V) vermogen per poort levert. Maar als je daadwerkelijk 2,4 A op elke poort zou nodig hebben (wat hier niet het geval is), is dat niet mogelijk, want de totale stroom die het laadstation aan de zes poorten kan leveren is 12 A. Je dient dus na te kijken of het laadstation zowel per poort als in totaal voldoende vermogen kan leveren voor je cluster.
Over het netwerk
Alle moderne Raspberry Pi’s zijn voorzien van wifi, dus de verleiding is groot om daar voor je cluster gebruik van te maken om zo extra kabels uit te sparen, maar een ethernetswitch maakt je netwerkverbindingen toch heel wat betrouwbaarder en sneller. Dat hoeft geen duur model te zijn: voor twee tientjes heb je al een degelijke gigabit-ethernetswitch. Overigens haal je alleen op de Raspberry Pi 4 gigabitsnelheden (de oude modellen hebben een langzamere chip).
Let op dat je switch minstens één poort meer heeft dan het aantal Raspberry Pi’s in je cluster. De Pi’s sluit je elk met een kabel op de switch aan en met één extra kabel sluit je de switch op de rest van je netwerk aan.
Voor de netwerkkabels van je Pi’s kies je het best platte kabels; de klassieke netwerkkabels zijn niet gemaakt om sterk te buigen en nemen dan ook meer plaats in.
©PXimport
Daarna is het een kwestie van de switch en het laadstation in het stopcontact te steken en je Raspberry Pi’s op te starten. De eenvoudigste manier om dat te doen, is om elke Raspberry Pi van een micro-sd-kaart te voorzien met een besturingssysteem zoals Raspbian. Dat kan met een programma als balenaEtcher.
Als je niet al je Raspberry Pi’s continu wilt ingeschakeld hebben, zul je de stroom van individuele Pi’s moeten uitschakelen door de usb-laadkabel uit het laadstation of uit de Raspberry Pi te trekken. Heb je dit om een of andere reden vaak nodig, koop dan een of meerdere usb-laadkabels met ingebouwd knopje om de stroomtoevoer eenvoudig in- en uit te schakelen.
Statusleds
Ik heb lang overwogen om op elke Raspberry Pi een rij ledjes of een klein lcd-schermpje aan te sluiten om zo de status van het cluster te tonen, maar dat verhoogt de prijs significant. Voor de LED SHIM van Pimoroni betaal je bijvoorbeeld al bijna een tientje. Doe dat maal zes en je komt aan bijna zestig euro voor gewoon wat statusleds. Voor die prijs kun je een extra Raspberry Pi 4 kopen, het model met het meeste geheugen zelfs.
Ik vond een leuke lowtech-oplossing in het Mini Battery Display van Open-Smart. Voor 1,30 euro per stuk vind je dit kleine printplaatje met leds op AliExpress. Het bevat een ledbalk met tien segmenten, die je kunt aansturen om bijvoorbeeld de processorbelasting of cpu-temperatuur aan te duiden. Er bestaan versies in allerlei kleuren en met allerlei aantallen segmenten. Let op: de tiensegment-versie heeft eigenlijk maar zeven onafhankelijk werkende segmenten: de eerste twee, de zesde en de zevende en de achtste en de negende worden samen aangestuurd.
©PXimport
Het ledbordje bevat een TM1651-chip en heeft vier pinnen: GND, VCC (5 V), DIO en CLK. Die twee laatste zijn de pinnen waarop je data doorstuurt aan de chip om te kiezen welke segmenten je wilt doen oplichten. Bij de aankoop ontving ik een datasheet (in het Chinees) en een spaarzaam (in het Engels) becommentarieerde C++-bibliotheek en Arduino-code.
Sluit eerst het bordje aan op de gpio-pinnen van je Raspberry Pi en wel als volgt: VCC sluit je op 5 V aan (pin 4), GND op GND (pin 6), DIO op BCM23 (pin 16) en CLK op BCM24 (pin 18). Zie https://pinout.xyz voor de pinnummers van de Raspberry Pi.
Ik heb gezocht naar code om het ledbalkje aan te sturen op de Raspberry Pi, maar blijkbaar bestond die niet. Omdat mijn (al dan niet passieve) kennis van programmeertalen iets vlotter is dan van het Chinees, heb ik de code van de C++-bibliotheek gelezen. Die bleek heel verstaanbaar, maar ze werkte niet eens. Door de C++-code van een ander vergelijkbaar ledbalkje te bekijken dat wel werkte en wat concepten uit beide projecten te combineren, slaagde ik er na wat experimenteren in om Python-code te schrijven om het ledbalkje aan te sturen.
Je installeert het Python-programma als volgt op Raspbian:
sudo pip3 install rpi-mini-battery-display
Daarna kun je naar believen het ledbalkje aansturen om de processorbelasting van je Raspberry Pi aan te geven:
rpi-mini-battery-display --processor
Zie de projectpagina op PyPI voor verdere instructies en extra mogelijkheden.
Zes van deze ledbalkjes passen precies op een breadboard, dus dat kun je voor of op de clusterbehuizing van je zes Raspberry Pi’s plaatsen. En zo heb je een goedkoop statusschermpje voor je cluster.
©PXimport
Wat kan beter?
Ik heb heel veel tijd in de voorbereiding en het uitzoeken van de juiste componenten gestoken, waardoor het cluster eigenlijk onmiddellijk bruikbaar was. Maar zoals altijd maak je een eerste keer toch verkeerde keuzes. In mijn drang om mijn Pi-cluster zo compact mogelijk te houden, heb ik de kabellengtes eigenlijk iets te krap genomen, wat mijn opties voor de opstelling beperkt.
Voor een verticale opstelling zijn de netwerkkabels van 25 cm echt te kort, waardoor ik de switch verticaal tegen de clusterbehuizing moet vastsnoeren of ze half zwevend op de ondergrond moet laten rusten. Het eerste is niet optimaal voor de warmteontwikkeling, het tweede niet netjes. Ook had ik redelijk dikke platte kabels gekocht, met een hoge stijfheid; dunnere flexibele kabels waren beter geweest. Hetzelfde probleem had ik met de laadkabels: omdat die zo stijf zijn, moet het laadstation half zwevend op zijn kant liggen.
Als ik de behuizing horizontaal opstel, met alle Pi’s op hun kant met de gpio-header onderaan, zijn de netwerkkabels niet het probleem (ze zijn dan zelfs eigenlijk te lang), maar de voedingskabels zijn dan iets te kort, waardoor het laadstation volledig in de lucht zweeft of op een verhoging gestabiliseerd moet worden. De horizontale opstelling met laadstation op een verhoging is voorlopig mijn voorkeursopstelling van dit cluster.
Conclusie
Op de kabels na ben ik eigenlijk heel tevreden met dit cluster. Maar ik wil nog enkele zaken verder uitwerken. Allereerst wil ik er een écht cluster van maken, met Kubernetes. Vorig jaar heb ik stuk voor stuk allerlei diensten die thuis draaien gemigreerd naar Docker-containers, verspreid over mijn nas en enkele Raspberry Pi’s. Met Kubernetes kan ik die automatisch over mijn Raspberry Pi-cluster verdelen zodat de Pi’s allemaal gelijkmatig belast zijn.
Een systeem als dit schreeuwt ook om een meer netwerkgebaseerde implementatie. Momenteel heeft elke Pi in het cluster zijn eigen micro-sd-kaartje waarvan het zijn besturingssysteem opstart en waarop het zijn gegevens opslaat. Maar als je een nas hebt, is het maar een kleine stap om van gedeelde opslag op je nas gebruik te maken voor je Pi’s.
Als je dan ook nog de images voor de besturingssystemen van de Pi’s op een nfs-server plaatst en de Pi’s via een netboot-server van deze images laat opstarten op het netwerk, heb je zelfs geen micro-sd-kaartjes meer nodig.
Maar hoewel ik nog heel wat aan dit cluster wil uitbreiden, doet hij zijn werk al goed. Ik probeer nu sneller nieuwe zaken op mijn Raspberry Pi’s uit omdat ik er geen werkloze Raspberry Pi’s meer voor uit een doos hoef te halen. En mijn bureau ziet er heel wat netter uit