Anatomie de ma grappe Kubernetes maison

Il y a un an, j'ai réalisé que je voulais créer mon propre cluster Kubernetes. Je suis développeur de logiciels. Habituellement, j'utilise soit un cluster local à nœud unique, soit un cluster distant à nœuds multiples pour tester mes projets. Lorsque je travaille avec un cluster à nœud unique, je compte généralement sur Minikube , bien qu'il existe d'autres solutions, comme le projet Kind , qui peuvent émuler la présence de plusieurs nœuds dans un cluster. La prise en charge de plusieurs nœuds peut apparaître dans Minikube.

Donc, je voudrais avoir à ma disposition les capacités des deux environnements ci-dessus. Autrement dit, pour que j'aie un cluster composé de plusieurs nœuds, et pour que travailler avec ces clusters n'implique pas de retards réseau typiques pour interagir avec des environnements distants. De nombreux didacticiels ont déjà été écrits sur la création de clusters multi-nœuds Kubernetes à l'aide d' ordinateurs à carte unique . Beaucoup de ces manuels utilisent le Raspberry Pi comme SBC. Voyant cela, j'ai décidé de suivre la voie de la moindre résistance et j'ai également choisi cet ordinateur. La plate-forme Raspberry Pi s'est imposée comme une solution peu coûteuse et abordable.





Il est à noter que le choix de cette plateforme prévoit certains compromis. Par exemple, Broadcom et la Fondation Raspberry Pi n'ont pas accordé de licence pour les extensions cryptographiques ARMv8 (cela est nécessaire pour l'accélération matérielle de la prise en charge AES). Une autre solution controversée est l'utilisation de cartes microSD sous la forme d'un support de stockage standard à partir duquel le système d'exploitation est chargé.

En analysant les directives existantes pour la création de clusters sur des ordinateurs à carte unique, je n'en ai trouvé aucun décrivant une solution qui réponde à mes besoins. Je vais commencer l'histoire du cluster que j'ai créé avec eux.

Exigences


  • Le cluster doit être enfermé dans un boîtier séparé, qui peut être facilement déplacé, ouvert et entretenu, en travaillant avec des modules séparés du système;
  • , . , , . , . , .
  • , .
  • , , , .

Derrière ces exigences, il y a un objectif non évident, c'est que j'avais besoin de ma fille de quatre ans pour travailler avec le cluster. J'espère qu'il deviendra pour elle une sorte de guide d'étude qui l'aidera à se familiariser avec les ordinateurs, les shells de commande et les terminaux.

Accessoires


DétailLa source
Kit de démarrage Pico 5 Raspberry PI 5Spicocluster.com
Ordinateurs à carte unique: 2 Raspberry Pi 4B (4 Go) 3 Raspberry Pi 3B +
5 cartes microSD 32 Go classe 10 / A1 raspberrypi.org
Câbles Ethernet: 2 0,25 m cat. 83 0,15 m cat. 7, S / FTP1attack.de
Câbles USB PortaPow 20AWG2 Câble USB-C3 câble micro-USBportablepowersupplies.co.uk
Écran tactile officiel Raspberry Pi 7 ″raspberrypi.org
Alimentation Dehner Elektronik STD-12090 12V / DC 9A 108Wdehner.net
Convertisseur DC-Buck 12V à 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

Le boîtier PicoCluster est de petite taille et très facile à utiliser. Dans le kit de démarrage que j'ai commandé, j'ai utilisé uniquement le châssis, y compris les loquets et les racks, ainsi que le commutateur Gigabit Ethernet à 8 ports.

Maintenant, je comprends qu'il serait préférable que PicoCluster vende une version de son kit sans aucun composant électrique. Une autre alternative à ce kit a été le développement de son propre boîtier. Cela nécessiterait cependant plus de temps. Il faudrait que je crée des dessins vectoriels, je devrais avoir recours aux services de découpe laser dans une entreprise proposant des feuilles acryliques, idéalement des feuilles avec un revêtement qui dissipe les décharges électrostatiques.

Au cours du travail, je suis tombé sur des avertissements concernant une tension insuffisanteet a découvert que le problème était dû aux câbles micro-USB fournis avec le boîtier. De plus, avec le boîtier, il y avait un convertisseur abaisseur DC-DC 12V à 5V, 30W, que j'ai remplacé par un plus puissant. Je l'ai fait pour des raisons que j'examinerai ci-dessous dans la section sur l'alimentation du système.

Au moment où j'ai commencé à travailler sur ce projet, je n'avais pas prévu d'utiliser les cartes Raspberry Pi 4 sorties en 2019. Cela explique que j'ai encore trois cartes Raspberry Pi 3 qui agissent comme des nœuds de travail. J'ai échangé deux autres cartes de ce type contre Raspberry Pi 4. Elles sont utilisées pour les nœuds qui ont besoin de plus de ressources. Il s'agit du nœud principal et du nœud de travail, qui, entre autres, est utilisé pour créer des sauvegardes de données.

