# Laboratório caseiro com NanoBSD, APU2 e Kubernetes no Raspberry Pi - 0



## Laboratório caseiro.

{{< style "text-align:justify;  margin-bottom:2em;" >}}
Há algum tempo eu vinha pensando em montar um laboratório caseiro (cluster Kubernetes) com acesso
à internet e a partir dela, para pesquisar e praticar as tecnologias que me interessam, usando
componentes de baixo consumo energético e o mais resistentes possível a quedas de energia (para evitar
corrupção das unidades de armazenamento). Para isso, reaproveitei o hardware que comprei em algum momento
simplesmente porque me interessou. Sem mais delongas, aqui está o diagrama de rede de como esse laboratório
ficou:

{{< image src="lab-schema-1.png" alt="Diagram" caption="Diagrama de rede do laboratório" >}}
{{< /style >}}

A ideia principal é construir um laboratório caseiro com dispositivos de baixo consumo e configurar/montar
todos os componentes de hardware e software necessários para consumir e expor serviços pessoais para a
internet e a partir dela.

{{< admonition note "Nota" >}}
**APU2 ENV** refere-se ao ambiente virtual dentro de um dispositivo embarcado usando FreeBSD Jails.
{{< /admonition >}}

<br>
<br>

## Hardware.

| Rótulo   | Dispositivo   | Função           |
|:-------|:---------|:-------------|
| ISP Wireless router | ISP default       | Acesso à internet / port forwarding |
| APU2                | pcengines.ch      | Roteador interno/firewall + servidores virtuais  |
| Virtual Server      | FreeBSD Jail      | Servidores virtuais dentro do APU2        |
| NetGear POE+ switch | ProSAFE MS510TXPP | Switch + Power over Ethernet para nós Raspberry Pi |
| Raspberry           | Raspberry Pi 5    | Nó Kubernetes (kubelet) |

<br>
<br>

### Servidores virtuais

