Anatomia do cluster Kubernetes da minha casa

Há um ano, percebi que queria criar meu próprio cluster Kubernetes. Eu sou um desenvolvedor de software. Normalmente, eu uso um cluster local de nó único ou um cluster de vários nós remoto para testar meus projetos. Ao trabalhar com um cluster de nó único, geralmente confio no Minikube , embora existam outras soluções, como o projeto Kind , que podem emular a presença de vários nós em um cluster. O suporte para vários nós pode aparecer no Minikube.

Então, eu gostaria de ter à minha disposição os recursos dos dois ambientes acima. Ou seja, para que eu tivesse um cluster composto por vários nós e para que trabalhar com esses clusters não implicasse em atrasos de rede típicos para interagir com ambientes remotos. Muitos ótimos tutoriais já foram escritos sobre a criação de clusters de vários nós do Kubernetes usando computadores de placa única . Muitos desses manuais usam o Raspberry Pi como SBC. Vendo isso, decidi seguir o caminho de menor resistência e também escolhi este computador. A plataforma Raspberry Pi se estabeleceu como uma solução barata e acessível.





Note-se que a escolha desta plataforma oferece alguns compromissos. Por exemplo, a Broadcom e a Raspberry Pi Foundation não licenciaram extensões criptográficas ARMv8 (isso é necessário para a aceleração de hardware do suporte AES). Outra solução controversa é o uso de cartões microSD na forma de um meio de armazenamento padrão a partir do qual o sistema operacional é carregado.

Analisando as diretrizes existentes para a criação de clusters em computadores de placa única, não encontrei nenhuma que descreva uma solução que atenda aos meus requisitos. Vou começar a história sobre o cluster que criei com eles.

Exigências


  • O cluster deve ser fechado em um compartimento separado, que pode ser facilmente movido, aberto e mantido, trabalhando com módulos separados do sistema;
  • , . , , . , . , .
  • , .
  • , , , .

Por trás desses requisitos, há um objetivo não óbvio: eu precisava da minha filha de quatro anos para trabalhar com o cluster. Espero que ele se torne para ela uma espécie de guia de estudo que a ajude a se familiarizar com computadores, comandos e terminais.

Acessórios


DetalheFonte
Pico 5 framboesa PI 5S Starter Kitpicocluster.com
Computadores de placa única: 2 Raspberry Pi 4B (4GB) 3 Raspberry Pi 3B +
5 cartões microSD 32GB classe 10 / A1 raspberrypi.org
Cabos Ethernet: 2 0,25 m cat. 83 0,15 m cat. 7, S / FTP1attack.de
Cabos USB PortaPow 20AWG2 Cabo USB-C3 Cabo micro-USBportablepowersupplies.co.uk
Oficial Raspberry Pi 7 ″ Touchscreenraspberrypi.org
Fonte de alimentação Dehner Elektronik STD-12090 12V / DC 9A 108Wdehner.net
Conversor DC-Buck de 12V a 5V 15Adroking.com
Heschen 12V 25A SPST 2-Pin ON/OFFheschen.com
Noctua NF-A4x20 5V PWMnoctua.at
, (15A, 30V) 4 , MOSFET PSMN011-30YLCebay.com
2 M.2 NVMe USB 3.0, JMS58amazon.com
2 Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 Go
2 USB 3.0 ( , ) 6″/152mmusbfirewire.com
2 USB 3.0- Delock, Male-Female ( 270°)delock.com
Adafruit Raspberry Pi 24″/610mmadafruit.com
Adafruit (DSI CSI) Raspberry Pi adafruit.com
Wago 221wago.com
Lapp Unitronic 300mm/1200mm 2x0.14mm²lappgroup.com
Lemo FGG.0B.302.CLAD42 EGG.0B.302.CLLlemo.com
DuPont Female-Female

O gabinete do PicoCluster é pequeno e muito fácil de usar. No kit inicial que pedi, usei apenas o chassi, incluindo as travas e racks, além do switch Gigabit Ethernet de 8 portas.

