Een Pi Zero docker cluster

Door synoniem op donderdag 13 mei 2021 16:39 - Reacties (5)
Categorie: Raspberry Pi, Views: 7.771

Na hele drukke maanden werd het weer eens tijd voor een fun projectje met een nuttig tintje. Kijkend naar de voorraad Pi Zero W die ik in de loop van de tijd verzameld heb kwam ik op het idee om daar een cluster van te maken. Enig praktisch nut heeft zo weinig rekenkracht natuurlijk niet maar om iets te leren van containers met nodes, services en scaling is het een van de goedkoopste clusters die je kunt hebben.

De hardware
Aanvankelijk was mijn bedoeling dat mijn clusters uit vier Pi Zero W zou bestaan. Hiervoor heb ik ook vier Raspberry Pi Zero Cluster mounting brackets laten 3D printen.

https://cdn.thingiverse.com/renders/02/d1/f4/84/e6/a98851097ae703fd512857208cd41ef5_display_large.JPG

Helaas bleek dat er één Pi tussen zat waarvan de wifi niet betrouwbaar werkend was te krijgen. Vandaar dat mijn cluster nu bestaat uit drie Zero's en één Pi 2B die uiteraard niet in zo'n bracket past. Overigens zijn de aanbevolen M2.5 schroefjes met een goede lengte om de Pi's vast te zetten ook niet overal verkrijgbaar.

De software
Voor de Pi Zero is de Raspi OS 32-bits ARMHF versie beschikbaar waarop elke Pi kan lopen. Nu is ARMHF een hack waar een ARM32v6 processor met hardware floating points iets beter presteert dan met Armel (ARMV32v5) met software floating point emulatie. Waarom is dit belangrijk? Omdat de Pi 1 en de Zero een ARM32v6 processor hebben terwijl de 2 en de 3 een ARM32v7 en de 4 zelfs een ARM64v8 hebben.

Nu zijn ARM32v6 processoren ook niet heel krachtig en hebben vaak ook niet veel geheugen. Om die reden vind je ook weinig docker container images voor dit processor type. Maar gelukkig is Docker zelf wel beschikbaar en vrij eenvoudig te installeren met de volgende commando's:

sudo apt-get update && sudo apt-get upgrade

curl -fsSL https://get.docker.com -o get-docker.sh

chmod +x get-docker.sh

sudo sh ./get-docker.sh

sudo usermod -aG docker [user_name]

Na het laatste commando moet je eerst even uitloggen en weer inloggen. Door je gebruikersnaam toe te voegen aan de docker group hoef je niet elke keer sudo in te tikken bij de docker commando's. In een productieomgeving zou ik dat niet snel doen omdat je daarmee root rechten geeft aan de gebruiker maar voor een projectje als dit kan het wel.

De orchestration software
Om een cluster te besturen heb je orchestration software nodig. De meest gebruikte tool hiervoor is Kubernates alias k8s maar die valt af omdat het niet beschikbaar en veel te zwaar voor een Pi Zero is. Er is wel een lichtere versie van Rancher ook bekend als k3s en oudere versies werkte per ongeluk ook op de ARM32v6 processors door wat extra kernel opties aan te zetten. Ook die viel dus af want extra gepiel en dan nog geen recente versie van de software zit ik niet op te wachten. Blijft over het gebruik van Docker Swarm van Docker zelf.

De service om te draaien
De volgende vraag was welke service zou ik op het cluster willen draaien? De standaard nginx voorbeelden ben je na een uurtje wel op uitgekeken en toont in mijn opinie weinig van de toegevoegde waarde van een cluster. Geïnspireerd door de jaarlijks Stampede besloot ik om een BOINC client te gaan draaien.

Dat was gemakkelijker gezegd dan gedaan. Er zijn heel veel kant en klare images van Boinc beschikbaar op Docker Hub. Zelfs voor een ARM32v7 processor maar niet voor een ARM32v6. Die zul je zelf moeten maken. Ook dat was gemakkelijker gezegd dan gedaan.

Mijn eerste poging was met een Alpine base image. Dat mislukte omdat Alpine al gebruikt maakt van time64 tegen de Linux jaar 2038 bug maar de 32-bits versies van Raspi OS op de hosts nog niet.

De tweede poging was door gebruik te maken van de base image van resin/rpi-raspbian. Helaas hebben deze images op de Hub een AMD64 tag waardoor ze lokaal op een Pi een foutmelding geven maar wel starten. Wil je ze echter starten als een service op een cluster dan breken ze af vanwege deze tag.

