# Домашняя лаборатория с NanoBSD, APU2 и Kubernetes на Raspberry Pi — 0



## Домашняя лаборатория.

{{< style "text-align:justify;  margin-bottom:2em;" >}}
Уже некоторое время я думал о создании домашней лаборатории (кластер Kubernetes) с доступом
в интернет и из интернета, чтобы исследовать и практиковать интересные мне технологии, используя
энергоэффективные компоненты, максимально устойчивые к отключениям питания (чтобы избежать повреждения
накопителей). Для этого я задействовал оборудование, которое когда-то купил просто потому, что оно
меня заинтересовало. Без лишних слов — вот схема сети, как в итоге выглядит эта лаборатория:

{{< image src="lab-schema-1.png" alt="Diagram" caption="Схема сети лаборатории" >}}
{{< /style >}}

Основная идея — построить домашнюю лабораторию на устройствах с низким энергопотреблением и настроить/собрать
все необходимые аппаратные и программные компоненты, чтобы потреблять и публиковать персональные сервисы
в интернет и из интернета.

{{< admonition note "Примечание" >}}
**APU2 ENV** обозначает виртуальное окружение внутри встраиваемого устройства на базе FreeBSD Jails.
{{< /admonition >}}

<br>
<br>

## Оборудование.

| Метка   | Устройство   | Роль           |
|:-------|:---------|:-------------|
| ISP Wireless router | ISP default       | Доступ в интернет / проброс портов |
| APU2                | pcengines.ch      | Внутренний маршрутизатор/МСЭ + виртуальные серверы  |
| Virtual Server      | FreeBSD Jail      | Виртуальные серверы внутри APU2        |
| NetGear POE+ switch | ProSAFE MS510TXPP | Коммутатор + Power over Ethernet для узлов Raspberry Pi |
| Raspberry           | Raspberry Pi 5    | Узел Kubernetes (kubelet) |

<br>
<br>

### Виртуальные серверы