Agora entendo que seria melhor se o PicoCluster vendesse uma versão de seu kit sem componentes elétricos. Outra alternativa para este kit foi o desenvolvimento de seu próprio gabinete. Isso, no entanto, exigiria mais tempo. Eu teria que criar desenhos vetoriais, eu teria que usar os serviços de corte a laser em uma empresa que oferece chapas acrílicas, idealmente chapas com um revestimento que dissipa a descarga eletrostática.

No decorrer do trabalho, deparei-me com avisos sobre tensão insuficientee descobriu que o problema foi causado pelos cabos micro-USB que acompanham o gabinete. Além disso, junto com o gabinete, havia um conversor DC-DC de 12V para 5V, 30W, que substituí por um mais potente. Fiz isso por razões que discutirei abaixo na seção sobre como ligar o sistema.

No momento em que comecei a trabalhar neste projeto, não planejava usar as placas Raspberry Pi 4 lançadas em 2019. Isso explica que ainda tenho três placas Raspberry Pi 3 que funcionam como nós de trabalho. Troquei outras duas placas pelo Raspberry Pi 4. Elas são usadas para nós que precisam de mais recursos. Este é o nó principal e o nó de trabalho, que, entre outras coisas, é usado para criar backups de dados.

Logo após o lançamento do Raspberry Pi 4, o PicoCluster lançou um novo chassi projetado especificamente para essas placas. Inclui uma fonte de alimentação poderosa, dois ventiladores e um interruptor de energia. É verdade que este gabinete é maior que o meu e os fãs certamente serão mais altos que o Noctua NF-A4x20. A velocidade de rotação deste ventilador pode ser controlada usando a modulação por largura de pulso (PWM), levando em consideração os resultados das medições de temperatura realizadas nas placas.

Deve-se notar que o SoC Broadcom BCM2837 (Raspberry Pi 3) e o SoC BCM2711 (Raspberry Pi 4) possuem temporizadores de hardware capazes de gerar sinais PWM. Como resultado, é muito simples emitir sinais de entrada de controleesperado pelo Noctua NF-A4x20 PWM sem sobrecarregar o processador. Além disso, o ventilador quase não é audível quando está funcionando com metade da velocidade suportada (cerca de 2500 rpm). Como se viu, é suficiente para manter a temperatura do sistema abaixo de 45 ° C / 113 ° F sob carga normal.

O novo gabinete inclui uma fonte de alimentação integrada. Além disso, ele é mais caro do que o que eu escolhi. Todos esses recursos deste gabinete são a razão pela qual eu escolheria o kit Pico 5S, mesmo que o tivesse comprado agora. Devem ser envidados mais esforços para lembrá-lo, mas o que acabou por me parecer melhor do que o que teria acontecido se eu tivesse escolhido um prédio diferente. Em geral, vale a pena o esforço e o tempo.

Montagem


▍ Painel frontal



Painel

frontal O painel frontal possui uma abertura para acesso aos cartões microSD. Isso é conveniente, mesmo considerando o fato de que planejo organizar a inicialização do sistema usando a inicialização de armazenamento em massa USB . Eu pretendo fazer isso logo após o Raspberry Pi 4 suportar totalmente esse modo de inicialização. O orifício também ajuda a organizar a circulação de ar na carcaça. Nesse caso, dois drives SSD estão localizados diretamente em frente ao ventilador, o que ajuda a manter a temperatura operacional ideal.

Os indicadores de atividade e energia das placas são claramente visíveis, o que permite avaliar rapidamente o estado do cluster. Os indicadores de atividade do comutador Ethernet também são visíveis.


O painel superior do gabinete sem tela A

tela pode ser movida facilmente para aproximá-lo do teclado ou para fornecer acesso ao painel superior ao abrir o gabinete.

▍ painel esquerdo



Painel esquerdo