Peu de temps après la sortie du Raspberry Pi 4, PicoCluster a lancé un nouveau châssis spécialement conçu pour ces cartes. Il comprend une alimentation puissante, deux ventilateurs et un interrupteur d'alimentation. Certes, ce boîtier est plus grand que le mien, et les fans se révéleront certainement plus bruyants que le Noctua NF-A4x20. La vitesse de rotation de ce ventilateur peut être contrôlée à l'aide de la modulation de largeur d'impulsion (PWM), en tenant compte des résultats des mesures de température effectuées sur les cartes.

Il convient de noter que le SoC Broadcom BCM2837 (Raspberry Pi 3) et le SoC BCM2711 (Raspberry Pi 4) ont des temporisateurs matériels capables de générer des signaux PWM. En conséquence, il est très simple d'émettre des signaux d'entrée de commandeattendu par Noctua NF-A4x20 PWM sans surcharger le processeur. De plus, le ventilateur est à peine audible lorsqu'il fonctionne à la moitié de la vitesse qu'il prend en charge (environ 2500 tr / min). Cela s'est avéré suffisant pour maintenir la température du système en dessous de 45 ° C / 113 ° F sous une charge normale.

Le nouveau boîtier comprend une alimentation électrique intégrée. De plus, il est plus cher que celui que j'ai choisi. Toutes ces caractéristiques de cet étui sont la raison pour laquelle je choisirais le kit Pico 5S même si j'ai acheté l'étui maintenant. Il faudrait faire plus d'efforts pour y penser, mais ce qui s'est finalement avéré me semble meilleur que ce qui se serait passé si j'avais choisi un autre bâtiment. En général, cela en vaut la peine et le temps.

Assemblée


▍ Panneau avant



Panneau

avant Le panneau avant a une ouverture pour accéder aux cartes microSD. C'est pratique, même si je prévois d'organiser le démarrage du système à l'aide du démarrage de stockage de masse USB . Je prévois de le faire juste après que le Raspberry Pi 4 supporte pleinement ce mode de démarrage. Le trou permet également d'organiser la circulation de l'air dans le boîtier. Dans ce cas, deux disques SSD sont situés directement en face du ventilateur, ce qui permet de maintenir leur température de fonctionnement optimale.

Les indicateurs d'activité et de puissance des cartes sont clairement visibles, ce qui vous permet d'évaluer l'état du cluster en un coup d'œil. Les indicateurs d'activité du commutateur Ethernet sont également visibles.


Le panneau supérieur du boîtier sans écran L'

écran peut être facilement déplacé pour le rapprocher du clavier ou pour donner accès au panneau supérieur lors de l'ouverture du boîtier.

▍ Panneau gauche



Panneau gauche

Sur le panneau gauche du boîtier se trouvent les ports GPIO des cartes. L'un des câbles relie l'unité principale au ventilateur - pour l'organisation du contrôle PWM de sa vitesse de rotation. Un autre câble relie le nœud principal au module de carte de circuit imprimé, qui est utilisé pour activer et désactiver les nœuds de travail. Quatre câbles relient chacun des nœuds de travail au nœud principal. Il utilise des broches GPIO avec un niveau actif élevé lorsqu'il est désactivé. Cela permet au nœud principal de couper l'alimentation du nœud de travail en toute sécurité une fois la séquence d'actions exécutée à la fin de son fonctionnement.


Le module utilisé pour connecter le ventilateur au nœud principal

Dans le coin supérieur gauche se trouve un petit module conçu pour connecter le connecteur du ventilateur Noctua à 4 broches au nœud principal du Raspberry Pi. Le connecteur GPIO correspondant, grâce au support matériel pour la génération de signaux PWM, est configuré pour contrôler la vitesse du ventilateur. La vitesse est choisie en fonction de l'analyse de la température des planches, dont les informations sont régulièrement collectées à l'aide de SSH. L'unité principale, en outre, à des fins de surveillance, lit la vitesse du ventilateur.

▍ panneau arrière



Panneau

arrière Le panneau arrière du châssis cache les câbles. Le fait que tout ressemble à cela peut être considéré comme la conséquence d'une approche astucieuse de l'organisation modulaire de mon projet. Il était difficile de trouver des câbles de qualité. Surtout - des câbles USB 3.0 courts avec des fiches incurvées. Câbles - c'est le plus grand groupe d'éléments mobiles dans mon système, ils doivent répondre à certaines caractéristiques mécaniques et électriques. Ils se sont avérés être la principale source de problèmes.