Driemaal is scheepsrecht. Voor de derde poging heb ik alle bestanden uit de Raspbian Buster image van resin geëxporteerd naar een TAR bestand buiten de container. Dit TAR bestand importeer ik vervolgens weer in een nieuwe van scratch opgebouwde container waar aan ik ook de boinc-client toevoeg. Het tarbestand en de Dockerfile, om zelf de image te maken, kun je in mijn Github repo terug vinden. Je kunt ook de image rechtstreeks van mijn repo op Docker Hub synoniem/boinc-pi-zero kopiëren.

Boinc als service opstarten
Tijd om eindelijk het cluster te starten en een netwerk te creëren:
docker swarm init

docker network create -d overlay --attachable boinc


Vervolgens heeft het boinc image nog een en ander nodig aan parameters om op te starten:
docker service create \
  --replicas <N> \ 
  --name boinc \
  --network=boinc \
  --mount type=volume,source=boinc,destination=/var/lib/boinc \ 
  --replicas-max-per-node 1 \
  -p 31416:31416 \
  -e BOINC_REMOTE_HOST="0.0.0.0" \
  -e BOINC_GUI_RPC_PASSWORD="123" \
  -e BOINC_CMD_LINE_OPTIONS="--allow_remote_gui_rpc" \
  -e TZ=Europe/Amsterdam \
  synoniem/boinc-pi-zero

Wat extra uitleg bij de parameters: Bij --replicas vul je het aantal containers in wat je wil opstarten. Bij --mount type creëer je een persistent volume per node zodat je tussentijdse boinc resultaten niet weggegooid worden als je cluster crashed of terug geschaald wordt.
Om te voorkomen dat twee containers hetzelfde volume gebruiken beperk je het aantal replicas per node tot 1.

Om de Boinc client opdrachten te geven vanaf de opdrachtregel gebruik je normaal het commando boinccmd (zie https://boinc.berkeley.edu/wiki/Boinccmd_tool). Bij het opbouwen van de container is hier voor de wrapper boinccmd_swarm toegevoegd waarmee op alle actieve containers de boinccmd opdrachten worden uitgevoerd. Zo kun je om je boinc project mee te geven aan de containers het volgende commando geven:
docker run --rm --network boinc synoniem/boinc-pi-zero boinccmd_swarm --passwd 123 --project_attach https://project.url account_key

Dit is uiteraard maar een voorbeeld. Voor een uitgebreide tutorial kun je op https://docs.docker.com/e...rm-tutorial/create-swarm/ nog veel meer vinden.

Volgende: Pi Zero radio aanvulling 3 07-'20 Pi Zero radio aanvulling 3

Reacties


Door Tweakers user Luc45, vrijdag 14 mei 2021 13:10

Was het nog lastig om in grotere getallen aan de Pi zero te komen, gezien ze vaak maar 1 stuk per klant mogen verkopen?

Door Tweakers user synoniem, vrijdag 14 mei 2021 16:37

Ik heb er in de loop van de tijd telkens één gekocht voor een projectje. Voor grotere aantallen moet je bij Ali zijn, hier in Nederland is het vaak maar één per klant inderdaad.

Door Tweakers user RobIII, vrijdag 14 mei 2021 17:35

hier in Nederland is het vaak maar één per klant inderdaad
In de meeste landen als ik me niet vergis.

Door Gotiniens, donderdag 20 mei 2021 16:04

Ik heb een tijdje geleden een k3s cluster gebouwd op RPi4's, helaas liep ik al snel tegen problemen aan dat de software die ik wilde draaien op het cluster alleen voor x86 beschikbaar was.

Verder zie ik zeker potentie in kubernetes op RPi, is een mooi goedkoop klein platform om te spelen met cluster technieken.

Door Tweakers user synoniem, donderdag 20 mei 2021 17:31

Gotiniens schreef op donderdag 20 mei 2021 @ 16:04:
Ik heb een tijdje geleden een k3s cluster gebouwd op RPi4's, helaas liep ik al snel tegen problemen aan dat de software die ik wilde draaien op het cluster alleen voor x86 beschikbaar was.
Mijn ervaringen zijn wat wisselend op dat gebied. In de meeste gevallen is er wel een docker build of een docker-compose script te vinden. Maar er is inderdaad software die alleen onder x86 draait.
Verder zie ik zeker potentie in kubernetes op RPi, is een mooi goedkoop klein platform om te spelen met cluster technieken.
Ja die potentie is er zeker en ook van dit simpele clustertje heb ik al het nodige geleerd. Mijn volgende build is dan wel met RPi3's omdat ik die nu langzamerhand aan het vervangen ben door Pi 4's.

Reactie formulier
(verplicht)
(verplicht, maar wordt niet getoond)
(optioneel)