No painel esquerdo do gabinete, estão as portas GPIO das placas. Um dos cabos conecta a unidade principal ao ventilador - para organizar o controle PWM de sua velocidade de rotação. Outro cabo conecta o nó principal ao módulo da placa de circuito, que é usado para ativar e desativar os nós de trabalho. Quatro cabos conectam cada um dos nós em funcionamento ao nó principal. Ele usa pinos GPIO com um alto nível ativo quando desligado. Isso permite que o nó principal desligue com segurança a energia do nó de trabalho após a conclusão da sequência de ações executadas no final de sua operação.


O módulo usado para conectar o ventilador ao nó principal

No canto superior esquerdo, há um pequeno módulo projetado para conectar o conector do ventilador Noctua de 4 pinos ao nó principal do Raspberry Pi. O conector GPIO correspondente, graças ao suporte de hardware para gerar sinais PWM, está configurado para controlar a velocidade do ventilador. A velocidade é selecionada com base na análise da temperatura das placas, informações sobre as quais são coletadas regularmente usando SSH. A unidade principal, além disso, para fins de monitoramento, lê a velocidade do ventilador.

▍ painel traseiro



Painel

traseiro O painel traseiro do chassi oculta os cabos. O fato de tudo parecer assim pode ser considerado a consequência de uma abordagem astuta da organização modular do meu projeto. Era difícil encontrar cabos de qualidade. Especialmente - cabos USB 3.0 curtos com plugues curvos. Cabos - este é o maior grupo de elementos móveis do meu sistema, eles devem atender a certas características mecânicas e elétricas. Eles provaram ser a principal fonte de problemas.

Tive a ideia de usar um único cabo espiral para substituí-lo por um cabo de fita DSI, com o qual uma tela está conectada ao sistema. Em seguida, o cabo espiral conectaria a tela ao cluster e forneceria energia a ele. Mas não consegui encontrar um conector DSI adequado. Abstive-me deste empreendimento e do fato de não me sentir atraído pela perspectiva de soldar 17 fios de 0,14 mm². Usei um extensor de cabo DSI e apliquei um cabo de alimentação micro-USB espiral de 2 fios. Isso me permitiu mover e desligar a tela facilmente sem abrir o gabinete.


Tentativa malsucedida de organizar cabos

Aqui está uma tentativa malsucedida de usar o sistema para organizar a entrada de cabos no gabinete projetado para cabos de expansão USB 3.0. Apesar das inúmeras tentativas de rotear corretamente os cabos, eu encontrei sistematicamente erros de E / S durante as transferências de dados. Eles provavelmente foram causados ​​pelo fato de terem sido esticados demais ao colocar os cabos ou pelo fato de isso prejudicar a conexão confiável dos cabos aos conectores.

▍ Painel direito



Painel direito

No lado direito do gabinete, você pode ver o switch Ethernet de 8 portas.

Projeto de sistema


▍ Comida



Gabinete com painel frontal aberto,

tive que decidir qual fonte de alimentação usar. Em particular, sobre qual potência em watts ele deve suportar para atender às necessidades do cluster. Essa é uma pergunta sobre o que veio antes - uma galinha ou um ovo, já que as medições não podem ser feitas antes que a energia seja aplicada ao cluster.

Para obter uma estimativa aproximada de energia,consultei a documentação oficial , que contém algumas informações sobre a potência do Raspberry Pi, bem como as especificações de outros componentes. Isso me deu os seguintes valores aproximados com base no consumo médio de energia.


Mas o que aconteceu depois de levar em conta os valores máximos de consumo de energia da documentação.


Isso foi muito maior do que a energia fornecida por essas fontes de energia que eu pude descobrir que produziam 5V, já que os componentes de "baixa energia" precisavam de uma corrente de 10A. Isso descartou a opção de usar uma única fonte de alimentação de 5V. Ao mesmo tempo, fontes de alimentação de 12V são muito comuns, o que pode fornecer o nível necessário de energia. Como resultado, selecionei a fonte de alimentação Dehner Elektronik STD-12090 12V / DC 9A 108W e a conectei a um conversor de 12V a 5V 75W DC / DC .

