U junu 2022. naišao sam na Kickstarter o ploči koja može imati do 4 Raspberry Pi 4 računarska modula odjednom.
Bez mnogo razmišljanja, odlučio sam da podržim projekat i kupim ploču.
Premotamo dvije godine unaprijed, a moj Turing Pi 2 je još uvijek stajao neotvoren u kutiji na polici koja mi je život stao na put, i nisam bio siguran zašto sam ga uopće kupio.
Međutim, konačno sam odlučio da pokušam. Želeo sam da naučim više o grupisanju i nikada ranije nisam napravio kompletan Kubernetes klaster od nule. Dakle, otišao sam u režim potrošnje i nabavio tri Raspberry Pi 4s (8GB RAM, 8GB interne memorije) i jedan Nvidia Jetson Nano (4GB).
S obzirom na svestranost ploče, mogao bih miješati različite računarske module. Odlučio sam da uključim Jetson Nano, misleći da bi mi to moglo omogućiti da eksperimentišem sa CUDA drajverima u budućnosti i uđem u mašinsko učenje. ko zna Možda ću čak i na kraju ugostiti svog GPT asistenta na ovom Kubernetes klasteru.
(Spoilers: It didn't happen)
Moj početni plan je uključivao 3 Pi 4 CM i Jetson Nano postavljene na ploči. Takođe, planirao sam da koristim SSD disk od 1TB za skladištenje i Wi-Fi karticu za pristup internetu. Međutim, nakon što sam naišao na brojne poteškoće u procesu postavljanja Jetson Nano-a i njegove loše dokumentacije, odlučio sam ga vratiti. Umjesto toga, odlučio sam se za četvrti Raspberry Pi 4.
Pored toga, imao sam stari Raspberry Pi 4 sa 4 GB RAM-a koji je ležao okolo, pa sam odlučio da ga ugradim kao peti čvor.
Turing Pi 2 je ploča Mini ITX formata koja može da primi do četiri Raspberry Pi računarska modula (takođe kompatibilna sa Jetson Nanos i Turing Compute Module). Poseduje PCI Express port, dva NVME porta, dva SATA porta i USB port za flešovanje računarskih modula.
Čvor 1 :
USB 2.0 port (za flešovanje računarskih modula)
HDMI port (za otklanjanje grešaka)
PCI Express port (za Wi-Fi karticu)
Čvor 2 :
Koristio bih ovaj za NVME skladištenje, ali nije kompatibilan sa Raspberry Pi 4s.
Čvor 3 :
SATA portovi se, međutim, ovdje mogu koristiti. Dakle, ovaj čvor će imati NFS deljeni disk.
Čvor 4 :
USB 3.0 portovi (ako mi ikada zatrebaju).
Moja stara malina :
Konačno, ideja je da se ugosti Media Server sa nekim dodacima.
Prošlo je dosta vremena otkako sam sastavio računar, i to je bio prvi put da sam se igrao sa Compute Modules i njihovim adapterima, tako da je to bilo dosta zabave za vikend. Pošto mi je novčanik bio vruć, ali još uvijek nije gorio, pomislio sam, zašto dovraga ne bih dodao lijepu torbicu za njega?
S obzirom na Mini ITX oblik ploče, mogao bih je uklopiti u bilo koje otmjeno ITX kućište koje sam mogao pronaći na Amazonu. Qube 500 me je provukao. Već sam pravio DIY klaster, najbolji slučaj za tako nešto je bio i DIY.
Dodao sam i napajanje od 650 W (totalni višak), jednu malu Wi-Fi Mini PCI Express karticu i 1TB SATA SSD.
Sastavljanje 'stvari' bilo je prilično jednostavno. Malo termalne paste između računarskih modula i njihovih hladnjaka i spajanja ih zajedno sa njihovim adapterima prije nego što ih postavite u red u Turing Board-u;
Narudžbu sam spomenuo jer je to bio značajan dio projekta. Turing Pi 2 nudi upravljanje svojim portovima raspoređenim kroz računarske module. U ovom slučaju, PCI Express 1 je upravljao prvi čvor, dok je SSD diskom upravljao treći. Drugi je mogao upravljati NVME portom, a 4. na drugom SSD IIRC-u, ali mi trenutno nisu koristili.
Već sam instalirao Raspberry Pis, ali nikada Compute Module. Turing Pi 2 ima USB port pozadi koji se koristi za flešovanje računarskih modula.
Nažalost, pokušao sam da koristim USB A na USB A kabl koji nije kabl za prenos podataka, pa sam dok sam čekao da Amazon isporuči kabl pronašao drugi način da flešujem računarske module.
Turing Pi 2 ima CLI alat koji se može koristiti ne samo za flešovanje računarskih modula već i za upravljanje njihovom snagom, resetovanje, provjeru neke statistike itd.
Naredba korištena za instaliranje Compute Module je bila:
tpi flash -i /path/to/image -n {nodes 1 to 4}
Prilično jednostavan proces pomislio sam u sebi prije nego što sam shvatio da Raspbian slika ne dolazi sa SSH omogućenim po defaultu.
To, naravno, nije Turingova odgovornost. Trebao sam sačekati tu kablovsku, ali dobro.
Da to popravim, morao sam montirati sliku na svoju lokalnu mašinu i dodati praznu datoteku pod nazivom ssh
u particiju za pokretanje. Ovo bi podrazumevano omogućilo SSH.
sudo mkdir /mnt/pi-boot sudo mount /dev/sdX1 /mnt/pi-boot sudo touch /mnt/pi-boot/ssh sudo umount /mnt/pi-boot
Sada, sve moje moke su bile spremne za upotrebu. Povezao sam ih na mrežu i počeo ih konfigurirati. Bilo je malo toga za konfiguraciju jer sam ih namjeravao koristiti kao Kubernetes čvorove.
Ali stvari kao što su vim i ažuriranje sistema su bile neophodne.
Ovo mi je također dalo priliku da naučim kako koristiti Tmux . Najbolji alat koji sam naučio u posljednje vrijeme.
Ako se sećate nekoliko paragrafa iznad, spomenuo sam da će se treći čvor koristiti za NFS deljeni disk. Imao sam 1TB SSD disk koji sam namjeravao koristiti u tu svrhu. Morao sam ga formatirati i montirati u 3. čvor.
Ali takođe sam morao da instaliram NFS server u ovaj čvor i da ga konfigurišem u drugim čvorovima. Da li se ovo preporučuje za proizvodno okruženje? Dovraga, ne, ali to je kućni klaster, tako da nisam previše zabrinut zbog toga.
Evo koraka koje sam preduzeo da konfigurišem NFS server:
pi@turing-03:/mnt/ssd/data $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 953.9G 0 disk /mnt/ssd mmcblk0 179:0 0 7.3G 0 disk ├─mmcblk0p1 179:1 0 512M 0 part /boot/firmware └─mmcblk0p2 179:2 0 6.8G 0 part / mmcblk0boot0 179:32 0 4M 1 disk mmcblk0boot1 179:64 0 4M 1 disk
Prvo sam provjerio da li je disk ispravno montiran. Zatim sam instalirao NFS server:
sudo mkdir /mnt/nfs_share sudo mount /dev/sda /mnt/nfs_share
Dodao sam ga u fstab datoteku kako bi se uvjerio da je montiran pri pokretanju:
(dodavanje sljedećeg reda u /etc/fstab
fajl)
echo '/dev/sda /mnt/ssd ext4 defaults 0 0' | sudo tee -a /etc/fstab
Sada instaliram nfs-kernel-server:
sudo apt update sudo apt install nfs-kernel-server
I dodavanje mog diska u /etc/exports
fajl:
echo '/mnt/ssd *(rw,sync,no_subtree_check,no_root_squash)' | sudo tee -a /etc/exports
Sada, na drugim čvorovima, morao sam da instaliram nfs-common:
sudo apt update sudo apt install nfs-common
I spajanje pogona na svaki čvor:
sudo mount -t nfs {IP-for-the-drives-node}:/mnt/ssd /mnt
Neofetch je instaliran u svim čvorovima jer sam fensi.
Nikada ranije nisam postavljao Kubernetes klaster od nule, ali sam gledao dosta videa Jeffa Geerlinga na tu temu... Ovo je dovoljno iskustva, zar ne?
Jeff me je doveo do K3s koristeći Ansible , laganu Kubernetes distribuciju koja je savršena za moj kućni klaster i unaprijed definiran način instalacije jer nemam preduslove niti ideju kako da je drugačije podesim.
Instalacija je bila prilično jednostavna. Morao sam ga instalirati u sve čvorove, ali sam morao biti siguran da je glavni čvor prvi koji će biti instaliran.
Dakle, prvo sam klonirao k3s-ansible spremište:
git clone https://github.com/k3s-io/k3s-ansible.git
Onda sam morao da konfigurišem datoteku inventara. Moj glavni čvor, kao što sam već spomenuo, bio je moj stari Raspberry Pi 4. Tako da sam morao biti siguran da je to prvi u inventaru. Takođe sam morao da se uverim da su ostali čvorovi u ispravnim grupama.:
k3s_cluster: children: server: hosts: 192.168.2.105: agent: hosts: 192.168.2.101: 192.168.2.102: 192.168.2.103: 192.168.2.104:
U toj istoj datoteci, morao sam postaviti token za šifriranje. Datoteka pokazuje kako se to radi, tako da neću ulaziti u detalje ovdje.
Onda sam morao da pokrenem playbook:
cd k3s-ansible ansible-playbook playbooks/site.yml -i inventory.yml
To je to. Što se tiče instalacije, imao sam Kubernetes klaster koji je pokrenut. Morao sam da instaliram K9s na svoju lokalnu mašinu da upravljam klasterom i povežem klaster sa ./kube/config
fajlom.
Na kraju, morao sam instalirati aplikacije koje sam htio pokrenuti u klasteru. Imao sam neke ideje šta želim.
Tu dolazi moje spremište .
Za Media Server sam odlučio da koristim:
Kao primjer, pokazat ću vam kako sam instalirao Sonarr koristeći kubectl
. Ostale aplikacije su instalirane na sličan način.
Za svaku aplikaciju kreirao sam 3 fajla:
deployment.yaml
je konfiguracija za svaki od podova koji pokreće aplikaciju
apiVersion: apps/v1 kind: Deployment metadata: name: sonarr spec: replicas: 1 selector: matchLabels: app: sonarr template: metadata: labels: app: sonarr spec: containers: - name: sonarr image: linuxserver/sonarr ports: - containerPort: 8989 env: - name: PUID value: "911" - name: PGID value: "911" - name: TZ value: "Europe/Amsterdam" volumeMounts: - mountPath: /data name: data - name: config mountPath: /config volumes: - name: data persistentVolumeClaim: claimName: nfs-pvc - name: config persistentVolumeClaim: claimName: nfs-config-pvc
service.yaml
je konfiguracija za uslugu koja će izložiti aplikaciju klasteru
apiVersion: v1 kind: Service metadata: name: sonarr spec: selector: app: sonarr ports: - port: 80 targetPort: 8989 type: ClusterIP
ingress.yaml
i ovo je konfiguracija za ingress koja će izložiti aplikaciju mojoj mreži
Zatim ih sve implementiramo koristeći kubectl
:
kubectl apply -f sonarr/deployment.yaml kubectl apply -f sonarr/service.yaml kubectl apply -f sonarr/ingress.yaml
Kao što vidite, koristim NFS-podržano trajno skladište za podatke i konfiguraciju aplikacija.
U spremištu možete pronaći datoteke nfs-pv.yaml i nfs-pvc.yaml koje sam koristio da kreiram NFS skladište.
Dodatno, kreirao sam još jednu trajnu tvrdnju o volumenu za konfiguraciju aplikacija.
Iako kućište izgleda neverovatno, malo je preveliko za Raspberry Pi Cluster. Mini ITX kućište bi takođe odgovaralo mojim potrebama, ali moram priznati da sam zaljubljenik u DIY stvari.
Također, usisivač za LED diode općenito. Nisam dodao više svjetla u kućište, ali mislim da ploča već radi dobar posao. Nažalost, pinovi ventilatora nisu bili kompatibilni sa pločom, a ja nisam kupio kontroler ventilatora ili pin za matičnu ploču. Možda u budućnosti.
Ponekad se jednostavno morate zavaliti i uživati u pogledu.
I konačno, Turing Pi 2 Home Cluster je pokrenut i moja kuća više nije u neredu.
Samo će vrijeme pokazati šta ću sa ovim klasterom.
Međutim, razmišljao sam o tome da dodam Prometheus i Grafana kako bi imali neke metrike i lijepe grafikone za provjeru klastera.
Migracija svih mojih Kubernetes fajlova u Helm takođe bi bila dobra ideja.
Konačno, Retroarch instanca je još uvijek u izradi. Možda je u radu malo previše optimistično s obzirom da pod živi u CrashLoopBackOff stanju. Ali stići ću tamo.
Ako ste stigli do kraja ovog posta, zahvaljujem vam na izdvojenom vremenu. Nadam se da ste uživali isto kao i ja u sastavljanju klastera i pisanju o tome.