{{< style "text-align:justify;" >}}
Внутренний маршрутизатор (APU2) работает под [NanoBSD](https://docs.freebsd.org/en/articles/nanobsd/). NanoBSD —
проект [FreeBSD](https://www.freebsd.org/), который предоставляет образ FreeBSD для встраиваемых систем. Внутри NanoBSD
можно создавать изолированные процессы ([jails](https://wiki.freebsd.org/Jails)), которые ведут себя как независимые
серверы, изолированные друг от друга и от базовой ОС. Для такой изоляции FreeBSD реализует ряд интересных технологий,
в том числе виртуализацию сетевого стека ([VNET](https://wiki.freebsd.org/VIMAGE)),
ограничения ресурсов ([rctl](https://wiki.freebsd.org/Hierarchical_Resource_Limits)) и другие.
<br>
<br>
FreeBSD Jails можно считать аналогом контейнеров Docker в Linux.
{{< /style >}}

### APU2

{{< style "text-align:justify;" >}}
Для внутреннего маршрутизатора/МСЭ я использовал материнскую плату [APU2](https://openwrt.org/toh/pcengines/apu2)
от [pcengines](https://www.pcengines.ch/). Главная особенность устройства — оно рассчитано как
встраиваемая система: без подвижных частей вроде механических жёстких дисков, без слотов для модулей RAM
и с пассивным охлаждением (вентилятор не нужен из‑за низкого энергопотребления). В сочетании с преимуществами
проекта [NanoBSD](https://docs.freebsd.org/en/articles/nanobsd/) это делает плату удобной для такой сборки.

Материнская плата APU2 имеет следующие характеристики (среди прочих):

* 1 процессор AMD Embedded G series GX-412TC, 1 GHz quad Jaguar core with 64 bit  2MB L2 cache.
* 4 GB DRAM (распаяна на плате).
* 1 слот m-SATA.
* 3 порта Gigabit Ethernet.

{{< image src="apu2c2_1.jpg" alt="APU2" caption="Материнская плата APU2" >}}

В качестве накопителя использовался твердотельный диск mSATA, похожий на показанный ниже.

{{< image src="msata16d2.jpg" alt="mSATA SSD" caption="Твердотельный накопитель." >}}

{{< /style >}}

{{< admonition note "Примечание" >}}
К сожалению, на момент написания этой статьи [pcengines](https://www.pcengines.ch/) прекратили разработку
и производство плат APU2 ([здесь](https://www.pcengines.ch/eol.htm) их объявление и обоснование). Надеюсь,
в обозримом будущем они снова удивят похожим или ещё лучшим решением.
{{< /admonition >}}

<br>
<br>


### Коммутатор NetGear

{{< style "text-align:justify;" >}}
Используется коммутатор ProSAFE MS510TXPP. Я выбрал эту модель в первую очередь из‑за поддержки PoE+
(Power over Ethernet), что позволяет питать устройства Raspberry Pi 5 по сетевому кабелю
(для плат Raspberry Pi нужно приобрести PoE HAT).

<br>

Коммутатор имеет следующие возможности:
<br>
<br>

Веб-управление со следующими функциями:

* **VLANs**: до 256 VLAN на основе портов, IEEE 802.1Q, Auto Voice VLAN и Auto Video VLAN.
* **Статическая маршрутизация (Layer 3 Lite)**: до 32 статических маршрутов IPv4 и 32 IPv6, а также таблица ARP до 512 записей.
* **Агрегация каналов / port trunking:** совместимость с IEEE 802.3ad LACP (Link Aggregation Control Protocol).
* **Quality of Service (QoS)**: приоритизация трафика по портам, IEEE 802.1p, DSCP, TCP/UDP и DiffServ с очередями WRR (Weighted Round Robin) или строгим приоритетом.
* **Мониторинг**: SNMP v1, v2c и v3, RMON (группы 1, 2, 3 и 9) и удалённый syslog.

<br>
<br>

Конфигурация портов (всего 10 портов):

* **Стандартные Gigabit (1G)**: 4 порта RJ-45 (10M/100M/1G) с поддержкой PoE+.
* **Multi-Gigabit (2.5G)**: 2 порта RJ-45 (100M/1G/2.5G) с PoE+ (IEEE 802.3bz / NBASE-T).
* **Multi-Gigabit (5G)**: 2 порта RJ-45 (100M/1G/2.5G/5G) с PoE+ (IEEE 802.3bz / NBASE-T).
* **Медный uplink 10G**: 1 выделенный порт RJ-45 (100M/1G/2.5G/5G/10GBASE-T).
* **Оптоволоконный uplink 10G SFP+**: 1 выделенный порт SFP+ (1G/10GBASE-X SFP+).

{{< image src="switch-prosafe-ms510txpp.jpg" alt="MS510TXPP" caption="MS510TXPP" >}}
{{< /style >}}

### Raspberry Pi 5

Здесь немногое: для узлов Kubernetes использовались четыре платы Raspberry Pi 5. На момент написания
статьи на официальной странице [Raspberry Pi](https://www.raspberrypi.com/products/raspberry-pi-5/) предлагается
версия с 16 GB RAM; у используемых устройств половина этого объёма — 8 GB RAM.

{{< image src="rbp-5.jpg" alt="rbp-5" caption="Raspberry Pi 5" >}}

<br>
<br>

Карты microSD относительно чувствительны к отключениям питания, поэтому узлы Kubernetes оснащены PoE HAT
(Power over Ethernet) для двух целей: во‑первых, заменить microSD на твердотельный накопитель m.2, более
устойчивый к сбоям питания; во‑вторых, питать платы Raspberry Pi по сетевому кабелю. Как уже отмечалось,
коммутатор NetGear MS510TXPP способен питать сетевые устройства через Ethernet.

{{< image src="poe-hat.png" alt="poe-hat" caption="Power over Ethernet HAT" >}}

### Стойка для Kubernetes

Одна из сложностей кластера Kubernetes на Raspberry Pi — организация устройств: и вычислительных узлов,
и маршрутизатора. [GeeekPi](https://thegeeekpi.com/) выпускает стойки для Raspberry Pi и другие аксессуары
для таких проектов. Для этой домашней лаборатории выбран мини‑rack модели
[T0](https://www.amazon.com.mx/GeeekPi-Armario-servidores-equipos-RackMate/dp/B0FPF8CRYG/ref=asc_df_B0FPF8CRYG?mcid=5b3116fae09b37a6adf5d0d3bd2ab0ba&tag=gledskshopmx-20&linkCode=df0&hvadid=782828334665&hvpos=&hvnetw=g&hvrand=1425340664839516678&hvpone=&hvptwo=&hvqmt=&hvdev=c&hvdvcmdl=&hvlocint=&hvlocphy=9047091&hvtargid=pla-2441132577982&hvocijid=1425340664839516678-B0FPF8CRYG-&hvexpln=0&language=es_MX&th=1).

{{< image src="t0.png" alt="rack" caption="Стойка GeeekPi" >}}

### Итоговая сборка

<video controls width="100%" playsinline>
  <source src="/videos/home-lab.mp4" type="video/mp4">
</video>


### Следующие шаги

1. Установить образ NanoBSD.
2. Установить Raspberry Pi OS на узлы Raspberry Pi.
3. Создать кластер Kubernetes.

