Kubernetes cluster a tenyeremben

Posted 2023-03-14 08:00:00 by sanyi ‐ 4 min read

Kubernetes cluster és Gitlab CI runner Raspberry PI alapon

Régóta kísérletezem Kubernetes cluster-ek felépítésével, többnyire vagy a cloud-ban (AWS, Azure, GCP) vagy a Mito cluster-én virtuális gépekben. Szerettem volna egy igazi bare metal cluster-t is, de itthonra beszerezni egy kupac szervert elég drága lett volna, nem mellesleg zajos is.

Gondoltam tegyünk egy próbát a Raspberry PI-vel, a PI4B 8 GB verziója már egész jól használható konfiguráció, egy 64 bites ARM CPU van benne.

Sajnos amikor keresgéltem a Raspberry szinte mindenhol hiánycikk volt, ahol lehetett kapni ott is max. egy-egy darabot. Ekkor futottam bele a PicoCluster LLC oldalába, ők kifejezetten ilyen miniatűr cluster konfigurációkat építenek, nem csak Raspberry hanem más hasonló platformokon is. Történetesen volt készletük a PI4 8GB verziójából, így rendeltem is tőlük egy ilyen dobozt:

Kicsit drágább volt így mintha magam építettem volna, de néhány hét múlva már a kezemben is volt a cluster.

Akkoriban ezek a gépek még 32 bites Raspbian-nal telepítve jöttek, ami nem alkalmas Kubernetes futtatására, így azonnal lecseréltem az operációs rendszert az Ubuntu 20.10 LTS 64-bit ARM64 verziójára. Az Ubuntu ennél újabb verziói cgroups v2 alapúak, azok nekem nem jöhettek szóba mert a cluster-ek menedzsmentjére Rancher-t használok, ami akkor még nem volt cgroups v2 kompatibilis.

A gyári beállításokhoz képest be kell konfigurálni néhány kernel paramétert:

cgroup_enable=cpuset cgroup_enable=memory cgroup_memory=1

Alapesetben ezeket a paramétereket /boot/firmware/cmdline.txt állományban kell beállítani. A cmdline.txt elérési útja azonban felülírható a /boot/firmware/config.txt -ben, a cmdline paraméterben, ellenőrizd ennek értékét.

Reboot után a cat /proc/cmdline futtatásával ellenőrizheted hogy a kernel paraméterek tényleg be vannak-e állítva.

Ha Rancher-t használsz, akkor a Rancher-ben CNI driver-nek a flannel-t kell választani.

Végül a játékon túl valós feladatot is találtunk ennek a kis cluster-nek. A Mito-nál elég sokan használnak Macbook-okat, aminek az újabb verziói már M1 vagy M2 processzoron alapulnak, ami ugyanúgy ARM64 architektúra mint a Raspberry PI4. Emiatt felmerült az igény hogy bizonyos docker image-eket ARM64 architektúrára is build-eljünk le. A dolog megoldható lett volna mondjuk egy M1-es Mac Mini-n futtatott linuxos virtuális gépben vagy ha a cloud felé fordulunk akkor AWS EC2 Graviton alapú virtuális gépeken, de ha már kéznél volt a Raspberry cluster, akkor kipróbáltuk azt is.

Az első eredmények elég elkeserítőek voltak, az alaplapon levő kártyaolvasóba tett microSD kártya rettentő lassú, ráadásul nem is viselné jól a folyamatos írást.

A megfelelő I/O teljesítmény érdekében érdemes egy külső USB-s M.2 NVMe SSD-t használni (ez kb. négyszer gyorsabb mint az onboard microSD). Viszont egy ilyen NVMe SSD teljesítményfelvétele kb. 8-10W, ez nagyon közel van ahhoz a határhoz amit a Raspberry Pi 4B összesen ki bír adni az USB portjain.

Ha az SSD mellett még a CPU is jelentős terhelés kap, akkor előfordulhat hogy kellő teljesítmény hiányában a külső SSD leáll. Ennek elkerülésére célszerű egy powered USB hub-ot iktatni a Raspberry és az SSD közé. A backpower probléma miatt a Raspberry csak néhány USB hub-bal működik tökéletesen, én még a UGreen 4-in-1 USB 3.0 Data HUB-ot használtam, de azt már nem nagyon lehet kapni. Itt ajánlanak néhány kipróbált típust.

A külső SSD-t a /var/lib/docker alá csatoltam fel, így arra ment minden docker image és volume. Ennek a teljesítménye már egész jó volt, kicsit lassabb mint a normál x86-64 build-jeink, de hasonló nagyságrend. Egy kivétel volt: a kifejezetten CPU igényes Rust kód fordítások. Na ez x86-64 -en lefutott kb. 10-15 perc alatt, a Raspberry-n viszont kb. 1 órán keresztül tartott. Ezek a kis Cortex-A72 magok azért nem versenyezhetnek egy M1-es CPU-val.

A cluster most már több mint egy éve dolgozik itt az asztalomon, villog mint egy karácsonyfa, de sok zajt nem csinál: a levegő mozgatásáról egy csendes, 8 cm-es ventillátor gondoskodik.

Címkék:
kubernetes gitlab raspberry picocluster