J'ai eu l'idée d'utiliser un seul câble en spirale afin de le remplacer par un câble à bande DSI, avec lequel un écran est connecté au système. Ensuite, le câble en spirale relierait l'écran au cluster et lui fournirait de l'énergie. Mais je n'ai pas pu trouver de connecteur DSI approprié. Je me suis abstenu de cette aventure et du fait que je n'étais pas attiré par la perspective de souder 17 fils de 0,14 mm². J'ai utilisé une rallonge de câble DSI et appliqué un câble d'alimentation micro-USB en spirale à 2 fils. Cela m'a donné la possibilité de déplacer et d'éteindre facilement l'écran sans ouvrir le boîtier.


Tentative infructueuse de disposition des câbles

Voici une tentative infructueuse d'utiliser le système pour organiser l'entrée des câbles dans le boîtier conçu pour les câbles d'extension USB 3.0. Malgré d'innombrables tentatives pour acheminer correctement les câbles, j'ai systématiquement rencontré des erreurs d'E / S lors des transferts de données. Ils étaient probablement causés par le fait qu'ils étaient trop étirés lors de la pose des câbles, ou par le fait que cela compromettait la connexion fiable des câbles aux connecteurs.

▍ Panneau droit



Panneau droit

Sur le côté droit du boîtier, vous pouvez voir le commutateur Ethernet à 8 ports.

Conception du système


▍ Nourriture



Boîtier avec panneau avant ouvert,

j'ai dû décider quelle alimentation utiliser. En particulier, quelle puissance en watts il doit prendre en charge pour répondre aux besoins du cluster. C'est un peu une question sur ce qui a précédé - un poulet ou un œuf, car les mesures ne peuvent pas être faites avant que l'alimentation soit appliquée à la grappe.

Afin d'obtenir une estimation approximative de la puissance, je me suis tourné vers la documentation officielle , qui contient des informations sur la puissance du Raspberry Pi, ainsi que les spécifications des autres composants. Cela m'a donné les chiffres approximatifs suivants basés sur la consommation d'énergie moyenne.


Mais que s'est-il passé après avoir pris en compte les valeurs maximales de consommation d'énergie de la documentation.


C'était beaucoup plus élevé que la puissance fournie par ces alimentations que je pouvais trouver qui produisaient 5V, car les composants "basse puissance" avaient besoin d'un courant de 10A. Cela a exclu la possibilité d'utiliser une seule alimentation 5V. Dans le même temps, les alimentations 12V sont très courantes, ce qui peut fournir le niveau d'alimentation nécessaire. Par conséquent, je choisi l'alimentation Elektronik Dehner STD-12090 12V / DC 9A 108W et connectée à un 12 V à 5 V 75 W DC / DC converter .

Ici, j'avais une autre option, qui consistait à utiliser cinq convertisseurs moins puissants - un pour chaque carte Raspberry Pi, mais cela compliquerait grandement la conception du cluster.


Patch bord A

bord du patch 4 broches sur la base du MOSFET PSMN011-30YLC est installé dans la partie inférieure du châssis. Il est utilisé pour activer et désactiver les nœuds de travail. Il est étiqueté 15A, 30V, donc il résiste bien même avec la charge créée par quatre Raspberry Pi.

J'ai mesuré la puissance moyenne et maximale consommée par le cluster. Les résultats de mesure sont approximativement cohérents avec ces calculs approximatifs que j'ai faits plus tôt. La différence entre les valeurs attendues et réelles peut être expliquée par les caractéristiques de la configuration du système et les caractéristiques du test. En particulier, j'ai désactivé le Wi-Fi et le Bluetooth sur mon Raspberry Pi, ils fonctionnent également sans afficher d'image sur le moniteur. Cela peut expliquer le fait qu'en réalité, les valeurs se sont avérées inférieures.

Il s'est avéré que l'alimentation de 108 W est beaucoup plus puissante que ce qui est nécessaire pour le cluster. Cependant, le fait que je dispose d'une telle alimentation signifie que je peux étendre les capacités du système. Par exemple, remplacez Raspberry Pi 3 par Raspberry Pi 4.

▍ Stockage de données


L'une des nouvelles fonctionnalités intéressantes du Raspberry Pi 4 est la présence sur la carte de deux ports USB 3.0 connectés au SoC BCM2711 à l'aide d'une connexion PCIe extrêmement rapide. Grâce à cela, on peut espérer atteindre des débits de données très élevés. J'ai décidé d'utiliser ces ports USB 3.0 pour connecter des SSD à l'aide des adaptateurs M.2 NVMe à USB 3.0. Cependant, il s'est avéré qu'il était très difficile de trouver de tels adaptateurs. J'ai naïvement suggéré que tous les adaptateurs fonctionneraient pour moi. En conséquence, j'ai acheté le premier adaptateur de ce type sans vérifier sa compatibilité avec le Raspberry Pi 4.

