Привет! В своей работе я регулярно внедряю различные решения на кластере Kubernetes. Для тестирования проектов очень важно иметь тестовую среду, которая была бы недорогой, проста в обслуживании и, при необходимости, могла поддерживать не слишком нагруженные приложения в продакшене.
Самый простой способ - это использовать виртуальные машины или различные контейнерные решения (как, например, kind (Kubernetes in Docker) ), однако мне не нравится такой подход из-за ограничений виртуализации и ресурсов. Я стремлюсь создать кластер, который можно использовать в реальном бизнесе и который обеспечит надежность в случае сбоев. Готовить кластер будем с помощью утилиты kubeadm.
Идеальным и бюджетным решением являются микрокомпьютеры на базе архитектуры ARM, например Orange Pi 3 LTS.
Я слышал о российских аналогах, таких как Repka Pi, но пока не имел опыта работы с ними, а Raspberry Pi, хоть и обладает множеством модулей, но стоит дороже. Orange Pi 3 LTS компактный, достаточно мощный и поставляется с образом OC Debian 11. Это устройство оснащено 4 ядрами, 2 ГБ оперативной памяти и процессором с тактовой частотой 1,8 ГГц. Стоимость этого устройства, на момент написания статьи, весьма демократичная - около 4000 ?.
Стенд
Чтобы наш кластер не создавал беспорядка мной в 3д редакторе был смоделирован и распечатан макет для элементов. Так как я активно пользуюсь этими машинками в своих задачах, макет я сделал разборным, чтобы без труда вынуть нужный микрокомпьютер, сменить в нем microSD и запустить для других задач. Чистая функциональность.
Наш план
Поскольку это кластер, как минимум, мы должны подготовить 2 узла (рабочую и управляющую). Что необходимо сделать:
Подготовить машины, настроить сеть и аутентификацию
Настроить Docker и CRI-Dockerd на машинах
Настроим балансировщик нагрузки
Добавим узлы в кластер
Установим дашборд кластера
Наша кластер будет выглядеть следующим образом:
opi-node1.internal 192.168.0.90 Управляющий узел
opi-node2.internal 192.168.0.91 Рабочий узел
opi-node3.internal 192.168.0.92 Рабочий узел (оставим в настройках для будущего расширения)
192.168.0.95 - виртуальный ip адрес (необходим для работы балансировщика нагрузки)
1. Подготовка узлов
Для начала загрузим последний образ Debian с официального сайта производителя Orange Pi 3 LTS по ссылке:
Затем запишем образ на SD-карту устройства с помощью выбранного вами редактора образов, например, Rufus.
После загрузки входим в систему используя дефолтный логин и пароль (логин: orangepi, пароль: orangepi).
Займемся сетью, отключим NetworkManager и настроим статику, в моем случаем:
для node1
sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager sudo tee /etc/network/interfaces <<EOF source /etc/network/interfaces.d/* # Network is managed by Network manager auto lo iface lo inet loopback EOF sudo tee /etc/network/interfaces.d/lan <<EOF auto eth0 iface eth0 inet static address 192.168.0.90 netmask 255.255.255.0 gateway 192.168.0.1 dns-nameservers 192.168.0.1 EOF sudo tee nano /etc/resolv.conf <<EOF # Generated by NetworkManager search opi-node1.internal nameserver 192.168.0.1 EOF sudo systemctl restart networking
для node2
sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager sudo tee /etc/network/interfaces <<EOF source /etc/network/interfaces.d/* # Network is managed by Network manager auto lo iface lo inet loopback EOF sudo tee /etc/network/interfaces.d/lan <<EOF auto eth0 iface eth0 inet static address 192.168.0.91 netmask 255.255.255.0 gateway 192.168.0.1 dns-nameservers 192.168.0.1 EOF sudo tee nano /etc/resolv.conf <<EOF # Generated by NetworkManager search opi-node2.internal nameserver 192.168.0.1 EOF sudo systemctl restart networking
Пропишем репозитории на всех узлах
sudo nano /etc/apt/sources.list
deb http://deb.debian.org/debian bullseye main contrib non-free deb http://deb.debian.org/debian bullseye-updates main contrib non-free deb http://deb.debian.org/debian bullseye-backports main contrib non-free deb http://security.debian.org/ bullseye-security main contrib non-free
Настроим автозагрузку и запуск модуля ядра br_netfilter и overlay, необходимые для работы сети и хранилища на кластере и разрешим маршрутизацию ip трафика между интерфейсами. Также для корректной работы узлов кластера нужно отключить файл подкачки
Для нашего устройства файл подкачки через /etc/fstab отключить не выйдет, тогда действуем обходными путями. Для этого сделаем запись swapoff -a в файле /etc/rc.local перед строкой exit 0. В этом случаем файл подкачки будет отключаться при загрузке системы.
sudo nano /etc/rc.local
.... swapoff -a exit 0
Делаем проверки:
#<------- Для проверки автоматической загрузки модулей br_netfilter и overlay sudo lsmod | grep br_netfilter sudo lsmod | grep overlay ## Ожидаемый примерный результат: # br_netfilter 32768 0 # bridge 258048 1 br_netfilter # overlay 147456 0 #<------- Для проверки успешности изменения настроек в параметрах сетевого стека sudo sysctl net.bridge.bridge-nf-call-iptables net.bridge.bridge-nf-call-ip6tables net.ipv4.ip_forward # Ожидаемый примерный результат: # net.bridge.bridge-nf-call-iptables = 1 # net.bridge.bridge-nf-call-ip6tables = 1 # net.ipv4.ip_forward = 1 #<------- Для проверки отключения файла подкачки выполним команду: sudo swapon -s ## Ожидаемый вывод команды – пустой. Она ничего не должна отобразить
Демон keepalived нужен работы виртуального ip адреса и будет вторым адресом на сетевом интерфейсе узла. При отказе узла keepalived переключит виртуальный адрес на другой доступный узел. Демон haproxy обрабатывает поочередно запросы на API сервера управляющих узлов кластера. Не забываем указывать корректные имена сетевых интерфейсов!
не забываем добавлять --cri-socket unix:///var/run/cri-dockerd.sock для работы с применением cri-dokerd
если потеряли токен, узнать его можно с помощью команды:
kubeadm token create --print-join-command
также при ошибка можно разрешить на чтение конфигурационный файл для всех пользователей (снижает безопасность, но если на сервере работаете только вы, то это может быть оправданной мерой при ошибках запуска)
sudo chmod +r /etc/kubernetes/admin.conf
Устанавливаем переменные окружения kubeсtl для управляющей ноды