<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cluster on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/cluster/</link><description>Recent content in Cluster on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Wed, 17 Sep 2025 12:00:00 +0200</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/cluster/index.xml" rel="self" type="application/rss+xml"/><item><title>MicroStack évolue : compatibilité HP EliteDesk et Lenovo ThinkCentre pour votre homelab</title><link>https://blog.zwindler.fr/2025/09/17/microstack-un-projet-imprimer-un-rack-dell-micro-elitedesk-lenovo-thinkcentre/</link><pubDate>Wed, 17 Sep 2025 12:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2025/09/17/microstack-un-projet-imprimer-un-rack-dell-micro-elitedesk-lenovo-thinkcentre/</guid><description>&lt;img src="https://blog.zwindler.fr/2025/09/lenovo.webp" alt="Featured image of post MicroStack évolue : compatibilité HP EliteDesk et Lenovo ThinkCentre pour votre homelab" /&gt;&lt;h1 id="un-update-de-microstack--"&gt;Un update de MicroStack ? 😍
&lt;/h1&gt;&lt;p&gt;Eh oui ! Il y a quelques mois, je vous présentais &lt;a class="link" href="https://blog.zwindler.fr/2025/03/22/microstack-un-projet-open-source-pour-imprimer-un-rack-dell-micro/" &gt;MicroStack, mon projet de rack modulaire imprimé en 3D pour Dell Micro&lt;/a&gt;. Le projet a eu un succès inattendu sur MakerWorld / Bluesky (et même un peu Reddit) et j&amp;rsquo;ai reçu plusieurs demandes pour étendre la compatibilité&amp;hellip;&lt;/p&gt;
&lt;p&gt;Et comme je suis gentil (et que j&amp;rsquo;aime bien mes side-projects d&amp;rsquo;impression 3D), j&amp;rsquo;ai décidé de répondre aux demandes de la communauté !&lt;/p&gt;
&lt;h2 id="la-promesse-tenue--hp-elitedesk-et-lenovo-thinkcentre-"&gt;La promesse tenue : HP EliteDesk et Lenovo ThinkCentre !
&lt;/h2&gt;&lt;p&gt;Dans l&amp;rsquo;article original, j&amp;rsquo;avais mentionné qu&amp;rsquo;&lt;strong&gt;&amp;ldquo;une version compatible avec les Lenovo ThinkCentre Tiny était envisagée&amp;rdquo;&lt;/strong&gt;. Ben&amp;hellip; c&amp;rsquo;est fait ! Et j&amp;rsquo;ai même fait un bonus avec les &lt;strong&gt;HP EliteDesk/ProDesk&lt;/strong&gt; parce que&amp;hellip; pourquoi pas ?&lt;/p&gt;
&lt;p&gt;Désormais, le projet &lt;strong&gt;MicroStack&lt;/strong&gt; supporte officiellement &lt;strong&gt;trois gammes&lt;/strong&gt; de mini-PC :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Dell OptiPlex Micro&lt;/strong&gt; (toutes générations) - &lt;em&gt;le pionnier&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Lenovo ThinkCentre Tiny&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;HP EliteDesk/ProDesk&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="un-écosystème-qui-grandit"&gt;Un écosystème qui grandit
&lt;/h2&gt;&lt;p&gt;Le concept reste identique : des modules &lt;strong&gt;empilables&lt;/strong&gt; et &lt;strong&gt;modulaires&lt;/strong&gt; pour organiser proprement votre homelab. Mais maintenant, vous pouvez &lt;strong&gt;mixer les marques&lt;/strong&gt; dans un même rack si vous avez un parc hétérogène (et on sait tous comment ça arrive en homelab&amp;hellip; &amp;ldquo;oh regarde, cette machine d&amp;rsquo;occaz est à bon prix !&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;La &lt;a class="link" href="https://makerworld.com/en/collections/5818204-microstack-rack" target="_blank" rel="noopener"
&gt;&lt;strong&gt;collection complète MicroStack&lt;/strong&gt;&lt;/a&gt; comprend maintenant :&lt;/p&gt;
&lt;h3 id="modules-pour-pc-"&gt;Modules pour PC :
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://makerworld.com/fr/models/1236448-microstack-rack-modular-rack-for-dell-micro-pcs#profileId-1256174" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Module Dell Micro&lt;/strong&gt;&lt;/a&gt; - &lt;em&gt;l&amp;rsquo;original&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://makerworld.com/en/models/1317460-microstack-rack-a-modular-rack-system-for-lenovo-m#profileId-1352912" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Module Lenovo ThinkCentre&lt;/strong&gt;&lt;/a&gt; - &lt;em&gt;le demandé&lt;/em&gt; (grâce à un prêt de quelqu&amp;rsquo;un sur LinkedIn ! Merci !)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://makerworld.com/en/models/1446203-microstack-rack-modular-rack-for-hp-elitedesk#profileId-1505986" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Module HP EliteDesk/ProDesk&lt;/strong&gt;&lt;/a&gt; - &lt;em&gt;le bonus&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="modules-communs-"&gt;Modules communs :
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://makerworld.com/fr/models/1236457-microstack-rack-modular-rack-storage-module#profileId-1256190" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Module de stockage&lt;/strong&gt;&lt;/a&gt; - pour switch, accessoires, etc.&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://makerworld.com/fr/models/1236461-microstack-rack-modular-rack-top-hat#profileId-1256198" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Chapeau&lt;/strong&gt;&lt;/a&gt; - finition propre du rack&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tous ces modules sont &lt;strong&gt;inter-compatibles&lt;/strong&gt; et utilisent le même système d&amp;rsquo;empilement.&lt;/p&gt;
&lt;h2 id="toujours-les-mêmes-bonnes-pratiques"&gt;Toujours les mêmes bonnes pratiques
&lt;/h2&gt;&lt;p&gt;Comme pour l&amp;rsquo;original, je recommande toujours d&amp;rsquo;imprimer en &lt;strong&gt;PETG&lt;/strong&gt; (voire ASA ou ABS ?) plutôt qu&amp;rsquo;en PLA pour une meilleure résistance à la chaleur, même si ces mini-PC restent assez froids. Le design &lt;strong&gt;honeycomb&lt;/strong&gt; du plancher assure une bonne ventilation tout en économisant du filament.&lt;/p&gt;
&lt;h2 id="le-retour-dexpérience--la-modélisation-multi-gammes"&gt;Le retour d&amp;rsquo;expérience : la modélisation multi-gammes
&lt;/h2&gt;&lt;p&gt;Adapter le design original aux nouvelles gammes a été &lt;strong&gt;plus simple&lt;/strong&gt; que prévu, grâce à la base solide du projet initial. Une fois le concept établi avec le module Dell, il &amp;ldquo;suffit&amp;rdquo; de :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Prendre les mesures (précises !) des nouveaux modèles (encore faut il en trouver&amp;hellip;)&lt;/li&gt;
&lt;li&gt;Adapter les dimensions du châssis&lt;/li&gt;
&lt;li&gt;Faire un (ou plusieurs) test d&amp;rsquo;impression et valider l&amp;rsquo;empilement (le stress, à chaque fois, d&amp;rsquo;avoir crâmé 120g de plastique pour rien si on s&amp;rsquo;est planté)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Chaque nouveau module m&amp;rsquo;a pris une petite heure de modélisation, soit beaucoup moins que les 3x2h initiales du &lt;a class="link" href="https://blog.zwindler.fr/2025/03/22/microstack-un-projet-open-source-pour-imprimer-un-rack-dell-micro/" &gt;projet original&lt;/a&gt;. Le prototypage (tester des versions incomplètes pour économiser du plastique) ont pris pas mal de temps, que j&amp;rsquo;avais oublié de compter dans l&amp;rsquo;article précédent. Facilement quelques heures de plus.&lt;/p&gt;
&lt;h2 id="le-feedback-de-la-communauté"&gt;Le feedback de la communauté
&lt;/h2&gt;&lt;p&gt;Ce qui me fait le plus plaisir, c&amp;rsquo;est de voir que le projet a trouvé son public. Les retours sur MakerWorld sont globalement enthousiastes et les demandes d&amp;rsquo;évolution montrent que le concept répond vraiment à un besoin.&lt;/p&gt;
&lt;p&gt;Quelques utilisateurs m&amp;rsquo;ont déjà envoyé des photos de leurs installations mixtes avec différentes marques dans le même rack. C&amp;rsquo;est exactement l&amp;rsquo;esprit &lt;strong&gt;modulaire&lt;/strong&gt; que je voulais insuffler au projet !&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai aussi eu &lt;strong&gt;un&lt;/strong&gt; retour négatif, pour lequel je ne peux pas faire grand chose en l&amp;rsquo;état mais qui était intéressant et m&amp;rsquo;a permis de rajouter un avertissement. Le fait que l&amp;rsquo;arrière soit dédié pour le chargeur (PSU) bloque certains ports, en particulier pour le Lenovo. Les solutions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vivre avec seulement l&amp;rsquo;Ethernet (pour un lab, perso je trouve que ça va)&lt;/li&gt;
&lt;li&gt;Déporter les alims dans le module de &amp;ldquo;stockage&amp;rdquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/09/limitations.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="et-maintenant-"&gt;Et maintenant ?
&lt;/h2&gt;&lt;p&gt;Avec ces trois gammes couvertes, mon projet MicroStack devient vraiment &lt;strong&gt;polyvalent&lt;/strong&gt;. Si vous avez des suggestions d&amp;rsquo;autres mini-PC à supporter, n&amp;rsquo;hésitez pas ! Les MinisForum, peut être ?&lt;/p&gt;
&lt;p&gt;Si ce projet vous intéresse, n’hésitez pas à commenter, partager, faire des retours, &lt;strong&gt;voire &lt;em&gt;booster&lt;/em&gt; les trois modèles&lt;/strong&gt; pour ceux qui ont un compte MakerWorld (c&amp;rsquo;est gratuit, mais ça fait plaisir :-P).&lt;/p&gt;</description></item><item><title>MicroStack - un projet open source pour imprimer un rack modulable pour mon homelab Dell Micro</title><link>https://blog.zwindler.fr/2025/03/22/microstack-un-projet-open-source-pour-imprimer-un-rack-dell-micro/</link><pubDate>Sat, 22 Mar 2025 12:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2025/03/22/microstack-un-projet-open-source-pour-imprimer-un-rack-dell-micro/</guid><description>&lt;img src="https://blog.zwindler.fr/2025/03/microstack.webp" alt="Featured image of post MicroStack - un projet open source pour imprimer un rack modulable pour mon homelab Dell Micro" /&gt;&lt;h1 id="encore--encore-une-évolution-de-ton-lab-"&gt;ENCORE ? Encore une évolution de ton lab ???
&lt;/h1&gt;&lt;p&gt;Si vous suivez un peu le lore de mon blog, vous savez que j&amp;rsquo;ai autant de version de mon homelab que d&amp;rsquo;années d&amp;rsquo;expérience XD.&lt;/p&gt;
&lt;p&gt;2025 ne fera donc pas exception. Début 2024, je me lançais dans la &lt;a class="link" href="https://blog.zwindler.fr/2024/02/15/microrack-v1-pour-dell-micro/" &gt;construction d&amp;rsquo;un rack à base de profilé aluminium et d&amp;rsquo;impression 3D&lt;/a&gt;, à partir d&amp;rsquo;un projet envoyé par un copain sur Whatsapp !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/02/microrack.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Mais à l&amp;rsquo;usage, je le trouvais massif, pas super pratique, pas très joli&amp;hellip; bref, pas adapté à mon besoin.&lt;/p&gt;
&lt;p&gt;Sauf que (j&amp;rsquo;en ai déjà parlé) je me suis depuis mis à l&amp;rsquo;impression 3D et un peu (par la force des choses) à la modélisation 3D (ça va souvent de pair). Je me suis dis : pourquoi ne pas créer mon propre projet collant à mes besoins ?&lt;/p&gt;
&lt;p&gt;J’ai donc voulu explorer une solution maison pour mon homelab, imprimée en 3D, qui serait à la fois modulaire et empilable. L’idée était de proposer un système adaptable selon les besoins, avec un design simple et efficace.&lt;/p&gt;
&lt;h2 id="un-design-pensé-pour-lorganisation"&gt;Un design pensé pour l’organisation
&lt;/h2&gt;&lt;p&gt;Le &lt;strong&gt;MicroStack Rack&lt;/strong&gt; est conçu pour ranger proprement plusieurs &lt;strong&gt;Dell OptiPlex Micro&lt;/strong&gt; tout en maximisant l’espace. Il se compose de &lt;strong&gt;trois modules&lt;/strong&gt; différents pour l&amp;rsquo;instant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://makerworld.com/fr/models/1236448-microstack-rack-modular-rack-for-dell-micro-pcs#profileId-1256174" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Le module PC&lt;/strong&gt;&lt;/a&gt;, qui accueille un &lt;strong&gt;Dell Micro&lt;/strong&gt; (toutes générations) et son &lt;strong&gt;alimentation externe&lt;/strong&gt; à l’arrière pour plus de praticité.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/03/dellmodule.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://makerworld.com/fr/models/1236457-microstack-rack-modular-rack-storage-module#profileId-1256190" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Le module de stockage&lt;/strong&gt;&lt;/a&gt;, un compartiment vide pour &lt;strong&gt;accessoires, switch réseau ou autres équipements&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/03/storagemodule.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://makerworld.com/fr/models/1236461-microstack-rack-modular-rack-top-hat#profileId-1256198" target="_blank" rel="noopener"
&gt;&lt;strong&gt;Le chapeau&lt;/strong&gt;&lt;/a&gt;, un élément optionnel qui recouvre le rack pour un rendu plus propre.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/03/hatmodule.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Tous les modules sont &lt;strong&gt;empilables&lt;/strong&gt;, permettant d’adapter la configuration selon votre nombre de machines.&lt;/p&gt;
&lt;p&gt;Même si j&amp;rsquo;ai imprimé le prototype en PLA je vous conseille plutôt d&amp;rsquo;utiliser du &lt;strong&gt;PETG&lt;/strong&gt;, qui résiste mieux à la chaleur que le PLA. Cependant, ces machines restent plutôt froides en idle et le &lt;strong&gt;plancher en nid d’abeille&lt;/strong&gt; permet d’améliorer la ventilation (et de réduire la consommation de matière). Peut-être que ça marche aussi.&lt;/p&gt;
&lt;h2 id="combien-de-temps-ça-prend-de-faire-ce-genre-de-projet-"&gt;Combien de temps ça prend de faire ce genre de projet ?
&lt;/h2&gt;&lt;p&gt;Petit point temps passé.&lt;/p&gt;
&lt;p&gt;Je n&amp;rsquo;ai pas fait beaucoup de conception 3D dans le passé (j&amp;rsquo;ai fait quelques maps sur Unreal Tournament 2004&amp;hellip; oh me..e, ça fait 20 ans !!!). Donc, je me dis que ça peut être intéressant de partager combien de temps ça m&amp;rsquo;a pris.&lt;/p&gt;
&lt;p&gt;La modélisation a été réalisée en &lt;strong&gt;trois sessions de 2 heures&lt;/strong&gt; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2h&lt;/strong&gt; pour prendre les mesures, faire un prototype initial et se familiariser avec Blender.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2h&lt;/strong&gt; pour créer le module dédié au &lt;strong&gt;Dell Micro&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;2h&lt;/strong&gt; pour ajouter le &lt;strong&gt;module de stockage&lt;/strong&gt; et le &lt;strong&gt;chapeau&lt;/strong&gt; (ça va plus vite, j&amp;rsquo;ai déjà fait une partie du boulot et je suis plus efficace dans mon usage de Blender).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On peut rajouter une heure ou deux pour la manutention de l&amp;rsquo;imprimante 3D (lancer l&amp;rsquo;impression, vérifier qu&amp;rsquo;elle ne foire pas quelques minutes, nettoyer la plaque après impression, etc) et 3-4h pour la partie &amp;ldquo;sociale&amp;rdquo; (photos, upload sur makerworld, rédaction des descriptions et du blogpost, partage sur les réseaux).&lt;/p&gt;
&lt;p&gt;Un bon petit sideproject d&amp;rsquo;une dizaine d&amp;rsquo;heures donc.&lt;/p&gt;
&lt;h2 id="fichiers-et-évolutions"&gt;Fichiers et évolutions
&lt;/h2&gt;&lt;p&gt;Comme promis sur Bluesky où j&amp;rsquo;avais teasé le projet, les fichiers sont disponibles sous licence &lt;strong&gt;Creative Commons 4.0 BY-SA&lt;/strong&gt; sur &lt;strong&gt;MakerWorld&lt;/strong&gt; dans les formats 3MF, STL et les sources de blender :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://makerworld.com/fr/models/1236448-microstack-rack-modular-rack-for-dell-micro-pcs#profileId-1256174" target="_blank" rel="noopener"
&gt;MicroStack Rack – Module Dell Micro&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://makerworld.com/fr/models/1236457-microstack-rack-modular-rack-storage-module#profileId-1256190" target="_blank" rel="noopener"
&gt;MicroStack Rack – Module de stockage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://makerworld.com/fr/models/1236461-microstack-rack-modular-rack-top-hat#profileId-1256198" target="_blank" rel="noopener"
&gt;MicroStack Rack – Chapeau&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Une &lt;strong&gt;version compatible avec les Lenovo ThinkCentre Tiny&lt;/strong&gt; est envisagée pour la suite (on me l&amp;rsquo;a demandée sur Bluesky).&lt;/p&gt;
&lt;p&gt;Si ce projet vous intéresse, n’hésitez pas à commenter, partager, faire des retours, voire &lt;em&gt;booster&lt;/em&gt; les trois modèles pour ceux qui ont un compte MakerWorld (c&amp;rsquo;est gratuit, mais ça fait plaisir :-P).&lt;/p&gt;</description></item><item><title>MicroRack v1 - un rack compact pour les Dell Micro de mon homelab</title><link>https://blog.zwindler.fr/2024/02/15/microrack-v1-pour-dell-micro/</link><pubDate>Thu, 15 Feb 2024 17:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2024/02/15/microrack-v1-pour-dell-micro/</guid><description>&lt;img src="https://blog.zwindler.fr/2024/02/microrack.webp" alt="Featured image of post MicroRack v1 - un rack compact pour les Dell Micro de mon homelab" /&gt;&lt;h2 id="yet-another-homelab-again"&gt;Yet another homelab (again)
&lt;/h2&gt;&lt;p&gt;Il y a quasiment 10 ans (à 1 mois près), je concevais et construisais mon propre &amp;ldquo;meuble&amp;rdquo; pour mon homelab de l&amp;rsquo;époque, composé de plusieurs cartes MicroATX et de matériel récupéré.&lt;/p&gt;
&lt;p&gt;Je m&amp;rsquo;étais inspiré de Ike-hackers (pour ceux qui ne connaissent pas les &lt;a class="link" href="https://ikeahackers.net/" target="_blank" rel="noopener"
&gt;Ikea-hacks&lt;/a&gt; ou Ikeacks, je vous laisse chercher, ça vaut le coup) qui transformaient un meuble &amp;ldquo;Red helmer&amp;rdquo; en cluster de rendering 3D.&lt;/p&gt;
&lt;p&gt;Depuis, mon homelab a changé 45 fois (à peu près) et récemment, je me suis lancé dans un lab basé sur des dell micro, des tout petits desktops (il y en a aussi chez HP et Lenovo) qui consomment peu (donc peu puissants) et sont assez robustes :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/07/trofast2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2023/03/16/lab-2023-dell-micro-occasion/" target="_blank" rel="noopener"
&gt;L&amp;rsquo;article à ce sujet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="crude-but-effective"&gt;Crude but effective
&lt;/h2&gt;&lt;p&gt;On ne va pas se mentir, trimballer ça dans un bac &amp;ldquo;Trofast&amp;rdquo; de chez Ikea, c&amp;rsquo;est quand même un peu bourrin. Mais faute de mieux c&amp;rsquo;était pas mal.&lt;/p&gt;
&lt;p&gt;Quelques mois plus tard, un très bon copain (dont le seul défaut est qu&amp;rsquo;il vit en Australie et que bon, c&amp;rsquo;est un peu loin pour les apéros) m&amp;rsquo;envoie ça :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/02/printables.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.printables.com/fr/model/499181-mini-lab-rack-for-dell-optiplex-mff-servers" target="_blank" rel="noopener"
&gt;printables.com - SergeiBuilds - Mini Lab Rack For Dell Optiplex MFF Servers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Un &amp;ldquo;rack&amp;rdquo; compact et propre pour ranger des dell micro ??? A faire en DIY ?&lt;/p&gt;
&lt;p&gt;Mais c&amp;rsquo;est trop bien !!&lt;/p&gt;
&lt;h2 id="problèmes"&gt;Problème(s)
&lt;/h2&gt;&lt;p&gt;Bon, sur le papier ça a l&amp;rsquo;air cool, mais il y a quand même plusieurs problèmes à régler. D&amp;rsquo;abord, le lien sur printables.com est assez peu détaillé. Les photos sont pas tops (on ne voit pas comment c&amp;rsquo;est monté), on sait juste qu&amp;rsquo;il faut imprimer des pièces (dont les modèles sont fournis) et qu&amp;rsquo;il faut monter ça dans un cadre en aluminium.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The frame is assembled from 4x 200mm, 4x 300mm, 4x 400mm &amp;amp; 2x 360mm 2020 aluminium extrusion and held together with L corner brackets. The overall dimensions are 240mm wide, 400mm high &amp;amp; 340mm deep.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;D&amp;rsquo;abord: je n&amp;rsquo;ai pas d&amp;rsquo;imprimante 3D (et je n&amp;rsquo;y connais rien).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/02/twitter1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On m&amp;rsquo;a conseillé plusieurs moyens de contournement. En acheter une (le plus simple xD), demander à un copain, passer dans un fablab, la faire imprimer sur Internet (ça coûte assez cher).&lt;/p&gt;
&lt;p&gt;(Finalement, j&amp;rsquo;ai trouvé une âme charitable pour me les imprimer au boulot, merci Fabien)&lt;/p&gt;
&lt;p&gt;Ensuite, comment on l&amp;rsquo;achète et on le monte ce fichu cadre en aluminium ?&lt;/p&gt;
&lt;p&gt;A force de recherches (&lt;strong&gt;décembre 2023&lt;/strong&gt;), j&amp;rsquo;ai fini par trouver que les &amp;ldquo;2020 aluminium extrusion&amp;rdquo; s&amp;rsquo;appellent en bon français des &amp;ldquo;profilés aluminium 20x20&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;On peut en trouver sur Amazon pré-coupés (c&amp;rsquo;est fort cher). Et même si on en prend des grands à recouper soi-même, j&amp;rsquo;avais un peu peur de la précision de coupe (même si je suis outillé).&lt;/p&gt;
&lt;p&gt;Heureusement, on a fini par me donner l&amp;rsquo;adresse d&amp;rsquo;un site industriel qui en vend à la découpe (motedis.fr).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.motedis.fr/fr/Profile-aluminium-20x20-Type-B-rainure-6" target="_blank" rel="noopener"
&gt;Profilé aluminium 20x20 Type B rainure 6 &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour assembler les profilés, il faut des équerres internes (&lt;code&gt;L corner brackets&lt;/code&gt;, fallait deviner&amp;hellip;). Heureusement on en trouve aussi chez Motedis, je suis tombé dessus par hasard en fouillant les vidéos du site !&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.motedis.fr/fr/Equerre-interne-20-B-Type-rainure-6-M5-Alternative" target="_blank" rel="noopener"
&gt;Équerre interne 20 B-Type rainure 6 M5 Alternative &lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il en faut 20 (ce que ne dit pas ce cher &lt;em&gt;SergeiBuilds&lt;/em&gt;, j&amp;rsquo;ai compté 3 fois pour être bien sûr).&lt;/p&gt;
&lt;p&gt;Une fois que vous avez pris ces deux trucs là, vous en avez déjà pour 60€ (dont 20€ de frais de port)&amp;hellip;&lt;/p&gt;
&lt;p&gt;Il faut aussi des écrous à glisser dans les rails pour fixer nos pièces de PLA, ainsi que des vis M5. J&amp;rsquo;en ai compté 24 mais je ne les ai pas achetés (on y reviendra dans la section suivante).&lt;/p&gt;
&lt;h2 id="et-là-cest-le-drame"&gt;Et là, c&amp;rsquo;est le drame
&lt;/h2&gt;&lt;p&gt;Je laisse passer décembre (trop occupé) et je commande tout ça (&lt;strong&gt;mi-janvier 2024&lt;/strong&gt;)&lt;/p&gt;
&lt;p&gt;Au bout de quelques jours, ma commande Motedis est arrivée et j&amp;rsquo;étais comme un gosse à Noël. Mais je déchante très très vite&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/02/twitter2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Les équerres ne rentrent pas dans le profilé&lt;/strong&gt;. Un peu bourrin (oui je suis pas toujours très fin), je tape dessus au marteau. Sur les extrémités ça marche (bien). Au milieu, j&amp;rsquo;arrive à mettre le premier. Mais je casse les suivantes.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/02/equerres2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pourtant c&amp;rsquo;est bien du 2020 mon profilé 🤔&amp;hellip;&lt;/p&gt;
&lt;p&gt;Bon, je ne vous fais pas mariner trop longtemps. La raison c&amp;rsquo;est que je n&amp;rsquo;ai pas pris le bon profilé 2020. Il existe 2 sortes, toutes les deux disponibles sur Motedis et j&amp;rsquo;ai pris la mauvaise :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/02/typeBI.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Grosso modo, j&amp;rsquo;ai pris par erreur les types I, qui ont une rainure &amp;ldquo;arrondie&amp;rdquo; de 5, alors que ceux qu&amp;rsquo;il fallait, c&amp;rsquo;était des types B, avec une rainure trapézoïdale de 6&amp;hellip;&lt;/p&gt;
&lt;p&gt;A partir de là, 2 solutions :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;je rachète tout&lt;/li&gt;
&lt;li&gt;je m&amp;rsquo;adapte&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ca m&amp;rsquo;ennuie de jeter de l&amp;rsquo;alu parce que j&amp;rsquo;ai été trop bête&amp;hellip; J&amp;rsquo;ai donc décidé (&lt;strong&gt;5 février&lt;/strong&gt;) de trouver des solutions, quitte à ce que le rendu soit moins &amp;ldquo;net&amp;rdquo;. J&amp;rsquo;ai donc remplacé l&amp;rsquo;usage des écrous+vis M5 par visser les parties imprimées.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/02/rack1.avif"
loading="lazy"
&gt; &lt;img src="https://blog.zwindler.fr/2024/02/rack2.avif"
loading="lazy"
&gt; &lt;img src="https://blog.zwindler.fr/2024/02/rack3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Clairement, le résultat me parait acceptable.&lt;/p&gt;
&lt;p&gt;Mais ne faites pas la même erreur que moi, car il sera impossible d&amp;rsquo;avoir un rendu parfait avec des vis plantées dans un rail alu. L&amp;rsquo;avantage des équerres et des écrous + vis M5, c&amp;rsquo;est que c&amp;rsquo;est repositionnable juste en desserrant / resserrant la vis.&lt;/p&gt;
&lt;p&gt;Le &lt;strong&gt;13 février&lt;/strong&gt;, j&amp;rsquo;ai reçu de la part de mon collègue les pièces imprimées en PLA.&lt;/p&gt;
&lt;p&gt;Premier problème : comme je dois les visser directement dans le rail alu (puisque je ne peux pas insérer d&amp;rsquo;écrous pour mes vis M5) je ne peux pas les positionner correctement. Même en faisant de mon mieux, j&amp;rsquo;ai parfois des petits &amp;ldquo;jours&amp;rdquo; d&amp;rsquo;un 1/2 millimètre.&lt;/p&gt;
&lt;p&gt;Deuxième problème : je ne peux pas non plus visser la cage pour le switch, car je ne pourrais pas passer un tournevis. Je laisse ce problème de côté dans un premier temps.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/02/rack4.avif"
loading="lazy"
&gt; &lt;img src="https://blog.zwindler.fr/2024/02/rack5.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Troisième problème, je n&amp;rsquo;ai pas vérifié, mais mon switch est trop épais. Je découpe donc à la Dremel (content de l&amp;rsquo;avoir même si elle sert pas souvent) et à la pince perroquet mon bout de PLA. Petite surprise (évidente) : le PLA, ça fond 😅.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/02/pla1.avif"
loading="lazy"
&gt; &lt;img src="https://blog.zwindler.fr/2024/02/pla2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;arrive quand même à tout assembler et à obtenir un résultat correct. C&amp;rsquo;est fonctionnel, ça reste joli malgré quelques imprécisions, et c&amp;rsquo;est assez pratique à l&amp;rsquo;usage.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/02/rack6.avif"
loading="lazy"
&gt; &lt;img src="https://blog.zwindler.fr/2024/02/rack7.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="la-suite-"&gt;La suite ?
&lt;/h2&gt;&lt;p&gt;Après avoir posté ça sur Twitter et à quelques copains, on m&amp;rsquo;a donné quelques idées d&amp;rsquo;améliorations, qui serviront pour une V2 :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ajouter des pieds, en taraudant le tube central des profilés&lt;/li&gt;
&lt;li&gt;Remplacer le passe câble Ethernet du haut et la cage pour le switch en dessous par un support caché pour un switch 8 ports. Il n&amp;rsquo;y a vraiment de raison fonctionnelle à ce que les ports soient visibles et 5 ports c&amp;rsquo;est trop limité. Pourquoi pas acheter un managé tant qu&amp;rsquo;à y être.&lt;/li&gt;
&lt;li&gt;En profiter pour ajouter un étage de plus (dell micro ? Raspberry pi ?)&lt;/li&gt;
&lt;li&gt;Remplacer la multiprise (en prendre une connectée ?) et trouver un moyen de la fixer proprement sur les rails&lt;/li&gt;
&lt;li&gt;Trouver un moyen de fixer les alims pour qu&amp;rsquo;elles ne pendouillent pas&lt;/li&gt;
&lt;li&gt;Ajouter un pikvm (cher++ !) pour se passer du mini écran ? A voir&lt;/li&gt;
&lt;li&gt;Éventuellement couvrir une partie des côtés avec du plexi ? A voir&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pour l&amp;rsquo;instant je ne vais rien faire, car je suis content du résultat (et un peu fatigué de tout ces rebondissements !). Mais on verra après un peu d&amp;rsquo;usage ce que je fais / ne fais pas :)&lt;/p&gt;
&lt;p&gt;En attendant, have fun !&lt;/p&gt;</description></item><item><title>Stockage distribué et répliqué avec DRBD</title><link>https://blog.zwindler.fr/2020/05/11/stockage-distribue-et-replique-avec-drbd/</link><pubDate>Mon, 11 May 2020 06:35:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/05/11/stockage-distribue-et-replique-avec-drbd/</guid><description>&lt;img src="https://blog.zwindler.fr/2020/04/drbd_infra-2.webp" alt="Featured image of post Stockage distribué et répliqué avec DRBD" /&gt;&lt;h2 id="drbd"&gt;DRBD
&lt;/h2&gt;&lt;p&gt;En 2015, j’avais voulu essayer la solution de stockage distribué DRBD. Et oui, 2015. C’est mon plus vieux brouillon sur le blog que je sors enfin. Vous vous en doutez, j’ai du repasser dessus pour ne pas vous donner de versions antédiluvienne ;-)&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.linbit.com/drbd/" target="_blank" rel="noopener"
&gt;DRBD (pour Distributed Replicated Block Device)&lt;/a&gt; est donc un logiciel disponible sous Linux et Windows qui permet de gérer des périphériques de stockages virtuels utilisables dans des infrastructures.&lt;/p&gt;
&lt;p&gt;Ces périphériques ont la particularité de pouvoir être « distribués » sur plusieurs serveurs sur un réseau de façon synchrone ou asynchrone et disposant de plusieurs méthodes de resynchronisation en cas de perte de lien ou d’incohérences.&lt;/p&gt;
&lt;p&gt;L’avantage de cette solution est qu’elle est robuste (fiabilité éprouvée) et qu’elle permet de répondre à des problématiques de haute disponibilité et de performance que n’offrent pas forcément toutes les solutions de stockage.&lt;/p&gt;
&lt;p&gt;Si cette solution peut paraître de prime abord un peu datée à l’époque des containers et de Kubernetes, sachez que Linbit a fait un effort assez conséquent justement sur cette partie, en essayant de se positionner comme un des acteurs du stockage distribué pour les architectures containerisées et/ou &amp;ldquo;cloud native&amp;rdquo; (surtout trusté par &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=ceph" &gt;Ceph/CephFS&lt;/a&gt;, voire &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=gluster" &gt;Gluster&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/linstor.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Pour tester DRBD, vous l’aurez compris, il va nous falloir au minimum deux serveurs. Pour faire simple, je vais utiliser des machines virtuelles (mais évidemment ça fonctionnera mieux sur un serveur physique) sur lesquelles j’ai installé une image Ubuntu 18.04.&lt;/p&gt;
&lt;p&gt;Dans mon cas, j’ai rajouté des disques virtuels de 16Go, pour simuler des disques physiques à synchroniser. De même, j’ai également rajouté des interfaces réseaux supplémentaires pour simuler un réseau dédié « stockage ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/drbd_infra-2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="installation-du-logiciel"&gt;Installation du logiciel
&lt;/h2&gt;&lt;p&gt;La société LINBIT qui distribue le logiciel DRBD propose des packages précompilés pour la plupart des distributions Linux classiques. L’ensemble des packages des différentes versions de DRBD sont disponibles sur le site de &lt;a class="link" href="https://www.linbit.com/drbd/" target="_blank" rel="noopener"
&gt;Linbit&lt;/a&gt;. Cependant, ces packages « officiels » précompilés nécessitent d’avoir payé le support.&lt;/p&gt;
&lt;p&gt;Note : Si les packages officiels sont réservés aux personnes qui payent le support, les sources, elles, sont bien entendu disponibles &lt;a class="link" href="https://www.linbit.com/linbit-software-download-page-for-linstor-and-drbd-linux-driver/" target="_blank" rel="noopener"
&gt;sur le site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Heureusement, il est possible d’utiliser tout simplement les packages précompilés de votre distribution.&lt;/p&gt;
&lt;p&gt;A la base, quand j’avais écrit le tutoriel en 2015, j’avais des soucis de compatibilité entre la version du kernel et drbd de ma distribution CentOS (6.3 à l’époque&amp;hellip;). Ma version, 2.6.32-279 alors que les versions 8.3 et 8.4 de DRBD nécessitent le kernel 2.6.32-431. Mais rien ne vous empêche d’installer le kernel demandé pour résoudre ce problème.&lt;/p&gt;
&lt;p&gt;Pour ce tuto, voici les commandes que j’ai dû utiliser pour installer DRBD 9 (la dernière stable même si la 10 arrive bientôt) sur mes Ubuntu 18.04.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt update
sudo apt upgrade
sudo apt install software-properties-common
sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
sudo apt-get update
sudo apt install drbd-utils python-drbdmanage drbd-dkms
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois que c’est installé, testez que tout fonctionne avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo modprobe drbd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si tout se passe bien, elle ne devrait remonter aucune erreur. En revanche, si vous n’avez pas un kernel avec une version compatible, vous devriez avoir une erreur du type &amp;ldquo;file not found&amp;rdquo;. Dans ce cas-là, il faudra compiler DRBD à la main.&lt;/p&gt;
&lt;h2 id="préparation-des-machines"&gt;Préparation des machines
&lt;/h2&gt;&lt;p&gt;Les serveurs doivent évidemment pouvoir se joindre et se résoudre. Le mieux étant bien sûr un DNS correct, on pourra se rabattre dans le cadre d’un test sur &lt;em&gt;a minima&lt;/em&gt; un fichier /etc/hosts contenant les informations nécessaires :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;192.168.100.11 drbd1 drbd1.example.org
192.168.100.12 drbd2 drbd2.example.org
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, j’ai créé, sur chaque serveur, deux partitions de 8 Go chacun sur le disque de 16. La première sera de type Linux, la seconde sera de type LVM.&lt;/p&gt;
&lt;p&gt;On oublie pas de créer les objets LVM pour pouvoir les utiliser plus tard.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvcreate /dev/sdb2
vgcreate vg_drbd /dev/sdb2
lvcreate -n lv_drbd -l 2047 vg_drbd
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;Le fichier de configuration global de DRBD est &lt;em&gt;/etc/drbd.conf&lt;/em&gt;. Il définit les fichiers unitaires qui doivent être modifiés. Le fichier &lt;em&gt;/etc/drbd.conf&lt;/em&gt; en lui-même ne doit donc pas être modifié directement ; sauf dans le cas où on souhaite changer les fichiers de configuration inclus de répertoire.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/drbd.conf
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include &amp;#34;drbd.d/global_common.conf&amp;#34;;
include &amp;#34;drbd.d/*.res&amp;#34;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le fichier suivant doit contenir les paramètres et les commandes qui sont globaux à toutes les ressources DRBD.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/drbd.d/global_common.conf
# DRBD is the result of over a decade of development by LINBIT.
# In case you need professional services for DRBD or have
# feature requests visit http://www.linbit.com
global {
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="template-de-ressource"&gt;Template de ressource
&lt;/h3&gt;&lt;p&gt;Pour rendre la configuration lisible, on sépare les fichiers de configuration de manière à faire un fichier texte par ressource, nommé avec la convention r[nombre].res. Ici on prendra l’exemple le plus simple d’une synchronisation synchrone (protocole C, par défaut) dans un modèle actif/passif.
Pour vous aider à créer vos premières ressources, DRBD met à disposition, dans &lt;strong&gt;/etc/drbd.d/drbdctrl.res_template&lt;/strong&gt; un template dans lequel vous n’aurez qu’à modifier les valeurs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;resource .drbdctrl {
net {
cram-hmac-alg sha1;
shared-secret &amp;#34;&amp;lt;your-shared-secret&amp;gt;&amp;#34;;
}
volume 0 {
device /dev/drbd0 minor 0;
disk /dev/mapper/&amp;lt;vgname&amp;gt;-.drbdctrl;
meta-disk internal;
}
on &amp;lt;node_1&amp;gt; {
node-id 0;
address &amp;lt;ipaddress&amp;gt;:&amp;lt;port&amp;gt;;
}
on &amp;lt;node_n&amp;gt; {
node-id &amp;lt;n&amp;gt;;
address &amp;lt;ipaddress&amp;gt;:&amp;lt;port&amp;gt;;
}
connection-mesh {
hosts &amp;lt;node_1&amp;gt; &amp;lt;node_2&amp;gt; ... &amp;lt;node_n&amp;gt;;
net {
protocol C;
}
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="ressource-pour-un-disque-simple"&gt;Ressource pour un disque &amp;ldquo;simple&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;Ici, c’est l’exemple le plus simple. On va indiquer que notre ressource est distribuée sur 2 serveurs sur un bête partition Linux. Les metadata, elles, sont stockées en local (ce qui n’est pas forcément le mieux, mais pour commencer ça suffira).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/drbd.d/r0.res
resource r0 {
on drbd1 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.100.11:7789;
meta-disk internal;
}
on drbd2 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.100.12:7789;
meta-disk internal;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note : si le protocole de synchronisation n’est pas spécifié, on est en synchronisation synchrone par défaut.&lt;/p&gt;
&lt;p&gt;Attention : chaque ressource déclarée réserve le port TCP pour la communication de la ressource. Il faut donc incrémenter le numéro du device drbd ET incrémenter le numéro de port à chaque nouvelle ressource (et aussi s’assurer que le port est libre&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Pour mes tests, j’ai également utilisé la possibilité offerte par DRBD d’utiliser des volumes LVM plutôt que des partitions brutes. La configuration est la même à ceci près qu’on pointe sur le LV plutôt que sur une partition.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/drbd.d/r1.res
resource r1 {
on drbd1 {
device /dev/drbd2;
disk /dev/vg_drbd/lv_drbd;
address 192.168.100.11:7790;
meta-disk internal;
}
on drbd2 {
device /dev/drbd2;
disk /dev/vg_drbd/lv_drbd;
address 192.168.100.12:7790;
meta-disk internal;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="initialisation"&gt;Initialisation
&lt;/h2&gt;&lt;p&gt;Maintenant que tout est configuré, on va pouvoir déclencher l’étape d’initialisation des metadata et des ressources nouvellement créées.
Lancez les commandes suivantes sur les deux nœuds :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdadm create-md r0
drbdadm create-md r1
drbdadm up r0
drbdadm up r1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois que les commandes sont lancées, on peut afficher les informations sur l’initialisation des disques (état normal) avec &lt;strong&gt;drbdmon&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/drbdmon1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Actuellement, les nœuds sont &lt;strong&gt;Inconsistants&lt;/strong&gt; et en Secondaire/Secondaire, car nous n’avons pas encore désigné le nœud principal. Nous allons &amp;ldquo;forcer&amp;rdquo; le sens dans lequel le disque doit être synchronisé.&lt;/p&gt;
&lt;p&gt;Sélectionner un des nœuds, qu’on va désigner comme &amp;ldquo;serveur primaire&amp;rdquo; et exécuter les commandes suivantes (uniquement sur lui) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@drbd1:~# drbdadm primary --force r0
root@drbd2:~# drbdadm primary --force r1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ATTENTION : dans le cas d’un disque déjà créé, il faut bien ne pas se tromper de sens, au risque d’écraser le disque qui contiendrait les données.&lt;/p&gt;
&lt;p&gt;Une fois la synchronisation terminée, on peut utiliser le disque /dev/drbdX.&lt;/p&gt;
&lt;h2 id="cest-fini-"&gt;C’est fini ?
&lt;/h2&gt;&lt;p&gt;En fait, pas tout à fait. On ne va pas pouvoir utiliser nos disques exactement comme des disques classiques. Si vous formattez ce disque en ext4/xfs/whatever et que vous essayez de le monter sur vos deux serveurs drbd1 et drbd2, vous allez avoir une drôle de surprise.&lt;/p&gt;
&lt;p&gt;En effet, ces filesystems ne savent pas gérer les accès concurrents provenant de deux machines simultanées. On va donc devoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;soit utiliser un filesystem capable de gérer les accès concurrents (&lt;a class="link" href="https://en.wikipedia.org/wiki/Clustered_file_system" target="_blank" rel="noopener"
&gt;page Wikipedia listant quelques clustered filesystems&lt;/a&gt;) comme OCFS2 ou GFS2. Si vous publiez les disques DRBD en iSCSI pour votre cluster VMware, vous n’aurez pas de problème non plus car le VMFS le gère très bien aussi.&lt;/li&gt;
&lt;li&gt;soit s’assurer à tout moment que le disque n’est monté que sur un seul serveur à la fois.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Évidemment la 2ème option est à proscrire si vous êtes dans un contexte de production. Cependant, cela reste possible si vous montez un cluster Pacemaker ou &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=RHCS" &gt;RHCS&lt;/a&gt; par exemple, qui va s’assurer que les bascules de stockage se font de manière propre.&lt;/p&gt;
&lt;p&gt;Enjoy !&lt;/p&gt;
&lt;h2 id="bonus--quelques-commandes-utiles"&gt;Bonus : quelques commandes utiles
&lt;/h2&gt;&lt;p&gt;Pour une ressource donnée, afficher le rôle du serveur local&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@drbd1:~# drbdadm role r0
Primary
root@drbd1:~# drbdadm role r1
Secondary
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Afficher de manière concise l’état d’une ressource sur les nœuds&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@drbd1:~# drbdadm dstate r0
UpToDate/UpToDate
root@drbd1:~# drbdadm dstate r1
Inconsistent/UpToDate
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Afficher plus de détails sur une ressource avec &lt;code&gt;drbdadmin&lt;/code&gt; pour un résultat simple ou &lt;code&gt;drbdsetup&lt;/code&gt; pour avoir plus de détails :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/drbd_state.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdsetup status r1 --verbose --statistics
r1 node-id:1 role:Secondary suspended:no
write-ordering:flush
volume:0 minor:2 disk:Inconsistent quorum:yes
size:8384220 read:0 written:1972628 al-writes:0 bm-writes:0 upper-pending:0 lower-pending:0 al-suspended:no blocked:no
drbd2 node-id:0 connection:Connected role:Primary congested:no ap-in-flight:0 rs-in-flight:0
volume:0 replication:SyncTarget peer-disk:UpToDate done:23.53 resync-suspended:no
received:1972628 sent:0 out-of-sync:6411740 pending:3 unacked:12 dbdt1:92.39 eta:68
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En temps normal, toutes les ressources sont actives par défaut. Cependant, on peut les activer ou les désactiver à la main :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdadm up r0
drbdadm down r1
# utiliser le mot clé « all » pour désigner toutes les ressources
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si on modifie les fichiers de configuration global ou un fichier de ressource, il est nécessaire de mettre à jour la configuration sur les deux nœuds. Il est possible de reconfigurer les ressources même si elles sont opérationnelles grâce à la méthode suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drdbadm adjust r0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Changer le statut du nœud courant (pour le passer en primary s’il est secondary par exemple)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdadm primary r1
drbdadm secondary r0
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.linbit.com/drbd-user-guide/drbd-guide-9_0-en/" target="_blank" rel="noopener"
&gt;User Guide DRBD 9.0 (Anglais)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Changement de provider, mon hyperviseur sur un dédié Hetzner</title><link>https://blog.zwindler.fr/2019/11/19/changement-de-provider-mon-hyperviseur-sur-un-dedie-hetzner/</link><pubDate>Tue, 19 Nov 2019 07:30:00 +0000</pubDate><guid>https://blog.zwindler.fr/2019/11/19/changement-de-provider-mon-hyperviseur-sur-un-dedie-hetzner/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/11/Hetzner_DCP_Luftbild.webp" alt="Featured image of post Changement de provider, mon hyperviseur sur un dédié Hetzner" /&gt;&lt;h2 id="au-revoir-oneprovider-bonjour-hetzner"&gt;Au revoir OneProvider, bonjour Hetzner
&lt;/h2&gt;&lt;p&gt;Certains d’entre vous m’ont peut être vu me plaindre de OneProvider et plus particulièrement le support avec qui j’ai eu plusieurs accrochages (Spoiler, j’ai migré vers Hetzner).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/tweet_op.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Sans rentrer dans les détails (j’ai échangé avec certains d’entre vous sur le sujet), après cette déconvenue, j’ai donc cherché une alternative pour héberger mes machines.&lt;/p&gt;
&lt;p&gt;Les prérequis étaient d’avoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;une machine physique&lt;/li&gt;
&lt;li&gt;avec suffisamment de RAM (minimum 8 Go, 16 c’est mieux)&lt;/li&gt;
&lt;li&gt;idéalement, une gestion des réseaux virtuels entre machines du provider (type RPN ou vRack)&lt;/li&gt;
&lt;li&gt;si possible pas un ATOM en CPU (le souci de l’ATOM, c’est que c’est tellement faiblard que ça pénalise les IO)&lt;/li&gt;
&lt;li&gt;si possible du VT-x (je n’en ai pas besoin d’en l’absolu, je vais surtout du LXC, mais ça peut dépanner)&lt;/li&gt;
&lt;li&gt;si possible du SSD parce que c’est quand même cool&lt;/li&gt;
&lt;li&gt;si possible 2 disques pour avoir du RAID ou que je puisse me faire un équivalent (ZFS/ZRAID)&lt;/li&gt;
&lt;li&gt;un prix pas trop élevé (genre pas OVH) car j’ai été mal habitué avec les prix agressifs de OneProvider (oui je sais, je l’ai payé avec le support)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="létat-du-marché"&gt;L’état du marché
&lt;/h2&gt;&lt;p&gt;Chez OneProvider, j’avais tout ça pour environ 20-25 euros / mois, à l’exception du réseaux privé virtuel entre machine.&lt;/p&gt;
&lt;p&gt;Autant dire qu’on est très loin du premier prix de chez OVH (&amp;gt;60€/mois TTC). Si on descend en gamme chez OVH, on perd le réseau privé virtuel entre machines (vRack) en passant chez SoYouStart et pourtant on est toujours à plus de 42€ / mois TTC. Toujours 2 fois plus cher que OneProvider :-/.&lt;/p&gt;
&lt;p&gt;Il faut descendre encore de gamme et passer chez Kimsufi pour trouver des prix comparables dans mes critères (et toujours pas de réseau privé virtuel), avec de vieux CPU et surtout un réseau bridé au 100 Mbps (ce qui est pénible pour les transferts de gros fichiers, les réplications de VMs et les sauvegardes).&lt;/p&gt;
&lt;p&gt;J’avais aussi jeté un œil côté Online.net, qui eux proposent sur certaines machines identiques à celles que j’avais avec EN PLUS le graal, un réseau privé virtuel entre dédiés (RPN).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/online.net_.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ces deux configs me disaient vraiment quelque chose&amp;hellip; et pour cause ! OneProvider les revends en marque blanche.&lt;/p&gt;
&lt;p&gt;Donc c’est exactement les mêmes machines que celle que j’ai pu avoir dans le passé, mais avec le RPN en plus, et un peu plus cher (beaucoup plus cher même).&lt;/p&gt;
&lt;p&gt;Ce qui est dommage ici, c’est que le RPN ne soit pas disponible sur les machines un peu plus petites (mon PRA n’est pas aussi gros, juste de quoi faire tourner le blog en cas de gros crash).&lt;/p&gt;
&lt;h2 id="vient-alors-hetzner"&gt;Vient alors Hetzner
&lt;/h2&gt;&lt;p&gt;Ça fait pas mal de fois que je voyais circuler le nom. Des bloggeurs et d’autres confrères en disaient beaucoup de bien, et j’ai voulu aller voir. La première chose intéressante est que Hetzner, comme OVH et Online, &lt;a class="link" href="https://wiki.hetzner.de/index.php/Vswitch/en" target="_blank" rel="noopener"
&gt;propose bien un service de type réseau privé virtuel entre vos serveurs&lt;/a&gt; !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner_vswitch.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="plus-de-puissance-chez-hetzner-"&gt;Plus de puissance chez Hetzner !
&lt;/h2&gt;&lt;p&gt;Par contre, quand j’ai vu les machines&amp;hellip; au début je me suis dis que ça allait pas le faire&amp;hellip;&lt;/p&gt;
&lt;p&gt;Voilà leur machine &amp;ldquo;bas de gamme&amp;rdquo; :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour à peine plus que le moins cher des SoYouStart (un vieux Xeon E3 v2 4c/4t avec 16Go de RAM et 2 HDD), vous avez un tout nouveau Ryzen 5 6c/12t, 64 Go de RAM et un RAID de 2 SSD NVMe de 512 Go.&lt;/p&gt;
&lt;p&gt;Bon clairement on était hors budget mais ils avaient piqué ma curiosité avec leurs config fofolles.&lt;/p&gt;
&lt;p&gt;Et je suis donc tombé en fouillant un peu sur leur &amp;ldquo;server auction&amp;rdquo;, qui est ni plus ni moins que les serveurs de leurs anciennes gammes qu’ils louent à nouveau. Et là c’était déjà plus proche de mon besoin.&lt;/p&gt;
&lt;p&gt;Pour un peu plus de 30€/mois soit 50% plus que mon serveur précédent, mais comparable au prix Online, j’ai un i7-4770, 32 Go de RAM et 2 disques &amp;ldquo;Entreprise&amp;rdquo;. Soit beaucoup mieux que la machine chez Online.&lt;/p&gt;
&lt;p&gt;Quitte à changer, j’ai donc tenté Hetzner et commandé un serveur.&lt;/p&gt;
&lt;h2 id="cest-puissant-mais-quest-ce-que-cest-moche"&gt;C’est puissant mais&amp;hellip; qu’est ce que c’est moche
&lt;/h2&gt;&lt;p&gt;Bon, l’UI n’est pas follement attrayante. C’est&amp;hellip; spartiate.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner0-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans le menu &amp;ldquo;Servers&amp;rdquo;, vous avez une bête liste de vos serveurs avec le numéro de commande, un hostname (une fois que vous l’aurez setté) et un ID (peu parlant). Bof pratique, surtout au début ou si vous en avez beaucoup.&lt;/p&gt;
&lt;p&gt;Et quand on sélectionne un serveur, ce n’est malheureusement guère mieux. Les informations importantes éclatées dans un nombre incalculable de menus.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner_rescue.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Bref, côté expérience utilisateur, on repassera. Cependant, tout ce qu’il faut pour bien administrer son serveur est là. On finira par s’y retrouver avec un peu d’habitude&amp;hellip;&lt;/p&gt;
&lt;h2 id="installation-de-lhyperviseur"&gt;Installation de l’hyperviseur
&lt;/h2&gt;&lt;p&gt;Pour installer notre serveur, on peut utiliser l’interface web pour installer un Debian, ou passer par l’image de rescue.&lt;/p&gt;
&lt;p&gt;J’ai préféré utiliser la 2ème solution, car elle est immédiatement disponible à la livraison du serveur, avec votre clé SSH.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner1-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On arrive sur un login on ne peut plus classique, avec un résumé des caractéristiques de vos serveurs.&lt;/p&gt;
&lt;p&gt;Point intéressant, il existe un binaire &lt;em&gt;installimage&lt;/em&gt; sur l’OS rescue de Hetzner. Il permet, comme son nom l’indique, d’installer une image.&lt;/p&gt;
&lt;p&gt;Comme j’utilise Proxmox VE comme hyperviseur, j’ai donc installé une Debian 10 :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner_installimage1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois l’image de base choisie, vous allez arriver à un éditeur de texte. Il va vous permettre de configurer de manière plus fine votre installation. Je trouve cette méthode assez originale. Ça change des interfaces webs pas toujours stables vous demandant la taille de vos partitions pour finalement planter dès que vous demandez un truc non standard.&lt;/p&gt;
&lt;p&gt;Ici tout a très bien marché, j’ai configuré le hostname, ainsi qu’un RAID soft et un partitionnement LVM.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/11/hetzner_installimage3-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Là encore, je suis navré qu’on tombe dans le cliché, mais si ce n’est pas &amp;ldquo;joli&amp;rdquo; ni &amp;ldquo;user friendly&amp;rdquo;, au moins c’est efficace.&lt;/p&gt;
&lt;h2 id="passer-de-debian-10-à-proxmox-ve-6"&gt;Passer de Debian 10 à Proxmox VE 6
&lt;/h2&gt;&lt;p&gt;Une fois validé, l’image Debian 10 a été copié extrêmement rapidement (une ou deux minutes). Forcément, c’est une &amp;ldquo;minimal&amp;rdquo;. Mais bon c’est quand même agréable d’avoir son serveur &amp;ldquo;up and running&amp;rdquo; en moins d’une demie heure entre la commande et la fin de l’installation.&lt;/p&gt;
&lt;p&gt;Reste donc à installer PVE 6 sur notre dédié Hetzner. Sans trop de surprise, j’ai réutilisé mon playbook Ansible qui configure de A à Z la Debian pour en faire un Proxmox. Pour ceux qui l’ont loupé, &lt;a class="link" href="https://blog.zwindler.fr/2019/08/20/cluster-proxmox-ve-v6-cette-fois-ci/" &gt;c’est par ici que ça se passe&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;J’ai juste eu &lt;em&gt;un&lt;/em&gt; petit souci lors de l’installation. La debian étant minimale, je n’avais même pas python d’installé. C’est gênant quand on fait du Ansible !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat inventory_hetzner.yml
all:
children:
proxmoxve:
hosts:
&amp;lt;fqdn_hyperviser&amp;gt;:
ansible proxmoxve -i inventory_hetzner.yml -u root -m ping
&amp;lt;fqdn_hyperviser&amp;gt; | FAILED! =&amp;gt; {
&amp;#34;changed&amp;#34;: false,
&amp;#34;module_stderr&amp;#34;: &amp;#34;Shared connection to &amp;lt;fqdn_hyperviser&amp;gt; closed.\r\n&amp;#34;,
&amp;#34;module_stdout&amp;#34;: &amp;#34;/bin/sh: 1: /usr/bin/python: not found\r\n&amp;#34;,
&amp;#34;msg&amp;#34;: &amp;#34;MODULE FAILURE&amp;#34;,
&amp;#34;rc&amp;#34;: 127
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Heureusement j’avais déjà eu le souci dans un autre contexte. J’ai donc écris un playbook supplémentaire (dispo sur le Github) pour installer les prérequis manquants.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i inventory_hetzner.yml -u root proxmox_python_firstinstall.yml
ansible-playbook -i inventory_hetzner.yml -u root proxmox_prerequisites.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et en quelques minutes, mon Proxmox VE était opérationnel sur Hetzner !&lt;/p&gt;</description></item><item><title>Un cluster Proxmox VE avec seulement 2 machines !</title><link>https://blog.zwindler.fr/2019/10/11/un-cluster-proxmox-ve-avec-seulement-2-machines/</link><pubDate>Fri, 11 Oct 2019 06:40:55 +0000</pubDate><guid>https://blog.zwindler.fr/2019/10/11/un-cluster-proxmox-ve-avec-seulement-2-machines/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/10/proxmox.webp" alt="Featured image of post Un cluster Proxmox VE avec seulement 2 machines !" /&gt;&lt;p&gt;Depuis le temps que je vous parle de clusters et de Proxmox (en gros, &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=proxmox" &gt;depuis 2015&lt;/a&gt;), ou même de clusters tout court, j’ai pu vous en mettre des tartines sur le fait qu’il ne faut pas faire des clusters avec un nombre pair de machines (ou tout autre cas défavorable dans lequel deux moitiés d’un cluster peuvent se retrouver isolées l’une de l’autre). Le split brain, c’est pas bon pour votre Karma, croyez moi sur parole (ou &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=split" &gt;allez voir vous même&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Ça me rappelle la fois où un &amp;ldquo;&amp;ldquo;&amp;ldquo;architecte&amp;rdquo;&amp;rdquo;&amp;rdquo; de chez Datacore était venu nous expliquer que sa solution de stockage à 2 pattes ne POUVAIT PAS avoir de split brain (alors que si, les ingés du support ont du repasser par derrière pour nous dire que &amp;ldquo;oui désolé vous avez évidemment raison c’est un cas possible&amp;rdquo; #LOL).&lt;/p&gt;
&lt;p&gt;Bref, et donc à force d’en parler, il fallait bien quand même que je donne un jour la solution pour le faire quand même, mais proprement. Sans trop de surprise, Corosync, la librairie qui gère les clusters Linux depuis qu’on a arrêté de faire des horreurs avec heartbeat (ou pire : &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=redhat&amp;#43;cluster&amp;#43;suite" &gt;cman+rgmanager, achevez moi&lt;/a&gt;), gère évidemment les deux possibilités :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Gérer soit même le membre prioritaire en cas de split brain avec un poids (ça on va pas en parler mais sachez que c’est possible)&lt;/li&gt;
&lt;li&gt;Ajouter un vote externe pour obtenir un quorum (comme tous les vrais logiciels qui font du clustering un peu sérieux quoi)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="limitations-du-corosync-external-vote-dans-pve"&gt;Limitations du &amp;ldquo;Corosync External Vote&amp;rdquo; dans PVE
&lt;/h2&gt;&lt;p&gt;La petite déception du jour viendra surtout du fait que, si la documentation de Proxmox VE indique clairement que l’option est supportée, en réalité, le support se limite aux fonctions natives de corosync, et encore pas toutes.&lt;/p&gt;
&lt;p&gt;Pas moyen de voir notre vote externe dans l’interface de Proxmox VE par exemple. A priori, le support des quorum disk n’est plus assuré non plus depuis la version 4 de PVE.&lt;/p&gt;
&lt;p&gt;Ensuite, il faut aussi savoir que pour l’instant, seul l’utilisation d’une IP pour renseigner le quorum serveur est possible. On ne peut pas utiliser un FQDN, ce qui me parait dingue comme limitation en 2019, mais bon&amp;hellip;&lt;/p&gt;
&lt;p&gt;Ces deux points mis de côté, vous allez voir, ce n’est pas sorcier. La procédure est en bonne partie détaillée &lt;a class="link" href="https://pve.proxmox.com/wiki/Cluster_Manager#_corosync_external_vote_support" target="_blank" rel="noopener"
&gt;dans la documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Pour ce tutoriel, vous allez donc avoir besoin de 2 machines (a minima), déjà en cluster. Si vous ne les avez pas déjà, je vous invite à regarder &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=proxmox" &gt;les moults tutoriels précédents&lt;/a&gt;, en particulier celui sur &lt;a class="link" href="https://blog.zwindler.fr/2019/08/20/cluster-proxmox-ve-v6-cette-fois-ci/" &gt;la mise en place d’un cluster Proxmox VE 6&lt;/a&gt; (le plus récent).&lt;/p&gt;
&lt;p&gt;Vous allez aussi avoir besoin d’un serveur tiers (un bout de VM ou de container quelque part, en dehors de vos 2 (ou tout autres quantité de machines étant localisées dans 2 endroits distincts dont il existe un risque qu’ils puissent subitement &amp;ldquo;ne plus se voir&amp;rdquo;, d’un point de vue réseau, induisant le fameux split brain tant redouté).&lt;/p&gt;
&lt;p&gt;Fun fact, il y a &lt;a class="link" href="https://pve.proxmox.com/wiki/Raspberry_Pi_as_third_node" target="_blank" rel="noopener"
&gt;une page de wiki pour faire la même chose à la main avec un RPi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Ce serveur tiers n’a pas besoin de faire fonctionner Proxmox (c’est même plutôt mieux d’ailleurs car PVE n’a aucune plus-value ici). Ça doit juste être une distrib linux capable d’installer un démon corosync qnetd. Ce serveur, nous l’appellerons &amp;ldquo;quorum&amp;rdquo;, par abus de langage grossier ;-).&lt;/p&gt;
&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;Sur le serveur quorum, installer corosync qnetd. Sur une Debian like, vous avez de la chance, il existe un package présent dans les dépôts par défaut, et il faut simplement faire un :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt install corosync-qnetd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, sur tous les serveurs Proxmox VE de notre cluster, on va installer le package corosync-qdevice, qui va leur permettre d’interroger le quorum.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt install corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sur le serveur quorum de nouveau, ajouter la clé SSH d’un des serveurs PVE (un seul suffit). Une fois que c’est fait, connecter le cluster au quorum.&lt;/p&gt;
&lt;p&gt;Cela va sans dire, mais faire la commande depuis le serveur dont on vient d’ajouter la clé, pas l’autre hein ;-p. Et remplacez &lt;QDEVICE-IP&gt; par l’IP du serveur quorum !&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvecm qdevice setup &amp;lt;QDEVICE-IP&amp;gt;
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: &amp;#34;/root/.ssh/id_rsa.pub&amp;#34;
The authenticity of host &amp;#39;x.x.x.x&amp;#39; can&amp;#39;t be established.
ECDSA key fingerprint is SHA256:LPaaaaaaaaaaaaaaaaaPZjaIg.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: WARNING: All keys were skipped because they already exist on the remote system.
(if you think this is a mistake, you may want to use -f option)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je met volontairement une grosse partie de la trace car comme ça on peut parler de ce que fait la commande &lt;em&gt;pvecm qdevice setup x.x.x.x&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Comme vous pouvez le constater, cette commande semble assez similaire à celle pour créer manuellement le cluster. A savoir, elle commence déjà par copier les clés SSH sur le serveur distant, histoire que tout le monde puisse discuter ensemble en SSH.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;INFO: initializing qnetd server
Certificate database (/etc/corosync/qnetd/nssdb) already exists. Delete it to initialize new db
INFO: copying CA cert and initializing on all nodes
node &amp;#39;pve01&amp;#39;: Creating /etc/corosync/qdevice/net/nssdb
password file contains no data
node &amp;#39;pve01&amp;#39;: Creating new key and cert db
node &amp;#39;pve01&amp;#39;: Creating new noise file /etc/corosync/qdevice/net/nssdb/noise.txt
node &amp;#39;pve01&amp;#39;: Importing CA
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, on initialise, sur tous les nodes du cluster, le qdevice, qui va permet au node de communiquer avec le quorum. Là j’élude un peu car ça parle beaucoup de certificats et de clés qui sont échangées.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;INFO: copy and import pk12 cert to all nodes&amp;lt;br&amp;gt;INFO: add QDevice to cluster configuration
INFO: start and enable corosync qdevice daemon on node &amp;#39;pve01&amp;#39;...
Synchronizing state of corosync-qdevice.service with SysV service script with /lib/systemd/systemd-sysv-install.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Normalement, si tout se passe bien, vous devriez en arriver là, une fois que tout le monde s’est bien échangé ses certificats, clés et autres joyeusetés crytographiques.&lt;/p&gt;
&lt;p&gt;Une petite commande pour vérifier l’état du bazar :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ pvecm status
Quorum information
------------------
Date: Mon Aug 26 14:49:14 2019
Quorum provider: corosync_votequorum
Nodes: 2
Node ID: 0x00000002
Ring ID: 1/1271796
Quorate: Yes
Votequorum information
----------------------
Expected votes: 3
Highest expected: 3
Total votes: 3
Quorum: 2
Flags: Quorate Qdevice
Membership information
----------------------
Nodeid Votes Qdevice Name
0x00000001 1 A,V,NMW 10.0.0.1
0x00000002 1 A,V,NMW 10.0.0.2 (local)
0x00000000 1 Qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ça, c’est le genre de choses que j’attends d’un logiciel de clustering digne de ce nom. D’une simple commande, on peut avoir&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le nombre de nodes&lt;/li&gt;
&lt;li&gt;l’ID du node courant&lt;/li&gt;
&lt;li&gt;le nombre de votes actuels, attendus, et minimum pour que le cluster soit &amp;ldquo;QUORATE&amp;rdquo;&lt;/li&gt;
&lt;li&gt;et enfin l’état de tout le cluster.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ici, avec 2 nodes + le quorum, on a bien 3 votes. Tant qu’on a 2 votes, on a le quorum, CQFD.&lt;/p&gt;
&lt;p&gt;Dans ce cas de figure, si on perd un nœud OU le quorum, on a toujours 2 votes et le cluster doit continuer à fonctionner &amp;ldquo;normalement&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Et c’est ce qu’on va vérifier !&lt;/p&gt;
&lt;h2 id="on-casse-un-nœud-pour-voir"&gt;On casse un nœud, pour voir
&lt;/h2&gt;&lt;p&gt;Normalement, si on a pas le serveur quorum, tout devrait être brisé (comme dirait Medieval Ops).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/tweet_medieval.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;En gros les VMs doivent continuer à tourner, mais toute opération (démarrage de VM, modification quelconque) doit être bloquée (pour éviter de démarrer la même VM à 2 endroits et pleurer pour recoller les morceaux).&lt;/p&gt;
&lt;p&gt;Or ici dès que l’hôte n’est plus joignable, le nœud survivant le détecte, et comme le quorum ne voit plus lui non plus qu’un seul nœud, indique au dernier qu’il peut continuer sa vie comme si de rien n’était (c’est glauque&amp;hellip;).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ pvecm status
Quorum information
------------------
Date: Thu Aug 29 11:10:31 2019
Quorum provider: corosync_votequorum
Nodes: 2
Node ID: 0x00000002
Ring ID: 1/1271820
Quorate: Yes
Votequorum information
----------------------
Expected votes: 3
Highest expected: 3
Total votes: 2
Quorum: 2
Flags: Quorate Qdevice
Membership information
----------------------
Nodeid Votes Qdevice Name
0x00000002 1 A,V,NMW 10.0.0.2 (local)
0x00000000 1 Qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le nombre de vote passe bien à 2 (mais comme on est toujours égal à quorum c’est bon) et le node 1 a bien disparu :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/08/pve_down_quorate.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et la petite déception, pas de visualisation en console du vote du quorum, malgré la mention &amp;ldquo;Quorate&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Mais bon, c’est quand même cool que ça marche, et en vrai c’est bien l’essentiel ;)&lt;/p&gt;
&lt;h2 id="bonus--erreur-insserv-fatal-service-corosync-has-to-be-enabled"&gt;Bonus : Erreur insserv: FATAL: service corosync has to be enabled
&lt;/h2&gt;&lt;p&gt;Si vous rencontrez l’erreur suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;insserv: FATAL: service corosync has to be enabled to use service corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Allez supprimer le fichier d’init SysV corosync sur tous les hôtes&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;rm /etc/init.d/corosync-qdevice
systemctl enable corosync-qdevice
systemctl start corosync-qdevice
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Source : &lt;a class="link" href="https://forum.proxmox.com/threads/setting-up-qdevice-fails.56061/" target="_blank" rel="noopener"
&gt;https://forum.proxmox.com/threads/setting-up-qdevice-fails.56061/&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Cluster Proxmox VE, v6 cette fois ci !</title><link>https://blog.zwindler.fr/2019/08/20/cluster-proxmox-ve-v6-cette-fois-ci/</link><pubDate>Tue, 20 Aug 2019 11:45:00 +0000</pubDate><guid>https://blog.zwindler.fr/2019/08/20/cluster-proxmox-ve-v6-cette-fois-ci/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/08/cropped-proxmox_ansible.webp" alt="Featured image of post Cluster Proxmox VE, v6 cette fois ci !" /&gt;&lt;h2 id="proxmox-ve"&gt;Proxmox VE
&lt;/h2&gt;&lt;p&gt;Et oui, avec &lt;a class="link" href="https://blog.zwindler.fr/2019/07/16/sortie-de-proxmox-ve-6-0-les-nouveautes/" &gt;la sortie de Proxmox VE 6&lt;/a&gt;, je vous avais prévenu : il va y avoir pas mal d’articles là dessus, même si quelques articles sur Kubernetes sont en cours d’écriture aussi ;-).&lt;/p&gt;
&lt;p&gt;Fin juillet, j’avais écris &lt;a class="link" href="https://blog.zwindler.fr/2019/07/22/proxmox-en-5-min-ansible-tinc/" &gt;un article sur des playbooks Ansible que j’ai écris pour faciliter le déploiement de cluster Proxmox VE&lt;/a&gt;. Malheureusement, comme cet article traînait dans mes brouillons, les playbooks ne géraient pas la version 6 (qui venait de sortir) de PVE.&lt;/p&gt;
&lt;p&gt;C’est aujourd’hui de l’histoire ancienne puisque, pour tester la v6, j’ai forcément du adapter les playbooks ;-).&lt;/p&gt;
&lt;p&gt;Point important, je vais partir du principe que vous n’avez pas la possibilité d’installer Proxmox VE directement avec l’ISO. C’est souvent le cas souvent avec les hébergeurs de serveurs dédiés pas chers (OneProvider par exemple) ou de VMs (OVH, Scaleway, etc).&lt;/p&gt;
&lt;p&gt;Car si vous avez la main, le plus simple est bien sûr d’installer l’ISO directement ! Cependant, ce tuto reste utile pour toute la partie mise en VPN et configuration du cluster.&lt;/p&gt;
&lt;h2 id="les-prérequis"&gt;Les prérequis
&lt;/h2&gt;&lt;p&gt;Dans l’article précédent, pour gagner du temps pour ceux qui veulent juste tester, j’avais mis à disposition un playbook permettant de générer des VMs chez le cloud provider Scaleway (et notamment tirer parti de l’inventaire dynamique proposé par le module développé par Scaleway pour Ansible).&lt;/p&gt;
&lt;p&gt;Ici, je met volontairement de côté cette partie qui n’apporterait rien de plus. Si vous voulez voir comment ça fonctionne je vous invite à &lt;a class="link" href="https://blog.zwindler.fr/2019/07/22/proxmox-en-5-min-ansible-tinc/" &gt;(re)lire l’article précédent&lt;/a&gt;, la procédure est la même.&lt;/p&gt;
&lt;p&gt;Le seul prérequis pour ce tutoriel sont donc d’avoir idéalement 3 machines* (ou plus) sous Debian 10 (la raison pour laquelle je n’avais pas pu le faire avec Scaleway qui ne propose pas encore Debian Buster) accessibles en depuis votre station de travail.&lt;/p&gt;
&lt;p&gt;*Mais si vous voulez juste installer Proxmox, une seule suffit mais vous n’aurez évidemment pas un cluster. A partir de 2, on peut faire un cluster mais il sera instable dès que vous perdrez une seule des 2 machines (ce qui est dommage) à moins d’ajouter un device pour permettre d’avoir le quorum (ce que nous verrons dans un autre article).&lt;/p&gt;
&lt;h2 id="installer-ansible-et-récupérer-les-playbooks"&gt;Installer Ansible et récupérer les playbooks
&lt;/h2&gt;&lt;p&gt;Des fois que n’auriez pas Ansible, installez le (pour git, c’est juste plus simple de cloner le dépôt mais vous pouvez le télécharger autrement si vous ne voulez pas installer git)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt-get install git ansible
git clone https://github.com/zwindler/ansible-proxmoxve
cd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, on créé un fichier d’inventaire pour Ansible (ce qui n’étais pas nécessaire avec Scaleway puisque, je le rappelle, il y a un module d’inventaire dynamique). Ici on se contente juste de lister les serveurs qui nous intéressent.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat pve_inventory.yml
all:
children:
proxmoxve:
hosts:
proxmox1.myexample.org:
proxmox2.myexample.org:
proxmox3.myexample.org:
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous ne reconnaissez peut être pas le format de cet inventaire Ansible. En effet, l’inventaire est ici stocké au format YAML et non au format plat. Très peu de gens utilisent ce format (qui existait au début, puis a été retiré pour être de nouveau supporté depuis la 2.4 je crois).&lt;/p&gt;
&lt;p&gt;Étant habitué aux inventaires parfois un peu hétéroclites, je préfère largement ce format YAML, qui permet de rajouter de manière beaucoup plus lisibles des variables à des groupes ou mêmes des hôtes directement (sans passer par une arborescence complète avec groups_vars et hosts_vars). De plus, je trouve les dépendances entre groupes plus claires que lorsque nous avions à déclarer les :children du groupe père (mais c’est subjectif).&lt;/p&gt;
&lt;p&gt;Notez par contre qu’il faut :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;que mes hôtes soient résolvables par DNS (sinon il faut ajouter une variable ansible_host avec l’IP pour chacun)&lt;/li&gt;
&lt;li&gt;que vous n’oubliez surtout par le &amp;ldquo;:&amp;rdquo; à la fin de chaque hostname, sans quoi vous aurez une erreur de syntaxe.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="lancer-le-playbook-dinstallation-de-proxmox-ve-6"&gt;Lancer le playbook d’installation de Proxmox VE 6
&lt;/h2&gt;&lt;p&gt;Nous y voilà. Normalement vous pouvez accéder en SSH à l’ensemble de vos machines. Pour installer Proxmox VE 6 sur une debian 10, il faut donc simplement lancer la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i pve_inventory.yml proxmox_prerequisites.yml -u root
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Normalement, le playbook vous promptera pour répondre à quelques questions basiques (votre domaine, est ce que les machines commencent par test plutôt que proxmox dans le hostname, &amp;hellip;) et à l’issue, un reboot sera effectué (pour basculer sur le noyau Linux de PVE et pas celui de debian Buster).&lt;/p&gt;
&lt;h2 id="mise-en-réseau-privé-virtuel-avec-tinc"&gt;Mise en réseau privé virtuel avec Tinc
&lt;/h2&gt;&lt;p&gt;Cette étape n’est pas forcément nécessaire. Si vous travaillez sur des machines qui sont dans un même réseau local, il vaut mieux s’en passer.&lt;/p&gt;
&lt;p&gt;En revanche, dans le cas où comme moi vous louez des serveurs chez un provider et qu’il ne vous met pas à disposition un moyen de simuler un réseau privé (RPN chez Online, Rack quelque chose chez OVH je crois), il sera préférable de monter un VPN entre les différentes machines du cluster.&lt;/p&gt;
&lt;p&gt;Je dis préférable et pas nécessaire, &lt;a class="link" href="https://blog.zwindler.fr/2019/07/16/sortie-de-proxmox-ve-6-0-les-nouveautes/" &gt;car jusqu’à la version 6 de Proxmox (et Corosync v3), il était nécessaire également de faire passer du multicast&lt;/a&gt; entre les machines pour faire fonctionner le cluster. Ce n’est aujourd’hui plus le cas et on peut donc très bien imaginer un cluster Proxmox avec des machines sur des LAN distincts. Cependant, pour activer des fonctionnalités comme Ceph (et probablement d’autre), il est toujours nécessaire d’avoir un LAN.&lt;/p&gt;
&lt;p&gt;Pour se faire, j’utilise Tinc plutôt qu’OpenVPN, qui a l’avantage d’être simple à configurer et surtout multipoint (pas de notion de serveur maitre et de clients connectés dessus). Ce n’est pas le cas avec OpenVPN, dont la structure client/serveur complexifie beaucoup l’implémentation si on veut éviter un SPOF (en gros il faut un serveur sur toutes les machines, et que l’ensemble des serveurs soient tous clients les uns des autres, en toile d’araignée). Vous pouvez &lt;a class="link" href="https://blog.zwindler.fr/2017/08/29/faire-un-petit-cluster-proxmox-avec-2-machines-kimsufi/" &gt;quand même jeter un oeil sur mes premières tentatives ici&lt;/a&gt;, si ça vous intéresse.&lt;/p&gt;
&lt;p&gt;Comme j’automatise tout avec Ansible, j’ai donc aussi créé un playbook qui permet d’installer et configurer Tinc sur toutes nos machines et de les mettre en réseau sur un VPN dédié.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i pve_inventory.yml tinc_installation.yml -u root
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, vous avez donc 3 machines Proxmox VE 6, connectés ensembles sur un VPN avec l’adresse 10.10.10.0/24&lt;/p&gt;
&lt;h2 id="le-réseau-cest-compliqué-"&gt;Le réseau c’est compliqué ?
&lt;/h2&gt;&lt;p&gt;Un point pas forcément évident avec Proxmox est que la configuration du réseau dépend beaucoup de comment vos machines sont connectées en réseau.&lt;/p&gt;
&lt;p&gt;Les différentes configurations conseillées sont détaillées &lt;a class="link" href="https://pve.proxmox.com/wiki/Network_Configuration" target="_blank" rel="noopener"
&gt;dans un article dédié sur le wiki de Proxmox&lt;/a&gt;. J’aurais vraiment aimé connaître cette page lorsque M4vr0x et moi avons fait nos premières expériences avec PVE car nous avons beaucoup tâtonné&amp;hellip;&lt;/p&gt;
&lt;p&gt;Dans mon cas précis, j’ai des machines hostées par un provider. Je n’ai donc aucunement la main sur le réseau et je ne souhaite pas acheter d’IP supplémentaires.&lt;/p&gt;
&lt;p&gt;Dans ce cas là, le plus simple est donc de créer un bridge Linux, qui portera un réseau virtuel interne à chaque serveur et dont le trafic externe sera routé.&lt;/p&gt;
&lt;p&gt;L’inconvénient de cette solution est qu’on ne peut pas utiliser l’interface graphique pour faire ces modifications, et aussi qu’en cas d’erreur, vous n’aurez plus accès à votre serveur&amp;hellip;&lt;/p&gt;
&lt;h2 id="configuration-réseau-pour-des-machines-dédiées-chez-un-provider-type-oneprovider"&gt;Configuration réseau pour des machines dédiées chez un Provider type OneProvider
&lt;/h2&gt;&lt;p&gt;Nous voilà donc dans les premières bidouilles manuelles. Connectez vous en SSH à votre (vos) serveurs, et modifier le fichier /etc/network/interfaces.&lt;/p&gt;
&lt;p&gt;Je me suis basé sur la section &lt;a class="link" href="https://pve.proxmox.com/wiki/Network_Configuration#_masquerading_nat_with_tt_span_class_monospaced_iptables_span_tt" target="_blank" rel="noopener"
&gt;&amp;ldquo;Masquerading (NAT) with iptables&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Le mien ressemble à ça :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
auto eth0
#real IP address
iface eth0 inet static
address x.x.x.x
netmask 24
gateway x.x x.1
auto vmbr0
iface vmbr0 inet static
address 192.168.0.1
netmask 255.255.255.0
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 &amp;gt; /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s &amp;#39;192.168.0.0/24&amp;#39; -o eth0 -j MASQUERADE
post-down iptables -t nat -D POSTROUTING -s &amp;#39;192.168.0.0/24&amp;#39; -o eth0 -j MASQUERADE
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le plus important ici pour que tout fonctionne est que vous ne vous trompiez pas sur le nom de l’interface réseau (eth0 dans mon exemple).&lt;/p&gt;
&lt;p&gt;Ensuite, une fois que les modifications sont faites, redémarrez le réseau (&lt;em&gt;systemctl restart networking&lt;/em&gt;) ou carrément le serveur (c’est ce que Proxmox conseille, même si je ne vois pas bien l’intérêt).&lt;/p&gt;
&lt;p&gt;Ici, la configuration est beaucoup plus simple que ce que nous avions imaginé &lt;a class="link" href="https://blog.zwindler.fr/2017/07/18/deploiement-de-proxmox-ve-5-sur-un-serveur-dedie-part-2/" &gt;avec M4vr0x dans la série d’articles détaillés sur PVE 5&lt;/a&gt;. Et c’est tant mieux car ça suffira amplement à la plupart d’entre vous ;-).&lt;/p&gt;
&lt;h2 id="configuration-du-cluster-proxmox-ve"&gt;Configuration du cluster Proxmox VE
&lt;/h2&gt;&lt;p&gt;Ok ! Maintenant tous les prérequis sont en place, on peut donc construire le cluster. Le wizard de la GUI a assez peu évolué depuis la V5 (même s’il y a quelques petites améliorations)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Vous vous connectez sur une des machines&lt;/li&gt;
&lt;li&gt;Dans la vue Datacenter, vous sélectionnez Create Cluster, puis vous copiez les informations de connexion pour les autres serveurs.&lt;/li&gt;
&lt;li&gt;Sur les autres serveurs, vous rejoignez le cluster en collant les informations des&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;(Plus de détails dans l’article précédent)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/08/proxmox_ve_6_create_cluster.avif"
loading="lazy"
&gt;&lt;/p&gt;</description></item><item><title>Suivez le lapin Orange – Intro et bonnes pratiques d’infra RabbitMQ</title><link>https://blog.zwindler.fr/2019/04/16/suivez-le-lapin-orange-intro-et-bonnes-pratiques-dinfra-rabbitmq/</link><pubDate>Tue, 16 Apr 2019 11:45:07 +0000</pubDate><guid>https://blog.zwindler.fr/2019/04/16/suivez-le-lapin-orange-intro-et-bonnes-pratiques-dinfra-rabbitmq/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/04/rabbitmq_logo2.webp" alt="Featured image of post Suivez le lapin Orange – Intro et bonnes pratiques d’infra RabbitMQ" /&gt;&lt;h2 id="cest-quoi-rabbitmq-"&gt;C’est quoi RabbitMQ ?
&lt;/h2&gt;&lt;p&gt;&lt;a class="link" href="https://www.rabbitmq.com/" target="_blank" rel="noopener"
&gt;RabbitMQ&lt;/a&gt;® est un logiciel open source, développé par Pivotal. Il s’agit d’un message broker (bus/agent de messages), très simple à mettre en place, multiplateforme et multiprotocole (AMQP, MQTT, STOMP).&lt;/p&gt;
&lt;p&gt;RabbitMQ est donc particulièrement adapté pour monter rapidement une architecture microservice, &lt;strong&gt;voire même IoT&lt;/strong&gt;, nécessitant un bus de message pour garantir les communications entre les différentes briques de cette architecture.&lt;/p&gt;
&lt;p&gt;C’est justement dans mon contexte pro : nous disposons d’une architecture logicielle aux composantes très différentes (microservices, machines outils connectées, &amp;hellip;). Nous avons donc besoin de cette agilité, qu’on ne retrouve pas forcément dans les autres messages brokers, mais aussi de garanties et des contrôles sur les transports des messages que nous n’aurions pas forcément avec des API REST.&lt;/p&gt;
&lt;h2 id="architecture-et-bonnes-pratiques"&gt;Architecture et bonnes pratiques
&lt;/h2&gt;&lt;p&gt;Voici à quoi ressemble l’architecture RabbitMQ que nous utilisons :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/04/RabbitMQ_archi.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A première vue, c’est assez simple. Mais si vous vous demandez si nous n’aurions pas pu faire encore plus simple, alors cet article est fait pour vous ;).&lt;/p&gt;
&lt;h2 id="amqps--webmqtts"&gt;AMQP&lt;u&gt;S&lt;/u&gt; / WebMQTT&lt;u&gt;S&lt;/u&gt;
&lt;/h2&gt;&lt;p&gt;Les plus observateurs d’entre vous auront peut être remarqués le « S » à la fin des deux protocoles que nous utilisons pour faire communiquer nos services entre eux :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AMQP / AMQPS&lt;/li&gt;
&lt;li&gt;WebMQTT / WebMQTTS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous l’aurez sûrement deviné, il s’agit de la déclinaison non-sécurisée/sécurisée (chiffrée) de chacun de ces protocoles.&lt;/p&gt;
&lt;p&gt;Par défaut dans RabbitMQ, les échanges ne sont pas chiffrés. Bien qu’il n’y ait pas de réponse universelle à la question « dois-je chiffrer l’ensemble de mes flux ? », l’Ops que je suis ne peux pas s&amp;rsquo;empêcher de répondre un grand &lt;strong&gt;OUI&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;C’est particulièrement vrai dans notre cas, où une partie des flux transite par Internet, et l’autre transite à l’intérieur du réseau de notre cloud provider. L’ajout du chiffrement est &lt;em&gt;obligatoire&lt;/em&gt;. Le risque d’espionnage, de détournement d’information, de Man in the Middle, sont suffisamment sérieux pour qu’on prenne le temps de configurer un chiffrement TLS.&lt;br&gt;
Cependant, l’impact sur les performances globales de la plateforme est réel et devra être pris en compte lors du choix de l’architecture.&lt;/p&gt;
&lt;h2 id="comment-activer-le-chiffrement-tls-sur-mes-interfaces-rabbitmq-"&gt;Comment activer le chiffrement TLS sur mes interfaces RabbitMQ ?
&lt;/h2&gt;&lt;p&gt;Tout se passe dans les fichiers de configuration. Il faudra déposer les fichiers de certificats (CA, certificat public et clé privée) et rajouter les lignes suivantes dans votre configuration :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[
{rabbit, [{ssl_options, [{cacertfile, /path/to/testca/cacert.pem&amp;#34;},
{certfile, /path/to/server_certificate.pem&amp;#34;},
{keyfile, /path/to/server_key.pem&amp;#34;},
{verify, verify_peer},
{fail_if_no_peer_cert, true}]}]}
].
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cependant, là aussi par défaut, il n’y a pas de restrictions sur les protocoles disponibles. Or, les failles sur SSL et TLS 1.0 de ces dernières années nous obligent à désactiver ces protocoles obsolètes (voire même TLS 1.1 aussi), ainsi que tous les ciphers non sécurisés, ce qui va nettement complexifier notre configuration :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;%% -*- mode: erlang -*-
[
{ssl, [
{versions, [&amp;#39;tlsv1.2&amp;#39;]}
]},
{rabbit, [
{ssl_listeners, [5672]},
{ssl_options, [
{cacertfile, /etc/rabbitmq/certs/cacert.pem&amp;#34;},
{certfile, /etc/rabbitmq/certs/cert.pem&amp;#34;},
{keyfile, /etc/rabbitmq/certs/key.pem&amp;#34;},
{versions, [&amp;#39;tlsv1.2&amp;#39;]},
{ciphers, [
{ecdhe_ecdsa,aes_256_gcm,null,sha384},
{ecdhe_rsa,aes_256_gcm,null,sha384},
{ecdhe_ecdsa,aes_256_cbc,sha384,sha384},
{ecdhe_rsa,aes_256_cbc,sha384,sha384},
{ecdh_ecdsa,aes_256_gcm,null,sha384},
{ecdh_rsa,aes_256_gcm,null,sha384},
{ecdh_ecdsa,aes_256_cbc,sha384,sha384},
{ecdh_rsa,aes_256_cbc,sha384,sha384},
{dhe_rsa,aes_256_gcm,null,sha384},
{dhe_dss,aes_256_gcm,null,sha384},
{dhe_rsa,aes_256_cbc,sha256},
{dhe_dss,aes_256_cbc,sha256}
]},
{verify, verify_peer},
{fail_if_no_peer_cert, false}]}
]}
].
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A noter, depuis la version 3.7 de RabbitMQ (dernière version en date, la 3.8 sort bientôt), le format de la configuration a changé (erlang =&amp;gt; sysctl) pour être plus lisible et plus simple à automatiser. Cependant, à ma connaissance, il n’est pas possible de configurer l’ensemble des limitations de ciphers/protocoles.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;« While the new config format is more convenient for humans to edit and machines to generate, it is also relatively limited compared to the classic config format used prior to RabbitMQ 3.7.0. »&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="et-pourquoi-3-nœuds-et-pas-juste-un-au-milieu-"&gt;Et pourquoi 3 nœuds et pas juste un, au milieu ?
&lt;/h2&gt;&lt;p&gt;Cette question est volontairement provocatrice ;-p.&lt;/p&gt;
&lt;p&gt;Comme tout service informatique, les objectifs en terme d’indisponibilités tendent forcément vers 0. Un moyen classique d’approcher cet objectif est de redonder les composants informatiques, pour éviter tout &lt;em&gt;Single Point of Failure&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ça tombe très bien, puisque RabbitMQ propose nativement un mécanisme de clustering. Et comme dans tout cluster disposant d’un mécanisme de vote/d’élection, il est fortement conseillé d’avoir un nombre impair de nodes pour résoudre les cas de split brain (la majorité l&amp;rsquo;emporte en cas de partition réseau). D’où les 3 nœuds (mais on peut en avoir 5, 7, &amp;hellip;).&lt;/p&gt;
&lt;h2 id="le-clustering-dans-rabbitmq-comment-ça-marche-"&gt;Le clustering dans RabbitMQ, comment ça marche ?
&lt;/h2&gt;&lt;p&gt;Pour simplifier notre vie, le cluster RabbitMQ agit de telle sorte que tous les objets logiques (utilisateurs, queues, &amp;hellip;), où qu’ils soient, sont &lt;em&gt;connus&lt;/em&gt; et &lt;em&gt;adressables&lt;/em&gt; depuis tous les membres (attention, je n’ai pas dis &lt;em&gt;répliqués&lt;/em&gt;, on y reviendra).&lt;/p&gt;
&lt;p&gt;Ça, c’est super pratique. Quel que soit le nœud qu’on va contacter, si la queue est présente sur un autre serveur RabbitMQ, le message sera redistribué de manière transparente vers le nœud qui possède la queue.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2019/04/rabbitmq_cluster_redirect8229614691310308292.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour « masquer » la complexité induite par l’ajout de serveurs RabbitMQ supplémentaires, on a donc juste à ajouter un loadbalancer en amont du cluster. Le développeur envoie simplement le message au loadbalancer. Peu importe le nœud sur lequel le message sera réellement envoyé ensuite, il sera transféré instantanément.&lt;/p&gt;
&lt;h2 id="comment-démarrer-un-cluster-"&gt;Comment démarrer un cluster ?
&lt;/h2&gt;&lt;p&gt;Sans rentrer dans le détail de toutes les opérations nécessaires pour bootstrapper un cluster, ce qu’il faut savoir c’est que tous les nœuds doivent évidemment pouvoir se contacter et si possible être relativement &lt;em&gt;proches&lt;/em&gt; (en terme de latence).&lt;/p&gt;
&lt;p&gt;Les serveurs RabbitMQ doivent être configurés de manière à partager une même passphrase dans le fichier &lt;em&gt;/var/lib/rabbitmq/.erlang.cookie&lt;/em&gt;, et on doit ensuite joindre un des noeuds depuis les deux autres avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#sur le node rabbit2, puis rabbit3
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@rabbit1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;la documentation qui est très bien écrite.&lt;/p&gt;
&lt;h2 id="maintenant-on-est-hautement-disponibles-"&gt;Maintenant, on est hautement disponibles ?
&lt;/h2&gt;&lt;p&gt;Vous vous dites : « Chouette ! J’ai un cluster ! Je suis hautement disponible ! »&lt;/p&gt;
&lt;p&gt;Et bien&amp;hellip; non.&lt;/p&gt;
&lt;p&gt;Un point pouvant induire une grande confusion dans RabbitMQ est la terminologie « cluster RabbitMQ ». Le fait de monter un cluster laisse penser que tout devient automatiquement hautement disponible.&lt;/p&gt;
&lt;p&gt;Or, en réalité, comme je l’ai écris plus haut, il s’agit uniquement de rendre &lt;em&gt;accessible&lt;/em&gt; et &lt;em&gt;addressable&lt;/em&gt; l’ensemble des objets logiques depuis tous les nœuds. En revanche, les queues, et a fortiori leur contenu, ne sont physiquement présentes que &lt;em&gt;sur un nœud et un seul&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ainsi, si un nœud du cluster disparaît, toutes les queues qu’il possède seront détruites (si elles sont Transient), ou bloquées jusqu’à ce que le nœud soit de nouveau disponible (si elles sont Durable).&lt;/p&gt;
&lt;p&gt;Dans tous les cas, il y aura interruption de service et éventuellement perte de messages, malgré le fait qu’on ait un cluster !&lt;/p&gt;
&lt;h2 id="haute-disponibilité-des-queues"&gt;Haute disponibilité des queues
&lt;/h2&gt;&lt;p&gt;Heureusement, il est également possible de répliquer les queues et leur contenu sur une partie ou la totalité des nœuds disponibles dans le cluster. On dispose alors d’une queue principale et de miroirs qui pourront prendre le relai en cas de défaillance d’un nœud.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/04/rabbitmq_master_relocate.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ceci est configurable, par queue ou par policy (applicable à toutes les queues correspondant au pattern), avec les options &lt;em&gt;ha-mode&lt;/em&gt;, &lt;em&gt;ha-params&lt;/em&gt; et &lt;em&gt;ha-sync-mode&lt;/em&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ha-mode&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;all&lt;/strong&gt; : synchronisera votre queue sur des miroirs présents sur tous les nœuds du cluster&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;exactly&lt;/strong&gt; : permettra d’indiquer, en positionnant également un nombre sur &lt;strong&gt;ha-params&lt;/strong&gt;, le nombre exact de nœuds sur lesquels les queues sont répliquées&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;nodes&lt;/strong&gt; : synchronisera des miroirs sur une liste de nœuds explicitement nommés&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ha-sync-mode&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;automatic&lt;/strong&gt; : en cas d’apparition d’un nouveau miroir, tous les messages sont synchronisés immédiatement&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;manual&lt;/strong&gt; : en cas d’ajout d’un nouveau miroir, seul les nouveaux messages sont synchronisés&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Attention au mode &lt;strong&gt;automatic&lt;/strong&gt;, surtout en conjugaison avec le &lt;strong&gt;ha-mode&lt;/strong&gt; à &lt;strong&gt;all&lt;/strong&gt;. En effet, si ce mode est plus sécurisé puisqu’il garantie que tous les nœuds ont bien la totalité des messages, il a aussi l’inconvénient de bloquer les queues « à synchroniser » (tant que l’ensemble des messages ne sont pas répliqués partout).&lt;br&gt;
Dernier point d’attention, au même titre que le chiffrement, l’ajout de la haute disponibilité (et du clustering, dans une moindre mesure) a un impact sur les performances globales de la plateforme.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;RabbitMQ est un outil puissant et extrêmement simple à mettre en place. On peut le lancer et obtenir un broker de message robuste avec une simple commande « docker run ».&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;docker run -d --hostname my-rabbit --name some-rabbit rabbitmq:3
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour autant, dans un environnement de production avec des objectifs en terme de haute disponibilité, il n’est pas si trivial de trouver les bons paramètres. Certains nécessiteront un peu de recherche et de configuration &lt;strong&gt;erlang&lt;/strong&gt;, d’autres nécessiteront un peu de benchmarking et de tuning, si les performances commencent à devenir un problème.&lt;/p&gt;
&lt;p&gt;Pour cette seconde catégorie, j’y reviendrai dans un autre article. Cependant, sachez quand même qu’on peut traiter sans trop de difficulté des milliers de messages par secondes, même avec des machines disposant de peu de CPU. Vous aurez surement le temps de voir venir ;).&lt;/p&gt;</description></item></channel></rss>