J'ai heureusement rencontré ceTéléchargez le guide de téléchargement du Raspberry Pi 4, puis achetez l'adaptateur recommandé Shinestar M.2 NVMe vers USB 3.0. Il était presque de la même taille que le M.2 NVMe 2280 (22 mm de large et 80 mm de long), ce qui est idéal pour le boîtier Pico 5S. J'ai utilisé l'adaptateur pour connecter le Samsung SSD 970 EVO Plus M.2 PCIe NVMe 500 Go au Raspberry Pi.


Adaptateur M.2 NVMe vers USB 3.0

Après avoir tout installé et configuré, j'ai décidé de tester rapidement le lecteur et de connaître la vitesse de transfert des données. Pour ce faire, j'ai copié un gros fichier du SSD sur mon ordinateur portable en utilisantscp:

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


Le résultat de 39 Mb / s m'a déçu. Ces chiffres sont loin de ceux nécessaires pour charger complètement le commutateur Gigabit Ethernet. J'ai commencé à rechercher un éventuel goulot d'étranglement dans le système et j'ai réalisé que lors du transfert de fichiers, l'un des cœurs du processeur est toujours chargé à 100%. Après avoir découvert que le processeur était le goulot d'étranglement dans le transfert de données, j'ai rapidement découvert que le Raspberry Pi 4 n'avait pas de support matériel AES, car Broadcom et la Raspberry Pi Foundation ne concédaient pas de licences d'extensions cryptographiques ARMv8. Fait intéressant, le processeur est le goulot d'étranglement du système sur le Raspberry Pi 4, tandis que les goulots d'étranglement du Raspberry Pi 3 étaient USB 2.0 et les interfaces réseau.

Un nouveau test utilisant netcat, dans les mêmes conditions, a donné de bien meilleurs résultats à 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>

Après avoir traité le premier disque SSD, j'ai connecté le deuxième même disque à une autre carte Raspberry Pi 4. Je vais utiliser ce disque pour sauvegarder le premier en utilisant quelque chose comme Restic .

De plus, je prévois d'utiliser des SSD pour organiser le démarrage à l'aide du démarrage de stockage de masse USB immédiatement après que le Raspberry Pi 4 prend pleinement en charge cette méthode de démarrage. Il, par rapport au téléchargement à partir de microSD, promet une vitesse plus élevée et un niveau de performance plus stable.

Logiciel


Je suis programmeur, j'ai donc pensé qu'il serait plus facile pour moi de traiter la partie logicielle du cluster que d'autres questions. Les résultats du merveilleux travail sur k3 effectué par l'équipe Rancher m'ont certainement aidé ici . Je n'entrerai pas dans les détails particuliers sur la configuration d'un cluster Kubernetes sur un Raspberry Pi utilisant k3s ici. Pour ceux qui sont intéressés, je peux recommander de consulter ce guide. Voici les principaux points à configurer sur lesquels je voudrais m'attarder.

Pour démarrer, sur chaque nœud, activez cgroups:

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

Installez ensuite k3s sur le nœud principal:

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

Nous obtenons maintenant un jeton autorisant la connexion des nœuds de travail au nœud principal:

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

Ensuite - installez k3s sur chaque nœud de travail:

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

Si vous prévoyez d'utiliser le registre interne d'images de conteneur, qui est installé par défaut, vous devrez peut-être le configurer d'une manière spéciale, en procédant ainsi afin de permettre le containerdchargement des images à partir de celui-ci:

$ 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

Plans futurs


Dans ce document, je n'ai pas divulgué certains sujets importants qui méritent une analyse suffisamment approfondie. Par exemple, les éléments suivants:


J'écrirai peut-être plus à ce sujet.

En outre, je prévois de continuer à travailler sur le cluster en procédant comme suit:


Je suis sûr que lorsque j'ai parlé de mon expérience dans la création du cluster domestique Kubernetes, j'ai beaucoup oublié. Je suis programmeur et je suis habitué à une répartition assez hétérogène de grandes tâches en petits cas. L'expérience a montré que le matériel est beaucoup moins tolérant que le logiciel en ce qui concerne les essais et les erreurs.

En général, plus j'en apprends, plus l'admiration en moi est causée par les technologies matérielles et logicielles modernes. Cela m'étonne de voir comment l'ingéniosité d'une personne a pu combiner des phénomènes électriques et des langages de programmation, ce qui en fait quelque chose qui peut être considéré comme un exemple de la façon dont la conscience contrôle la matière.

Chers lecteurs! Avez-vous essayé de faire quelque chose de similaire à ce que l'auteur de cet article a décrit?


All Articles