{{< style "text-align:justify;" >}}
O roteador interno (APU2) executa [NanoBSD](https://docs.freebsd.org/en/articles/nanobsd/). NanoBSD é um
projeto do [FreeBSD](https://www.freebsd.org/) que fornece uma imagem FreeBSD para sistemas embarcados. Dentro do NanoBSD
é possível criar processos confinados ([jails](https://wiki.freebsd.org/Jails)) que se comportam como servidores
independentes, isolados uns dos outros e do sistema operacional base. Para esse isolamento, o FreeBSD implementou
tecnologias interessantes como a virtualização da pilha de rede ([VNET](https://wiki.freebsd.org/VIMAGE)),
limites de recursos ([rctl](https://wiki.freebsd.org/Hierarchical_Resource_Limits)), entre outras.
<br>
<br>
Você pode pensar nas FreeBSD Jails como o análogo dos containers Docker no Linux.
{{< /style >}}

### APU2

{{< style "text-align:justify;" >}}
Para implementar o roteador/firewall interno, usei uma placa-mãe [APU2](https://openwrt.org/toh/pcengines/apu2)
da [pcengines](https://www.pcengines.ch/). A principal característica desse dispositivo é que ele foi projetado como
sistema embarcado: sem partes móveis como discos rígidos mecânicos, sem slots para encaixar módulos de RAM
e com refrigeração passiva (não precisa de ventilador por ser de baixo consumo). Combinado com as vantagens do
projeto [NanoBSD](https://docs.freebsd.org/en/articles/nanobsd/), isso o torna ideal para essa montagem.

A placa-mãe APU2 inclui as seguintes características (entre outras):

* 1 processador AMD Embedded G series GX-412TC, 1 GHz quad Jaguar core with 64 bit  2MB L2 cache.
* 4 GB DRAM (soldada na placa).
* 1 slot m-SATA.
* 3 portas Gigabit Ethernet.

{{< image src="apu2c2_1.jpg" alt="APU2" caption="Placa-mãe APU2" >}}

Como armazenamento, foi utilizada uma unidade de estado sólido mSATA semelhante à mostrada abaixo.

{{< image src="msata16d2.jpg" alt="mSATA SSD" caption="Unidade de estado sólido." >}}

{{< /style >}}

{{< admonition note "Nota" >}}
Infelizmente, no momento em que este artigo foi escrito, a [pcengines](https://www.pcengines.ch/) encerrou o desenvolvimento
e a produção das placas APU2 ([aqui](https://www.pcengines.ch/eol.htm) o comunicado e a justificativa). Esperamos que
em um futuro não muito distante eles voltem a surpreender com um projeto semelhante ou ainda melhor.
{{< /admonition >}}

<br>
<br>


### Switch NetGear

{{< style "text-align:justify;" >}}
O switch utilizado é o ProSAFE MS510TXPP. Escolhi esse modelo principalmente por causa das capacidades PoE+
(Power over Ethernet), que permitem alimentar os dispositivos Raspberry Pi 5 pelo cabo de rede
(é necessário adquirir um PoE HAT para as placas Raspberry Pi).

<br>

O switch possui as seguintes características:
<br>
<br>

Gerenciamento via página web com as seguintes capacidades:

* **VLANs**: Suporta até 256 VLANs baseadas em portas, IEEE 802.1Q, Auto Voice VLAN e Auto Video VLAN.
* **Roteamento estático (Layer 3 Lite)**: Suporta até 32 rotas estáticas IPv4 e 32 rotas estáticas IPv6, além de uma tabela ARP de até 512 entradas.
* **Agregação de enlaces / port trunking:** Compatível com IEEE 802.3ad LACP (Link Aggregation Control Protocol).
* **Quality of Service (QoS)**: Priorização de tráfego baseada em portas, IEEE 802.1p, DSCP, TCP/UDP e DiffServ com filas WRR (Weighted Round Robin) ou prioridade estrita.
* **Monitoramento**: SNMP v1, v2c e v3, RMON (grupos 1, 2, 3 e 9) e syslog remoto.

<br>
<br>

Configuração de portas (10 portas no total):

* **Portas Gigabit padrão (1G)**: 4 portas RJ-45 (10M/100M/1G) com suporte PoE+.
* **Portas Multi-Gigabit (2.5G)**: 2 portas RJ-45 (100M/1G/2.5G) com suporte PoE+ (IEEE 802.3bz / NBASE-T).
* **Portas Multi-Gigabit (5G)**: 2 portas RJ-45 (100M/1G/2.5G/5G) com suporte PoE+ (IEEE 802.3bz / NBASE-T).
* **Uplink de cobre 10G**: 1 porta RJ-45 dedicada (100M/1G/2.5G/5G/10GBASE-T).
* **Uplink de fibra 10G SFP+**: 1 porta SFP+ dedicada (1G/10GBASE-X SFP+).

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

### Raspberry Pi 5

Não há muito a dizer aqui: foram usadas quatro placas Raspberry Pi 5 para os nós Kubernetes. No momento em que este
artigo foi escrito, a página oficial do [Raspberry Pi](https://www.raspberrypi.com/products/raspberry-pi-5/) oferece
uma versão com 16 GB de RAM; os dispositivos usados aqui têm a metade disso, 8 GB de RAM.

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

<br>
<br>

Os cartões microSD são relativamente frágeis perante quedas de energia, por isso os nós Kubernetes receberam PoE HATs
(Power over Ethernet) para dois objetivos: primeiro, substituir o microSD por um SSD m.2 mais resistente a cortes de
energia; segundo, alimentar as placas Raspberry Pi pelo cabo de rede. Como já mencionado, o switch NetGear MS510TXPP
é capaz de alimentar dispositivos de rede pela conexão Ethernet.

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

### Rack para Kubernetes

Um problema ao montar um cluster Kubernetes com Raspberry Pi é a organização dos dispositivos — tanto os nós de
computação quanto o roteador. A [GeeekPi](https://thegeeekpi.com/) fabrica racks para Raspberry Pi e outros acessórios
para organizar esse tipo de projeto. O mini-rack escolhido para este laboratório caseiro foi o modelo
[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="Rack GeeekPi" >}}

### Setup final

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


### Próximos passos

1. Instalar a imagem NanoBSD.
2. Instalar o Raspberry Pi OS nos nós Raspberry Pi.
3. Criar o cluster Kubernetes.

