Pull to refresh

Оранжевый k8s кластер на ладони

Level of difficultyMedium
Reading time5 min
Views7.4K

Сначала у меня появилась Orange Pi Zero 2 W, на пробу. Под планируемые задачи она не подошла, но 4 ядра и 4G памяти и размеры понравилось. Так же понравился Type-C и WiFi из коробки. Потом я вспомнил что давно хотелось just for fun попробовать собрать кубер на одноплатниках, а такой объём памяти и ядер уже даже позволяет идее иметь некоторый смысл. При этом wifi позволяет сделать кластер максимально без проводным, а размер позволяет соорудить кубический куб на ладони. И сегодня идея материализовалась.

Так себе представляет это DALLE 3
Так себе представляет это 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 и подготовки сети

Установка OS тупа до безобразия и одинакова для обоих версий Orange PI Zero (2W и 3).

  1. Качаем образ со странички продукта (что забавно образа разные, так же разные образа для плат с разным объемом RAM). Я брал ubuntu_jammy_server_linux6.1.31

  2. Заливаем имидж на SD через balenaEtcher или dd.

  3. Монтируем эту флешку, идём в 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'
  1. Грузимся

  2. Лезем на роутер, выдаем там статический IP

  3. Лезем на полученный IP по ssh с паролем и логином orangepi, меняем /etc/hosname на что-то своё, имя машины в пределах k8s кластера должно быть уникальным !

  4. Перегружаемся.

    На самом деле статический 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 готовит вполне функциональный кластер. Основные моменты на мой взгляд

  1. Несмотря на то что в нем выпилена поддержка ceph и прочих rbd PVC есть и вполне работают через Local Storage Provider.

  2. Helm чудесно работает и, вот им была, для интереса, раздеплоена netdata

Netdata, правда на 4 ноды, добавил ещё одну для интереса
Netdata, правда на 4 ноды, добавил ещё одну для интереса
  1. 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
  1. 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%
  1. Есть сервер метрик, поэтому автоскейлинг доложен работать

Сборка

Хотел написать что сборка ещё тупее чем установка 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

  1. А нафига ? - Just for Fun

Q without A & Plans

  1. Непонятно насколько сильно добавление новой ноды нагружает master, но, насколько я видел, при добавлении третьего агента на Pi 5 заметного возрастания нагрузки на мастер не произошло

  2. Для интереса хочется добавить ещё пару нод но уже на удалении, внутри квартиры.

  3. Интересно сколько это будет работать на повербанке.

  4. В голове родилась бредовая схема которую хочется попробовать:

    1. Мастер - на статическом IP в интернете и стабильном питании

    2. Агенты - мобильные, с повербанками и коннектом через wifi точку доступа на телефоне.

    3. если мастеров будет несколько (что k3s умеет) и в разных ДЦ, то вырисовывается довольно HAшненько

Цены всего этого баловства

В этот расчёт Orange PI 5 8G с радиатором не включен, ибо брался он давно, на старте продаж, да и частью сборного в одном месте кластера не является

  1. Набор стоек для печатных плат 64шт с гайками и винтами - 655 р. - 1 штука

  2. Orange Pi Zero 3 4G - 4212 p.  - 2 штуки

  3. Orange Pi Zero 2 W - 4G -  4335 р. - 1 штука

  4. Micro SD Samsung EVO Plus 128 ГБ class 10 (MB-MC128HA/RU) - 1 332  р. - 3 штуки

Итого: 16078р или $174 по курсу ЦБ

Tags:
Hubs:
Total votes 11: ↑11 and ↓0+11
Comments9

Articles