У чэрвені 2022 года я наткнуўся на Kickstarter аб плаце, здольнай адначасова мець да 4 вылічальных модуляў Raspberry Pi 4 .
Без асаблівых разважанняў я вырашыў падтрымаць праект і набыць дошку.
Хуткая перамотка наперад на два гады, і мой Turing Pi 2 усё яшчэ ляжаў нераскрытым у сваёй скрынцы на паліцы. Жыццё перашкодзіла, і я не быў упэўнены, навошта я яго купіў.
Аднак я нарэшце вырашыў паспрабаваць. Я хацеў даведацца больш пра кластэрызацыю і ніколі раней не ствараў поўны кластар Kubernetes з нуля. Такім чынам, я перайшоў у рэжым выдаткаў і набыў тры Raspberry Pi 4 (8 ГБ аператыўнай памяці, 8 ГБ унутранай памяці) і адзін Nvidia Jetson Nano (4 ГБ).
Улічваючы ўніверсальнасць платы, я мог бы змяшаць розныя вылічальныя модулі. Я вырашыў уключыць Jetson Nano, думаючы, што гэта можа дазволіць мне эксперыментаваць з драйверамі CUDA ў будучыні і паглыбіцца ў машыннае навучанне. Хто ведае? Я мог бы нават размясціць свайго памочніка GPT на гэтым кластары Kubernetes.
(Spoilers: It didn't happen)
Мой першапачатковы план уключаў 3 Pi 4 CM і Jetson Nano, размешчаныя на дошцы. Акрамя таго, я планаваў выкарыстоўваць цвёрдацельны назапашвальнік на 1 ТБ для захоўвання і карту Wi-Fi для доступу ў Інтэрнэт. Аднак, сутыкнуўшыся са шматлікімі цяжкасцямі з працэсам наладкі Jetson Nano і дрэннай дакументацыяй, я вырашыў вярнуць яго. Замест гэтага я абраў чацвёрты Raspberry Pi 4.
Акрамя таго, у мяне быў стары Raspberry Pi 4 з 4 ГБ аператыўнай памяці, таму я вырашыў уключыць яго ў якасці пятага вузла.
Turing Pi 2 - гэта плата ў фармаце Mini ITX, якая можа змясціць да чатырох вылічальных модуляў Raspberry Pi (таксама сумяшчальных з Jetson Nanos і вылічальным модулем Turing). Ён мае порт PCI Express, два порта NVME, два порта SATA і порт USB для прашыўкі вылічальных модуляў.
Вузел 1 :
Порт USB 2.0 (для прашыўкі вылічальных модуляў)
Порт HDMI (для адладкі)
Порт PCI Express (для карты Wi-Fi)
Вузел 2 :
Я б выкарыстаў гэты для захоўвання NVME, але ён несумяшчальны з Raspberry Pi 4s.
Вузел 3 :
Парты SATA, аднак, могуць быць выкарыстаны тут. Такім чынам, гэты вузел будзе мець агульны дыск NFS.
Вузел 4 :
Парты USB 3.0 (калі яны мне калі-небудзь спатрэбяцца).
Мая старая маліна :
У рэшце рэшт, ідэя складаецца ў тым, каб размясціць медыясервер з некаторымі дапаўненнямі.
Прайшло шмат часу з таго часу, як я сабраў камп'ютар, і гэта быў першы раз, калі я пагуляў з вылічальнымі модулямі і іх адаптарамі, так што гэта было шмат задавальнення на выходных. Паколькі мой кашалёк быў гарачы, але ўсё яшчэ не гарэў, я падумаў, чаму б, чорт вазьмі, не дадаць для яго прыгожы чахол?
Улічваючы формаў-фактар платы Mini ITX, я мог бы змясціць яе ў любы шыкоўны чахол ITX, які змог знайсці на Amazon. Qube 500 правёў мяне наскрозь. Я ўжо рабіў кластар "зрабі сам", лепшы варыянт для такой рэчы таксама быў "зрабі сам".
Я таксама дадаў блок харчавання на 650 Вт (поўнае лішак), адну невялікую карту Wi-Fi Mini PCI Express і 1 ТБ SSD SSD.
Сабраць «рэч» было даволі проста. Трохі тэрмічнай пасты паміж вылічальнымі модулямі і іх радыятарамі і сціскаючы іх разам з адаптарамі, перш чым усталяваць іх у парадак на плаце Turing;
Я згадаў пра заказ, таму што ён быў значнай часткай праекта. Turing Pi 2 прапануе кіраванне сваімі партамі, размеркаванымі па вылічальных модулях. У гэтым выпадку PCI Express 1 кіраваўся першым вузлом, а SSD-назапашвальнікам кіраваў трэці. 2-гі мог працаваць з портам NVME, а 4-ы - з іншым цвёрдацельным назапашвальнікам IIRC, але цяпер яны мне не патрэбныя.
Я ўсталёўваў Raspberry Pis раней, але ніколі не ўсталёўваў Compute Modules. У Turing Pi 2 ззаду ёсць порт USB, які выкарыстоўваецца для прашыўкі вылічальных модуляў.
На жаль, я паспрабаваў выкарыстаць кабель USB A да USB A, які не быў кабелем для перадачы даных, таму пакуль я чакаў, пакуль Amazon даставіць кабель, я знайшоў іншы спосаб прашыўкі вылічальных модуляў.
У Turing Pi 2 ёсць інструмент CLI, які можна выкарыстоўваць не толькі для прашыўкі вылічальных модуляў, але і для кіравання іх магутнасцю, скіду іх, праверкі некаторай статыстыкі і гэтак далей.
Каманда, якая выкарыстоўвалася для ўстаноўкі вылічальных модуляў:
tpi flash -i /path/to/image -n {nodes 1 to 4}
Даволі просты працэс, я думаў пра сябе, перш чым зразумеў, што вобраз Raspbian не пастаўляецца з уключаным SSH па змаўчанні.
Гэта, вядома, не ўваходзіць у абавязкі Цьюрынга. Я павінен быў пачакаць гэтага кабеля, але добра.
Каб выправіць гэта, мне прыйшлося змантаваць вобраз на сваёй лакальнай машыне і дадаць пусты файл з імем ssh
у раздзел загрузкі. Гэта ўключыць SSH па змаўчанні.
sudo mkdir /mnt/pi-boot sudo mount /dev/sdX1 /mnt/pi-boot sudo touch /mnt/pi-boot/ssh sudo umount /mnt/pi-boot
Цяпер увесь мой піж быў гатовы да выкарыстання. Я падключыў іх да сеткі і пачаў наладжваць. Не было чаго наладжваць, бо я збіраўся выкарыстоўваць іх у якасці вузлоў Kubernetes.
Але такія рэчы, як vim і абнаўленне сістэмы, былі неабходныя.
Гэта таксама дало мне магчымасць навучыцца карыстацца Tmux . Лепшы інструмент, якому я навучыўся за апошні час.
Калі вы памятаеце некалькі абзацаў вышэй, я згадваў, што 3-ці вузел будзе выкарыстоўвацца для агульнага дыска NFS. У мяне быў цвёрдацельны назапашвальнік на 1 ТБ, які я збіраўся выкарыстоўваць для гэтай мэты. Я павінен быў адфарматаваць яго і змантаваць яго ў 3-м вузле.
Але мне таксама трэба было ўсталяваць сервер NFS у гэтым вузле і наладзіць яго ў іншых вузлах. Гэта рэкамендуецца для вытворчага асяроддзя? Чорт вазьмі, не, але гэта хатні кластар, так што я не надта пра гэта хвалююся.
Вось крокі, якія я зрабіў, каб наладзіць сервер NFS:
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
Спачатку я праверыў, ці правільна ўсталяваны дыск. Затым я ўсталяваў сервер NFS:
sudo mkdir /mnt/nfs_share sudo mount /dev/sda /mnt/nfs_share
Дадаў яго ў файл fstab, каб пераканацца, што ён быў усталяваны пры загрузцы:
(даданне наступнага радка ў файл /etc/fstab
)
echo '/dev/sda /mnt/ssd ext4 defaults 0 0' | sudo tee -a /etc/fstab
Цяпер усталяванне nfs-kernel-server:
sudo apt update sudo apt install nfs-kernel-server
І даданне майго дыска ў файл /etc/exports
:
echo '/mnt/ssd *(rw,sync,no_subtree_check,no_root_squash)' | sudo tee -a /etc/exports
Цяпер, на іншых вузлах, я павінен быў усталяваць nfs-common:
sudo apt update sudo apt install nfs-common
І падключэнне дыска да кожнага вузла:
sudo mount -t nfs {IP-for-the-drives-node}:/mnt/ssd /mnt
Neofetch усталяваны ва ўсіх вузлах, таму што я мудрагелісты.
Я ніколі раней не ствараў кластар Kubernetes з нуля, але я глядзеў шмат відэа Джэфа Гірлінга на гэтую тэму... Гэтага вопыту дастаткова, так?
Джэф прывёў мяне да K3s з дапамогай Ansible , лёгкага дыстрыбутыва Kubernetes, які ідэальна падыходзіць для майго хатняга кластара і загадзя вызначанага спосабу яго ўстаноўкі, таму што ў мяне няма папярэдніх патрабаванняў і ідэі, як наладзіць яго інакш.
Ўстаноўка была даволі простай. Я павінен быў усталяваць яго ва ўсіх вузлах, але я павінен быў пераканацца, што галоўны вузел быў усталяваны першым.
Такім чынам, спачатку я кланаваў рэпазітар k3s-ansible:
git clone https://github.com/k3s-io/k3s-ansible.git
Затым мне прыйшлося наладзіць файл інвентарызацыі. Маім галоўным вузлом, як я ўжо згадваў раней, быў мой стары Raspberry Pi 4. Таму я павінен быў пераканацца, што ён першы ў файле інвентара. Мне таксама трэба было пераканацца, што іншыя вузлы знаходзяцца ў правільных групах:
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:
У тым самым файле мне прыйшлося ўсталяваць маркер шыфравання. Файл паказвае, як гэта зрабіць, таму я не буду ўдавацца ў падрабязнасці.
Затым мне прыйшлося запусціць п'есу:
cd k3s-ansible ansible-playbook playbooks/site.yml -i inventory.yml
Вось і ўсё. Што тычыцца ўстаноўкі, у мяне быў запушчаны і запушчаны кластар Kubernetes. Мне прыйшлося ўсталяваць K9s на маім лакальным кампутары, каб кіраваць кластарам і прывязаць кластар да файла ./kube/config
.
Нарэшце, мне прыйшлося ўсталяваць прыкладанні, якія я хацеў запускаць у кластары. У мяне былі некаторыя ідэі, чаго я хацеў.
Вось тут і ўваходзіць маё сховішча .
Для медыя-сервера я вырашыў выкарыстаць:
У якасці прыкладу я пакажу вам, як я ўсталяваў Sonarr з дапамогай kubectl
. Астатнія прыкладанні ўсталёўваліся аналагічным чынам.
Для кожнага прыкладання я стварыў 3 файла:
deployment.yaml
- гэта канфігурацыя для кожнага з падаў, на якіх працуе прыкладанне
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
- гэта канфігурацыя для службы, якая будзе адкрываць прыкладанне для кластара
apiVersion: v1 kind: Service metadata: name: sonarr spec: selector: app: sonarr ports: - port: 80 targetPort: 8989 type: ClusterIP
ingress.yaml
і гэта канфігурацыя для ingress, якая адкрые прыкладанне для маёй сеткі
Затым мы разгортваем іх усе з дапамогай kubectl
:
kubectl apply -f sonarr/deployment.yaml kubectl apply -f sonarr/service.yaml kubectl apply -f sonarr/ingress.yaml
Як бачыце, я выкарыстоўваю пастаяннае сховішча з падтрымкай NFS для дадзеных і канфігурацыі прыкладанняў.
У рэпазітары вы можаце знайсці файлы nfs-pv.yaml і nfs-pvc.yaml , якія я выкарыстаў для стварэння сховішча NFS.
Акрамя таго, я стварыў яшчэ адно патрабаванне пастаяннага аб'ёму для канфігурацыі прыкладанняў.
Нягледзячы на тое, што корпус выглядае дзіўна, ён занадта вялікі для кластара Raspberry Pi. Чахол Mini ITX таксама адпавядаў бы маім патрэбам, але я павінен прызнаць, што я не люблю самаробныя рэчы.
Акрамя таго, прысоска для святлодыёдаў у цэлым. Я больш не дадаваў ніякіх свяцілень у корпус, але я думаю, што дошка ўжо добра спраўляецца са сваёй працай. На жаль, кантакты вентылятара былі несумяшчальныя з платай, і я не купіў кантролер вентылятара або штыфт для мацярынскай платы. Я мог бы ў будучыні.
Часам трэба проста сядзець і атрымліваць асалоду ад выгляду.
І, нарэшце, хатні кластар Turing Pi 2 запушчаны, і ў маім доме больш няма беспарадку.
Толькі час пакажа, што я буду рабіць з гэтым кластарам.
Тым не менш, я думаў дадаць Prometheus і Grafana , каб мець некаторыя паказчыкі і прыгожыя графікі для праверкі кластара.
Перанос усіх маіх файлаў Kubernetes у Helm таксама будзе добрай ідэяй.
Нарэшце, асобнік Retroarch усё яшчэ знаходзіцца ў распрацоўцы. Магчыма, гэта занадта аптымістычна, улічваючы, што стручок знаходзіцца ў стане CrashLoopBackOff. Але я дабяруся.
Калі вы дайшлі да канца гэтага паведамлення, я дзякую вам за ваш час. Я спадзяюся, вам гэта спадабалася гэтак жа, як і мне, калі я ствараў кластар і пісаў пра яго.