Aqui eu tinha outra opção, que consistia em usar cinco conversores menos potentes - um para cada placa Raspberry Pi, mas isso complicaria bastante o design do cluster.


Placa de remendo Uma placa de remendo de

4 pinos baseada no MOSFET PSMN011-30YLC está instalada na parte inferior do chassi. É usado para ativar e desativar nós de trabalho. É rotulado como 15A, 30V, para lidar bem com a carga criada por quatro Raspberry Pi.

Eu medi a energia média e máxima consumida pelo cluster. Os resultados da medição são aproximadamente consistentes com os cálculos aproximados que fiz anteriormente. A diferença entre os valores esperados e reais pode ser explicada pelos recursos da configuração do sistema e pelos recursos do teste. Em particular, desliguei o Wi-Fi e o Bluetooth no meu Raspberry Pi, eles também funcionam sem exibir uma imagem no monitor. Isso pode explicar o fato de que, na realidade, os valores acabaram sendo menores.

Como se viu, a fonte de alimentação de 108W é muito mais poderosa do que o necessário para o cluster. No entanto, o fato de eu ter apenas essa fonte de alimentação significa que posso expandir os recursos do sistema. Por exemplo, substitua o Raspberry Pi 3 por Raspberry Pi 4.

Storage Armazenamento de dados


Um dos novos recursos agradáveis ​​do Raspberry Pi 4 é a presença na placa de duas portas USB 3.0 conectadas ao BCM2711 SoC usando uma conexão PCIe extremamente rápida. Graças a isso, pode-se esperar alcançar taxas de dados muito altas. Decidi que estava usando essas portas USB 3.0 para conectar SSDs usando os adaptadores M.2 NVMe para USB 3.0. No entanto, como se viu, era muito difícil encontrar esses adaptadores. Sugeri ingenuamente que qualquer adaptador funcionaria para mim. Como resultado, comprei o primeiro adaptador desse tipo sem verificar sua compatibilidade com o Raspberry Pi 4.

Felizmente, deparei-me com isso.Guia de download do Raspberry Pi 4 e comprei o adaptador Shinestar M.2 NVMe para USB 3.0 recomendado. Tinha quase o mesmo tamanho do M.2 NVMe 2280 (22 mm de largura e 80 mm de comprimento), o que é ótimo para o gabinete Pico 5S. Usei o adaptador para conectar o SSD 970 EVO Plus M.2 PCIe NVMe 500 da Samsung ao Raspberry Pi.


Adaptador NVMe M.2 para USB 3.0

Depois de instalar e configurar tudo, decidi testar rapidamente a unidade e descobrir a velocidade de transferência de dados. Para fazer isso, copiei um arquivo grande do SSD para o meu laptop usandoscp:

$ scp pi@master:<source> <destination>
100% 1181MB 39.0MB/s 00:30


O resultado de 39 Mb / s me decepcionou. Esses números estão longe dos necessários para carregar completamente o comutador Gigabit Ethernet. Comecei a procurar um possível gargalo no sistema e percebi que, durante a transferência de arquivos, um dos núcleos do processador é sempre 100% carregado. Depois que descobri que o processador era o gargalo na transferência de dados, descobri rapidamente que o Raspberry Pi 4 não tem suporte de hardware AES, pois a Broadcom e a Raspberry Pi Foundation não licenciavam extensões criptográficas ARMv8. Curiosamente, o processador é o gargalo do sistema no Raspberry Pi 4, enquanto os gargalos do Raspberry Pi 3 eram USB 2.0 e interfaces de rede.

Um novo teste usando netcat, nas mesmas condições, deu resultados muito melhores a 104 Mb / s:

$ nc -l 6000 |dd bs=1m of=<destination> & ssh pi@master "dd bs=1M if=<source> | nc -q 0 $(hostname -I | awk '{print $1}') 6000"
[1] 71300 71301
1181+1 records in
1181+1 records out
1238558304 bytes (1.2 GB, 1.2 GiB) copied, 11.8632 s, 104 MB/s
0+740624 records in
0+740624 records out
1238558304 bytes transferred in 14.212518 secs (87145593 bytes/sec)
[1]  + 71300 done       nc -l 6000 |
       71301 done       dd bs=1m of=<destination>

Depois de lidar com a primeira unidade SSD, conectei a segunda mesma unidade a outra placa Raspberry Pi 4. Vou usar essa unidade para fazer backup da primeira usando algo como Restic .

Além disso, pretendo usar SSDs para organizar a inicialização usando a inicialização de armazenamento em massa USB imediatamente após o Raspberry Pi 4 suportar totalmente esse método de inicialização. Em comparação com o download do microSD, promete uma velocidade mais alta e um nível de desempenho mais estável.

Programas


Como programador, pensei que seria mais fácil lidar com a parte de software do cluster do que com outras perguntas. Os resultados do maravilhoso trabalho em k3s realizado pela equipe Rancher definitivamente me ajudaram aqui . Não entrarei em detalhes específicos sobre a configuração de um cluster Kubernetes em um Raspberry Pi usando o k3s aqui. Para quem estiver interessado, recomendo consultar este guia. Aqui estão os principais pontos para configurar nos quais gostaria de me concentrar.

Para iniciar, em cada nó, ative cgroups:

$ sudo sed -i '$ s/$/ cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory/' /boot/cmdline.txt
$ sudo reboot

Em seguida, instale o k3s no nó principal:

$ curl -sfL https://get.k3s.io | sh -s - --write-kubeconfig-mode 644
#   
$ sudo systemctl status k3s

Agora, obtemos um token que autoriza a conexão dos nós de trabalho com o nó principal:

$ sudo cat /var/lib/rancher/k3s/server/node-token

Em seguida - instale o k3s em cada nó de trabalho:

$ curl -sfL https://get.k3s.io | K3S_URL="https://<MASTER_IP>:6443" K3S_TOKEN="<NODE_TOKEN>" sh -
#   
$ sudo systemctl status k3s-agent

Se você planeja usar o registro interno de imagens de contêiner, instalado por padrão, pode ser necessário configurá-lo de uma maneira especial, para fazer com que as containerdimagens sejam carregadas a partir dele:

$ sudo sh -c 'REGISTRY=$(kubectl get svc -n kube-system registry -o jsonpath={.spec.clusterIP}); \
cat <<EOT >> /etc/rancher/k3s/registries.yaml
mirrors:
  "$REGISTRY":
    endpoint:
      - "http://$REGISTRY"
EOT'
$ sudo service k3s restart

Planos futuros


Neste material, não divulguei alguns tópicos importantes que merecem uma análise suficientemente profunda. Por exemplo, o seguinte:

  • Gerenciamento de energia de software de nós de trabalho e dimensionamento automático de cluster .
  • Instalar uma ventoinha PWM e ajustar sua velocidade, levando em consideração os indicadores de temperatura do sistema.
  • Instale o Pi-Hole no Kubernetes usando o MetalLB .

Talvez eu escreva mais sobre isso.

Além disso, pretendo continuar trabalhando no cluster, fazendo o seguinte:


Tenho certeza de que, quando falei sobre minha experiência na criação do cluster doméstico Kubernetes, esqueci muito. Sou programador e estou acostumado a uma divisão bastante heterogênea de grandes tarefas em casos menores. A experiência demonstrou que o hardware é muito menos tolerante que o software quando se trata de trabalho de tentativa e erro.

Em geral, quanto mais eu descubro, maior admiração em mim é causada pelas modernas tecnologias de hardware e software. Surpreende-me como a engenhosidade de uma pessoa foi capaz de combinar fenômenos elétricos e linguagens de programação, tornando-a algo que pode ser considerado um exemplo de como os controles da consciência são importantes.

Queridos leitores! Você tentou fazer algo semelhante ao que o autor deste artigo descreveu?


All Articles