Оранжевый k8s кластер на ладони
Сначала у меня появилась Orange Pi Zero 2 W, на пробу. Под планируемые задачи она не подошла, но 4 ядра и 4G памяти и размеры понравилось. Так же понравился Type-C и WiFi из коробки. Потом я вспомнил что давно хотелось just for fun попробовать собрать кубер на одноплатниках, а такой объём памяти и ядер уже даже позволяет идее иметь некоторый смысл. При этом wifi позволяет сделать кластер максимально без проводным, а размер позволяет соорудить кубический куб на ладони. И сегодня идея материализовалась.
Так себе представляет это DALLE 3
А теперь всякие технические подробности, если, вдруг, кому интересно.
За тот вечер я нашёл проект https://k3s.io/, быстро попробовал собрать кластер из того что было и работа его понравилась. В тот первый кластер не удалось только добавить Raspberry Pi Model B+. Новые версии k3s собраны с какой-то инструкцией процессора которые они не поддерживают, а та старая версия k3s, которая собрана без неё, на 512M все равно не грузится из за недостатка памяти.
Из-за того что Orange Pi Zero 3 имеют Ethernet, квадратный размер и дешевле Zero 2 W на 300 рублей, при паритете с Zero 2 W по памяти и ядрам, остальными нодами кластера были выбраны они.
Минимальные шаги по установке OS и подготовки сети
Этот действий черезвычайно тупо и одинаково для обоих версий.
Качаем образ со странички продукта (что забавно образа разные, так же разные образа для плат с разным объемом 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 2d7h v1.28.6+k3s2
opizero3-k8s-agent-1 Ready 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
Netdata, правда на 4 ноды, добавил ещё одну для интереса
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 Orange Pi 1.0.0 Jammy 6.1.31-sun50iw9 containerd://1.7.11-k3s2
opizero3-k8s-agent-2 Ready 2d5h v1.28.6+k3s2 10.1.0.62 Orange Pi 1.0.2 Jammy 6.1.31-sun50iw9 containerd://1.7.11-k3s2
opizero3-k8s-agent-1 Ready 2d5h v1.28.6+k3s2 10.1.0.61 Orange Pi 1.0.2 Jammy 6.1.31-sun50iw9 containerd://1.7.11-k3s2
kali-opi5 Ready 8s v1.28.6+k3s2 10.1.0.51 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 по курсу ЦБ