Сначала у меня появилась Orange Pi Zero 2 W, на пробу. Под планируемые задачи она не подошла, но 4 ядра и 4G памяти и размеры понравилось. Так же понравился Type-C и WiFi из коробки. Потом я вспомнил что давно хотелось just for fun попробовать собрать кубер на одноплатниках, а такой объём памяти и ядер уже даже позволяет идее иметь некоторый смысл. При этом wifi позволяет сделать кластер максимально без проводным, а размер позволяет соорудить кубический куб на ладони. И сегодня идея материализовалась.
А теперь всякие технические подробности, если, вдруг, кому интересно.
За тот вечер я нашёл проект https://k3s.io/, быстро попробовал собрать кластер из того что было и работа его понравилась. В тот первый кластер не удалось только добавить Raspberry Pi Model B+. Новые версии k3s собраны с какой-то инструкцией процессора которые они не поддерживают, а та старая версия k3s, которая собрана без неё, на 512M все равно не грузится из за недостатка памяти.
Из-за того что Orange Pi Zero 3 имеют Ethernet, квадратный размер и дешевле Zero 2 W на 300 рублей, при паритете с Zero 2 W по памяти и ядрам, остальными нодами кластера были выбраны они.
Минимальные шаги по установке OS и подготовки сети
Установка OS тупа до безобразия и одинакова для обоих версий Orange PI Zero (2W и 3).
Качаем образ со странички продукта (что забавно образа разные, так же разные образа для плат с разным объемом RAM). Я брал ubuntu_jammy_server_linux6.1.31
Заливаем имидж на SD через balenaEtcher или dd.
Монтируем эту флешку, идём в boot и копируем orangepi_first_run.txt.template в orangepi_first_run.txt и ставим вот эти параметры как то так (делать это надо до первой загрузки, в мануалах говорят что он работает только один раз)
FR_net_change_defaults=1
FR_net_wifi_enabled=1
FR_net_wifi_ssid='MySSID'
FR_net_wifi_key='MyWiFiKEY'
FR_net_wifi_countrycode='GB'
Грузимся
Лезем на роутер, выдаем там статический IP
Лезем на полученный IP по ssh с паролем и логином
orangepi
, меняем /etc/hosname на что-то своё, имя машины в пределах k8s кластера должно быть уникальным !Перегружаемся.
На самом деле статический IP можно повесить и в orangepi_first_run.txt, но я думаю что вы сами увидите эту возможность когда будете его редактировать
Собственно все, нода готова принять на себя k8s
Установка K8s
Это гайд в стиле тупой и ещё тупее. Потому что установка k8s ещё тупее чем установка OS. Все строго по гайду https://docs.k3s.io/quick-start. Одна команда на контроллере, потом забираем ключ который там появится в /var/lib/rancher/k3s/server/node-token и даём одинаковую команду на всех нодах которые будут агентами. Не забываем что у них должен быть разный hostname. Так как в K3S_URL или IP или DNS имя кластер можно теоретически размазывать по разным сетям. Врать как это работает не буду, не пробовал, да и насчёт секурности в тему не погружался, с ней, на первый взгляд все ок. Но в одной подсети это работает замечательно. Опять же, поражает мысль что кластер можно увеличить в любой момент за несколько минут, добавив новую ноду. "Распределенный по квартире кубернетес кластер" это звучит, как минимум, забавно.
После установки утаскиваем себе с контроллера /etc/rancher/k3s/k3s.yaml
в ~/.kube/config
и усе готово, шеф.
note: тут немного не пустой кластер, на нем стоит netdata поставленная helmом
❯ kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
opizero2w-k8s-master 1633m 40% 957Mi 24%
opizero3-k8s-agent-1 546m 13% 792Mi 20%
opizero3-k8s-agent-2 426m 10% 513Mi 13%
❯ kubectl get nodes
NAME STATUS ROLES AGE VERSION
opizero3-k8s-agent-2 Ready <none> 2d7h v1.28.6+k3s2
opizero3-k8s-agent-1 Ready <none> 2d7h v1.28.6+k3s2
opizero2w-k8s-master Ready control-plane,master 2d7h v1.28.6+k3s2
получите, распишитесь. Правда реальность немного отличается от того как это представляет себе DALLE 3
Немного о k3s
Несмотря на лайтовость k3s готовит вполне функциональный кластер. Основные моменты на мой взгляд
Несмотря на то что в нем выпилена поддержка ceph и прочих rbd PVC есть и вполне работают через Local Storage Provider.
Helm чудесно работает и, вот им была, для интереса, раздеплоена netdata
Ingressы тоже замечательно работают, по умолчанию оно там на Traefik поэтому не забываем добавить нужную метадату
metadata:
annotations:
spec.ingressClassName: traefik
Что интересно оно же и LB. А это значит что бы законектиться на дашборду netdata можно лезть на любую ноду кластера на 80 порт по http. Главное что бы был заголовок `Host: netdata.k8s.local`
❯ kubectl get ingress netdata -o yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
spec.ingressClassName: traefik
creationTimestamp: "2024-02-27T05:02:06Z"
generation: 3
labels:
app: netdata
app.kubernetes.io/managed-by: Helm
chart: netdata-3.7.84
heritage: Helm
release: netdata
name: netdata
namespace: default
resourceVersion: "87068"
uid: 3451f5e7-e753-4627-887b-506f0dcc5896
spec:
rules:
- host: netdata.k8s.local
http:
paths:
- backend:
service:
name: netdata
port:
name: http
path: /
pathType: Prefix
status:
loadBalancer:
ingress:
- ip: 10.1.0.60
- ip: 10.1.0.61
- ip: 10.1.0.62
k3s довольно не прихотлив и всеяден, вот ради интереса за минуту добавил в кластер Orange PI 5 с 8G RAM и 512G M2 диском. Ядро 5, OS - Kali Linux. K3s это вообще никак не напрягло
❯ kubectl get nodes -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
opizero2w-k8s-master Ready control-plane,master 2d5h v1.28.6+k3s2 10.1.0.60 <none> Orange Pi 1.0.0 Jammy 6.1.31-sun50iw9 containerd://1.7.11-k3s2
opizero3-k8s-agent-2 Ready <none> 2d5h v1.28.6+k3s2 10.1.0.62 <none> Orange Pi 1.0.2 Jammy 6.1.31-sun50iw9 containerd://1.7.11-k3s2
opizero3-k8s-agent-1 Ready <none> 2d5h v1.28.6+k3s2 10.1.0.61 <none> Orange Pi 1.0.2 Jammy 6.1.31-sun50iw9 containerd://1.7.11-k3s2
kali-opi5 Ready <none> 8s v1.28.6+k3s2 10.1.0.51 <none> Kali GNU/Linux Rolling 5.10.110-rockchip-rk3588 containerd://1.7.11-k3s2
❯ kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
kali-opi5 627m 7% 4313Mi 56%
opizero2w-k8s-master 1999m 49% 982Mi 24%
opizero3-k8s-agent-1 591m 14% 797Mi 20%
opizero3-k8s-agent-2 420m 10% 516Mi 13%
Есть сервер метрик, поэтому автоскейлинг доложен работать
Сборка
Хотел написать что сборка ещё тупее чем установка k3s, но нет, из-за разных размеров 2w и 3 она чуть чуть по сложнее. Остановился на максимально тупом открытом дизайне. Кластер соединяется латунными (ну что бы было дорохо-бохато) стойками для печатных плат. А мастер, его высочество Orange Pi Zero 2 W, возлежит на специально распечатанном на 3D принтере троне. STL трона можно забрать вот отсюда. На чипы были наклеены радиаторы, местами тоже дорохо-бохато-золотистые, а местами синие. У мастера золотистые, а у slaveвов агентов, синие. Для уменьшения блеска этой красоты wifi антенны прикручены стяжками к латунным стойкам. Описывал все это дело и понял что это произведение искусства. Но в музей не отдам, не уговаривайте.
Загрузка и температура
Сейчас кластер стоит нагруженный только netdata и мастер загружен примерно на 60% по СPU и на половину по памяти
Master
температура скачет между 70C и 80C (охлаждение - пассивный радиатор)
Агент на Zero 3
Загрузка CPU - между 10% и 20%, температура в районе 53C
Агент на Orange PI 5
Загрузка CPU - около 11%,
Температура около 40C. Но тут радиатор с небольшим вентилятором
QA
А нафига ? - Just for Fun
Q without A & Plans
Непонятно насколько сильно добавление новой ноды нагружает master, но, насколько я видел, при добавлении третьего агента на Pi 5 заметного возрастания нагрузки на мастер не произошло
Для интереса хочется добавить ещё пару нод но уже на удалении, внутри квартиры.
Интересно сколько это будет работать на повербанке.
В голове родилась бредовая схема которую хочется попробовать:
Мастер - на статическом IP в интернете и стабильном питании
Агенты - мобильные, с повербанками и коннектом через wifi точку доступа на телефоне.
если мастеров будет несколько (что k3s умеет) и в разных ДЦ, то вырисовывается довольно HAшненько
Цены всего этого баловства
В этот расчёт Orange PI 5 8G с радиатором не включен, ибо брался он давно, на старте продаж, да и частью сборного в одном месте кластера не является
Набор стоек для печатных плат 64шт с гайками и винтами - 655 р. - 1 штука
Orange Pi Zero 3 4G - 4212 p. - 2 штуки
Orange Pi Zero 2 W - 4G - 4335 р. - 1 штука
Micro SD Samsung EVO Plus 128 ГБ class 10 (MB-MC128HA/RU) - 1 332 р. - 3 штуки
Итого: 16078р или $174 по курсу ЦБ