<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>ARM on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/arm/</link><description>Recent content in ARM on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 13 Jun 2022 08:00:00 +0200</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/arm/index.xml" rel="self" type="application/rss+xml"/><item><title>QNAP débranche LXC sur les NAS ARM : comment contourner ?</title><link>https://blog.zwindler.fr/2022/06/13/qnap-debranche-lxc-workaround/</link><pubDate>Mon, 13 Jun 2022 08:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2022/06/13/qnap-debranche-lxc-workaround/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/01/qnap22.webp" alt="Featured image of post QNAP débranche LXC sur les NAS ARM : comment contourner ?" /&gt;&lt;p&gt;Si vous le suivez sur Twitter ou Masto, vous m&amp;rsquo;avez très probablement lu râler contre la sortie &lt;del&gt;de QTS 5&lt;/del&gt; Container Station v2.4.0.2316, l&amp;rsquo;été dernier.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://preview.redd.it/6bouewrhnze71.png?width=1283&amp;amp;format=png&amp;amp;auto=webp&amp;amp;s=11aacee53bf931b47d1534cc1478b47aa7239701"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ou plus particulièrement, contre une décision prise lors de ce passage : enlever LXC pour l&amp;rsquo;administration des containers, au profit de LXD. LXD étant juste une couche d&amp;rsquo;administration, LXC est toujours présent et fonctionnel, juste caché.&lt;/p&gt;
&lt;p&gt;Pourquoi je râle ?&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai un &lt;a class="link" href="https://blog.zwindler.fr/2018/01/23/stockage-pour-un-admin-geek-qnap-ts431p2-ou-synology-ds418j" &gt;NAS QNAP TS431P2 depuis 2018 dont je suis pleinement satisfait&lt;/a&gt;, et qui m&amp;rsquo;a permis de passer moins de temps à administrer et ajouter des fonctionnalités à mon NAS ZFS maison, monté initialement en 2011 (merci &lt;em&gt;Dworak_of_sky&lt;/em&gt; pour les souvenirs).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2011/06/29/nasmediacenter-do-it-yourself-or-not/" &gt;NAS/MediaCenter : Do It (the hardware part) Yourself!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2011/08/04/nasmediacenter-do-it-the-software-part-yourself/" &gt;NAS/MediaCenter : Do It (the software part) Yourself!&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Sauf&lt;/strong&gt; que mon QNAP est un NAS milieu de gamme, fonctionnant avec &lt;em&gt;un processeur ARM&lt;/em&gt; et pas x86 ! Et ces charmantes personnes (grrrr) de chez QNAP &lt;strong&gt;n&amp;rsquo;ont pas porté LXD sur les NAS ARM&lt;/strong&gt; (segmentation artificielle de l&amp;rsquo;offre ? Flemme ?).&lt;/p&gt;
&lt;p&gt;Nous, propriétaires de NAS QNAP ARM, nous retrouvons donc sans solution puisque LXC est désactivé et LXD pas disponible.&lt;/p&gt;
&lt;p&gt;Une fonction hyper pratique pour héberger de petits services à bas coût (autant en performance qu&amp;rsquo;en prix) disparaît. C&amp;rsquo;était un réel différenciant pour ce modèle et je me sens vraiment trahi (ou alors c&amp;rsquo;est ma faute, car je n&amp;rsquo;aurais pas dû leur faire confiance ?).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/06/trahison.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Je ne suis pas près de recommander QNAP comme j&amp;rsquo;ai pu le faire par le passé. #PasContent&lt;/p&gt;
&lt;h2 id="nuance"&gt;Nuance
&lt;/h2&gt;&lt;p&gt;HEUREUSEMENT, les containers LXC ne se sont pas mis à ne plus marcher du jour au lendemain.&lt;/p&gt;
&lt;p&gt;Enfin, encore heureux ! Je n&amp;rsquo;ose imaginer les dégâts en prod !&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est d&amp;rsquo;autant plus vicelard que le message d&amp;rsquo;information pour expliquer qu&amp;rsquo;il n&amp;rsquo;y a plus LXC indique que c&amp;rsquo;est pas grave puisque vous avez LXD à la place. Aucune mention du fait qu&amp;rsquo;en fait, sous ARM, non&amp;hellip;&lt;/p&gt;
&lt;p&gt;Il est toujours possible (&lt;strong&gt;pour l&amp;rsquo;instant&lt;/strong&gt;) de démarrer, arrêter, utiliser et supprimer les containers existants. Mais il n&amp;rsquo;est plus possible d&amp;rsquo;en créer de nouveaux.&lt;/p&gt;
&lt;p&gt;Ça veut donc dire que tout est encore présent pour faire fonctionner la fonctionnalité, ce n&amp;rsquo;est &amp;ldquo;juste&amp;rdquo; plus disponible en UI.&lt;/p&gt;
&lt;h2 id="en-avoir-le-coeur-net"&gt;En avoir le coeur net
&lt;/h2&gt;&lt;p&gt;En farfouillant, je me suis aussi rendu compte qu&amp;rsquo;il était toujours possible d&amp;rsquo;&lt;strong&gt;exporter&lt;/strong&gt; des containers existants et d&amp;rsquo;&lt;strong&gt;importer&lt;/strong&gt; les exports.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/06/qnap_export.avif"
loading="lazy"
&gt;
&lt;img src="https://blog.zwindler.fr/2022/06/qnap_import.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On peut donc contourner la limitation arbitraire de QNAP via des export / import. J&amp;rsquo;ai l&amp;rsquo;habitude de ce genre de bidouilles, &lt;a class="link" href="https://blog.zwindler.fr/2011/03/20/copier-une-vm-windows-xp-sous-esxi-sans-vcenter/" target="_blank" rel="noopener"
&gt;puisque je faisais déjà ça il y a plus de 10 ans avec les hyperviseurs VMware en licence gratuite&lt;/a&gt;&amp;hellip;&lt;/p&gt;
&lt;p&gt;A l&amp;rsquo;usage, ça fonctionne mais c&amp;rsquo;est pas satisfaisant. D&amp;rsquo;abord parce que si on a pas, ou plus, de containers sur le NAS, on ne peut pas le faire trivialement.&lt;/p&gt;
&lt;p&gt;Ensuite, parce que le processus et long (l&amp;rsquo;export et l&amp;rsquo;import) et pénible (plusieurs étapes).&lt;/p&gt;
&lt;p&gt;Enfin, parce que les images LXC mises à disposition par QNAP étaient antédiluviennes !&lt;/p&gt;
&lt;p&gt;Ubuntu 14.04 !!! Sauf si vous avez pris le temps de faire le processus d&amp;rsquo;upgrade complet de 14.04 à 20.04 ou 22.04 (et vous devriez), il est probable que vous n&amp;rsquo;ayez pas envie de repartir de ces vieux machins.&lt;/p&gt;
&lt;h2 id="faites-mieux"&gt;&amp;ldquo;Faites mieux&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Si vous êtes admin, vous avez probablement déjà activé SSH pour vous connecter directement à l&amp;rsquo;OS de votre NAS. (&lt;a class="link" href="https://www.qnap.com/fr-fr/how-to/knowledge-base/article/how-to-access-qnap-nas-by-ssh" target="_blank" rel="noopener"
&gt;Et sinon vous pouvez aller ici pour l&amp;rsquo;activer&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Une fois connecté, on peut sortir du menu TUI et bidouiller l&amp;rsquo;OS comme on en a envie.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/06/qnap_ssh_admin.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[~] # id
uid=0(admin) gid=0(administrators)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je n&amp;rsquo;ai pas fait beaucoup d&amp;rsquo;administration LXC/LXD directement, car j&amp;rsquo;avais toujours une interface à ma disposition pour me &amp;ldquo;cacher&amp;rdquo; la façon dont ça fonctionne vraiment, que ce soit dans le cas de QNAP ou de &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=lxc" target="_blank" rel="noopener"
&gt;Proxmox VE (que j&amp;rsquo;utilise beaucoup pour ça)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;En lisant rapidement &lt;a class="link" href="https://doc.ubuntu-fr.org/lxc" target="_blank" rel="noopener"
&gt;la doc sur ubuntu-fr&lt;/a&gt;, j&amp;rsquo;ai compris qu&amp;rsquo;il existait en fait chez Canonical un genre de dépôt d&amp;rsquo;images officielles de pleins d&amp;rsquo;OS, notamment compatible &lt;strong&gt;armhf&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://images.lxd.canonical.com/" target="_blank" rel="noopener"
&gt;images.lxd.canonical.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="http://images.linuxcontainers.org//meta/1.0/index-system" target="_blank" rel="noopener"
&gt;images.linuxcontainers.org//meta/1.0/index-system&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Avec LXC, on peut accéder directement à ces images en ligne de commande avec &lt;code&gt;lxc-download&lt;/code&gt;. Pas de bol, la commande n&amp;rsquo;est pas dispo sur QTS :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;[~] # lxc-download
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;-sh: lxc-download: command not found
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(En fait elle n&amp;rsquo;est juste pas dans le PATH, mais je ne le savais pas à ce moment-là)&lt;/p&gt;
&lt;p&gt;Sauf qu&amp;rsquo;on peut aussi appeler directement la commande pour créer des containers &lt;code&gt;lxc-create&lt;/code&gt; avec un flag &amp;ldquo;download&amp;rdquo;. Et ça tombe bien parce que &lt;code&gt;lxc-create&lt;/code&gt; est disponible. Mais la joie sera de courte durée&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;lxc-create -t download -n container_jammy -- -d ubuntu -r jammy -a armhf
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;/usr/local/container-station/lxc/share/lxc/templates/lxc-download: line 237: getopt: command not found
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="hack"&gt;Hack&amp;hellip;
&lt;/h2&gt;&lt;p&gt;Note : si vous trouviez que ce qu&amp;rsquo;on était en train de faire n&amp;rsquo;était déjà pas très propre, je tiens à vous prévenir, la suite est vraiment immonde&amp;hellip; Pas merci QNAP de me forcer à faire ça !&lt;/p&gt;
&lt;p&gt;Le script &lt;code&gt;/usr/local/container-station/lxc/share/lxc/templates/lxc-download&lt;/code&gt; est moisi. Il manque la moitié des binaires dans la busybox.&lt;/p&gt;
&lt;p&gt;Pire encore, la procédure que je donne ici semble être écrasée à chaque mise à jour de l&amp;rsquo;application &lt;strong&gt;Container Station&lt;/strong&gt;. Mais, ça fonctionne&amp;hellip;&lt;/p&gt;
&lt;p&gt;La première chose qu&amp;rsquo;on va faire, c&amp;rsquo;est faire une sauvegarde du script &lt;code&gt;lxc-download&lt;/code&gt; par sécurité.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;cp /usr/local/container-station/lxc/share/lxc/templates/lxc-download{,.old}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Le premier message d&amp;rsquo;erreur qu&amp;rsquo;on a &lt;code&gt;getopt: command not found&lt;/code&gt; indique juste que de nombreux binaires &amp;ldquo;classiques&amp;rdquo; ne sont pas disponibles directement dans le shell de QTS.&lt;/p&gt;
&lt;p&gt;Sauf qu&amp;rsquo;en fait, ils sont là, ces binaires. Pas besoin de les télécharger ou de les compiler. Ils ne sont juste &amp;ldquo;pas visibles&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;QTS tourne, comme beaucoup de serveurs Linux minimalistes, avec &lt;a class="link" href="https://fr.wikipedia.org/wiki/BusyBox" target="_blank" rel="noopener"
&gt;l&amp;rsquo;aide de Busybox&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On peut donc &amp;ldquo;magiquement activer&amp;rdquo; les binaires qui nous manquent simplement avec des liens symboliques.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;for binary in getopt xz seq; do
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt; ln -s /share/CACHEDEV1_DATA/.qpkg/container-station/bin/busybox /share/CACHEDEV1_DATA/.qpkg/container-station/bin/${binary}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;done
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="err"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;getopt
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;getopt: missing optstring argument
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="-and-slash"&gt;&amp;hellip; and slash!
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;C&amp;rsquo;est bon, mais pas suffisant.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;La version du binaire &lt;code&gt;mktemp&lt;/code&gt; de busybox n&amp;rsquo;est malheureusement PAS compatible avec le script &lt;code&gt;lxc-download&lt;/code&gt;. On va devoir le modifier à la main&amp;hellip;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Usage: mktemp [-dq] TEMPLATE
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le passage problématique se situe autour des lignes 320-325&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;320&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; ! &lt;span class="nb"&gt;command&lt;/span&gt; -V mktemp &amp;gt;/dev/null 2&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;321&lt;/span&gt; &lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmp/lxc-download.&lt;/span&gt;&lt;span class="nv"&gt;$$&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;322&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;323&lt;/span&gt; &lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;mktemp -d&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;324&lt;/span&gt; &lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En vrai, &lt;code&gt;mktemp&lt;/code&gt; s&amp;rsquo;attend à avoir le path complet, accompagné d&amp;rsquo;un pattern à base de XXXXXX. &lt;code&gt;mktemp&lt;/code&gt; remplace ensuite les caractères XXXXXX par un nombre aléatoire en s&amp;rsquo;assurant que le dossier n&amp;rsquo;existe pas déjà, puis le créé. Par exemple&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;mktemp /tmp/mydirXXXXX
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Mode bourrin, j&amp;rsquo;ai remplacé la ligne par :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="m"&gt;323&lt;/span&gt; &lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/tmpdir&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; mkdir -p &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;DOWNLOAD_TEMP&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;De toute façon, il est supprimé à la fin de l&amp;rsquo;exécution du script, ce dossier (fonction cleanup dans le shell).&lt;/p&gt;
&lt;h2 id="gpg"&gt;GPG
&lt;/h2&gt;&lt;p&gt;On progresse !&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;[~] # lxc-create -t download -n container_jammy -- -d ubuntu -r jammy -a armhf
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Setting up the GPG keyring
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;chmod: /var/lib/lxc/container_jammy/tmpdir/gpg: No such file or directory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Error creating container container_jammy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En creusant un peu, la vraie erreur est que je n&amp;rsquo;ai pas le binaire &lt;code&gt;gpgkeys_curl&lt;/code&gt; à l&amp;rsquo;endroit attendu :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;gpg: unable to execute program `/opt/cross-project/arm/linaro/arm-linux-gnueabihf/libc/libexec/gnupg/gpgkeys_curl&amp;#39;: No such file or directory
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Voilà un autre point que je n&amp;rsquo;ai pas réussi à corriger correctement.&lt;/p&gt;
&lt;p&gt;Le plus simple est de simplement ignorer la validation avec &lt;code&gt;--no-validate&lt;/code&gt; mais si vous avez une piste, je suis preneur.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;lxc-create -t download -n container_jammy -- -d ubuntu -r jammy -a armhf --no-validate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="des-dossiers-qui-disparaissent-tout-seul-"&gt;Des dossiers qui disparaissent tout seul ???
&lt;/h2&gt;&lt;p&gt;Dernier mystère&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;Downloading the image index
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;ERROR: Failed to download http://images.linuxcontainers.org//meta/1.0/index-system
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L&amp;rsquo;erreur n&amp;rsquo;est pas du tout un problème d&amp;rsquo;accès à l&amp;rsquo;URL pour télécharger l&amp;rsquo;index des systèmes disponibles sur &lt;code&gt;images.linuxcontainers.org&lt;/code&gt; (code 302, page redirigée sur &lt;code&gt;uk.lxd.images.canonical.com&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;En réalité, si active les messages d&amp;rsquo;erreurs lors du &lt;code&gt;wget&lt;/code&gt; dans le script, l&amp;rsquo;erreur est que le dossier &lt;code&gt;/var/lib/lxc/container_jammy/tmpdir/&lt;/code&gt; n&amp;rsquo;existe pas !&lt;/p&gt;
&lt;p&gt;Pourtant, ça devrait être corrigé, suite à la modif qu&amp;rsquo;on a faite ligne 323 (voir plus haut)&amp;hellip; trop bizarre :/&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;en ai eu un peu marre de creuser et au bout d&amp;rsquo;un moment, j&amp;rsquo;ai juste fait :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;export CONTAINER_NAME=jammy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;mkdir -p /var/lib/lxc/${CONTAINER_NAME}/tmpdir/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;mkdir -p /var/lib/lxc/${CONTAINER_NAME}/rootfs/
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;lxc-create -t download -n ${CONTAINER_NAME} -- -d ubuntu -r jammy -a armhf --no-validate
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et croyez-le ou non, mais ça marche ! Le container existe (il n&amp;rsquo;est juste pas visible dans la console pour l&amp;rsquo;instant)&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;[...]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="go"&gt;You just created an Ubuntu jammy armhf (20220611_07:42) container.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On a plus qu&amp;rsquo;à redémarrer Container Station, il apparaît&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/06/qnap_lxc_jammy.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Si jamais quelqu&amp;rsquo;un de chez QNAP lit ce blogpost&amp;hellip; Arrêtez de vous fiche de nous et :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;mettez nous LXD dans nos NAS ARM&lt;/li&gt;
&lt;li&gt;OU si c&amp;rsquo;est trop de boulot (je peux l&amp;rsquo;entendre), remettre LXC en attendant.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ce genre de hack est indigne et j&amp;rsquo;ai perdu plusieurs heures pour corriger votre m***e. J&amp;rsquo;ai payé pour un NAS compatible LXC, ce n&amp;rsquo;est pas pour que vous retiriez la fonctionnalité 1 an après.&lt;/p&gt;
&lt;p&gt;Ce genre de pratiques est vraiment dégueulasse et je n&amp;rsquo;hésiterais pas à dire tout le mal que je pense de cette décision.&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://forum.qnap.com/viewtopic.php?t=159613" target="_blank" rel="noopener"
&gt;Un post sur le Forum QNAP qui m&amp;rsquo;a un peu guidé vers la solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.reddit.com/r/qnap/comments/owkr63/qnap_container_station_loss_of_functionality/" target="_blank" rel="noopener"
&gt;Un fil de discussion Reddit qui en parle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Déployer en 5 minutes un cluster Kubernetes sur ARM avec k3s et Ansible</title><link>https://blog.zwindler.fr/2019/03/21/deployer-en-5-minutes-un-cluster-kubernetes-sur-arm-avec-k3s-et-ansible/</link><pubDate>Thu, 21 Mar 2019 13:00:14 +0000</pubDate><guid>https://blog.zwindler.fr/2019/03/21/deployer-en-5-minutes-un-cluster-kubernetes-sur-arm-avec-k3s-et-ansible/</guid><description>&lt;img src="https://blog.zwindler.fr/2019/03/k3s_scaleway.webp" alt="Featured image of post Déployer en 5 minutes un cluster Kubernetes sur ARM avec k3s et Ansible" /&gt;&lt;h2 id="cest-quoi-k3s-"&gt;C’est quoi k3s ?
&lt;/h2&gt;&lt;p&gt;Il y a quelques jours, vous avez peut être vu passer dans vos fil d’actus &lt;strong&gt;k3s&lt;/strong&gt;, ce nouveau projet &lt;a class="link" href="https://k3s.io/" target="_blank" rel="noopener"
&gt;open sourcé par Rancher&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Lightweight Kubernetes. 5 less than k8s.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il s’agit d’une version réduite de Kubernetes, sans pour autant être minimaliste, qui nous vante la possibilité de monter des clusters Kubernetes avec très peu de ressources nécessaires. On parle de moins de 512 Mo de RAM pour un master, encore moins pour un worker, tout dans un binaire de 40 Mo, support de &lt;strong&gt;armhf&lt;/strong&gt;, et &lt;strong&gt;arm64&lt;/strong&gt;, &amp;hellip;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Great for Edge, IoT, CI, ARM, and situations where a PhD in k8s clusterology is infeasible&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cerise sur le gâteau, comme tout est regroupé dans un seul et même binaire, l’installation est ultra simple et se résume en :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Récupérer un binaire&lt;/li&gt;
&lt;li&gt;Lancer le binaire sur le master&lt;/li&gt;
&lt;li&gt;Lancer le binaire sur le worker avec l’URL du master et un token&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="mais-cest-génial-"&gt;Mais c’est génial !
&lt;/h2&gt;&lt;p&gt;Nécessairement, pour arriver à ça, il a fallut faire quelques concessions mais pour l’instant je ne les trouves pas très gênantes. Parmi les modifications notables, on retrouve :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Suppression des features alpha, legacy et non standard&lt;/li&gt;
&lt;li&gt;Suppression de tous les add-on des cloud providers&lt;/li&gt;
&lt;li&gt;Remplacement de etcd3 par sqlite3 (même si etcd3 peut être toujours être utilisé)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="jen-veux-un-"&gt;J’en veux un !
&lt;/h2&gt;&lt;p&gt;Autant dire que pas mal de bidouilleurs du dimanche se sont jetés dessus.&lt;/p&gt;
&lt;p&gt;Le premier exemple qui vient à l’esprit est de monter un cluster Kubernetes sur Raspberry pi. Nombre de personnes ont déjà installé Docker sur un raspberry qui traînait dans un tiroir (moi compris), et le nombre d’articles avec Docker Swarm sur plusieurs Raspberry pullule sur le web.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2016/09/05/geekerie-du-week-end-installer-docker-sur-un-raspberry-pi/" &gt;Geekerie du week end : installer Docker sur un Raspberry Pi&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tout ça c’est très bien mais jusqu’à présent, il était difficile d’installer Kubernetes sur ce genre de machines, assez limités en CPU/RAM. Du coup, vous vous en doutez, je ne suis pas le premier à parler de ça.&lt;/p&gt;
&lt;p&gt;Vincent RABAT aka &lt;strong&gt;itwars&lt;/strong&gt; (que vous connaissez sûrement si vous écumez les meetups sur Bordeaux) m’a coiffé au poteau en &lt;a class="link" href="https://github.com/itwars/k3s-ansible" target="_blank" rel="noopener"
&gt;releasant un playbook Ansible pour installer k3s&lt;/a&gt;, et notamment sur un Raspberry Pi (mais pas que).&lt;/p&gt;
&lt;p&gt;A charge de revanche, Vincent ;-).&lt;/p&gt;
&lt;h2 id="un-peu-différent"&gt;Un peu différent
&lt;/h2&gt;&lt;p&gt;Du coup, pour me démarquer, je vous propose aujourd’hui quelque chose d’un peu différent. N’ayant pas suffisament de raspberry sous la main, j’ai voulu faire un PoC de k3s en me basant sur des machines ARM créées chez un cloud provider.&lt;/p&gt;
&lt;p&gt;L’idée étant que si ça marche sur des machines de faible puissance en ARM, ça marchera partout (x64, raspberry, etc).&lt;/p&gt;
&lt;p&gt;Ça fait plusieurs fois que j’utilise &lt;a class="link" href="https://www.scaleway.com/" target="_blank" rel="noopener"
&gt;Scaleway&lt;/a&gt; comme hébergeur pour des petits projets, et en particulier pour déployer rapidement des machines car leur API est pas trop mal fichues et surtout ils disposent de modules Ansible très bien fait, notamment avec la feature « inventaire dynamique », ce que beaucoup ne font pas.&lt;/p&gt;
&lt;p&gt;Pour ceux que ça intéresse, mon talk sur BDX.IO était basé sur le même principe :&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.youtube.com/watch?v=WPRE1_f0pyg" target="_blank" rel="noopener"
&gt;https://www.youtube.com/watch?v=WPRE1_f0pyg&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Dans ce tuto, je vais donc vous montrer comment en quelque commande, monter un cluster k3s sur des machines ARM créées à la volée chez Scaleway, le tout avec Ansible (vous l’aurez compris).&lt;/p&gt;
&lt;h2 id="quelques-prérequis"&gt;Quelques prérequis
&lt;/h2&gt;&lt;p&gt;La première chose à faire est de cloner sur votre machine les playbooks Ansible que j’ai mis à disposition sur Github à l’adresse suivante : &lt;a class="link" href="https://github.com/zwindler/ansible-scaleway-k3s" target="_blank" rel="noopener"
&gt;github.com/zwindler/ansible-scaleway-k3s&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Pour réaliser ce tuto, je pars du principe que vous avec déjà un compte sur Scaleway, que vous avez un clé SSH qu’on déposera à la racine du projet, appelée &lt;strong&gt;admin.pub&lt;/strong&gt; (c’est original).&lt;/p&gt;
&lt;p&gt;Il faudra également installer les package &lt;strong&gt;pipy&lt;/strong&gt; suivant sur la machine locale :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pip install jinja2 PyYAML paramiko cryptography packaging
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, vous devrez installer Ansible depuis les sources (&amp;gt;= 2.8devel) et éventuellement le binaire &lt;strong&gt;jq&lt;/strong&gt; pour requêter dans les output JSON (ça c’est juste pour se faciliter la vie)&lt;/p&gt;
&lt;p&gt;Dans la console Scaleway, vous devrez créer un token sur le site de Scaleway pour les accès distants et le stocker dans un fichier &lt;strong&gt;scaleway_token&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;export SCW_API_KEY=&amp;#39;aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et enfin sourcer le fichier pour avoir la variable dans votre environnement&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;source scaleway_token
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="ok-on-est-prêt"&gt;OK, on est prêt
&lt;/h2&gt;&lt;p&gt;La première étape de cette procédure va être de générer des instances ARM pour héberger le master et le worker Kubernetes. Pour ça, le playbook Ansible &lt;strong&gt;create_arm_vms.yaml&lt;/strong&gt; va :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;récupérer l’ID d’organisation du compte Scaleway&lt;/li&gt;
&lt;li&gt;récupérer un ID d’image compatible debian Stretch&lt;/li&gt;
&lt;li&gt;ajouter si nécessaire la clé SSH de l’admin&lt;/li&gt;
&lt;li&gt;créer autant de machines que nécessaire&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On lance la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook create_arm_vms_scaleway.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ET C’EST TOUT !&lt;/p&gt;
&lt;p&gt;Normalement en 2 minutes, vous devriez avoir 2 instances ARM sur le datacenter de Paris (par1).&lt;/p&gt;
&lt;p&gt;A noter, il se peut qu’elles ne soient pas accessibles tout de suite en SSH. J’adapterai peut être le playbook pour qu’il ne rende pas la main tant que les machines ne sont pas accessibles, et qu’on enchaîne automatiquement sur l’étape suivante (TODO).&lt;/p&gt;
&lt;h2 id="inventaire-automatique"&gt;Inventaire automatique
&lt;/h2&gt;&lt;p&gt;Je le disais plus haut, la grande force de Scaleway avec Ansible est le fait qu’ils ont fait l’effort de coder &lt;strong&gt;l’inventaire dynamique&lt;/strong&gt;. Vous n’avez pas besoin de renseigner à la main les IPs des instances que vous venez de créer dans un fichier ansible/hosts. Grâce à l’API, la découverte se fait automatiquement. On va dont pouvoir enchaîner sur la suite directement.&lt;/p&gt;
&lt;p&gt;De base, voici le contenu de mon fichier d’inventaire (inventory.yml) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;plugin: scaleway
regions:
- par1
tags:
- k3smaster
- k3sworker
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Maintenant que les machines sont UP, on peut vérifier ce que nous renvoie Scaleway avec la commande &lt;strong&gt;ansible-inventory&lt;/strong&gt;. Ça devrait ressembler à ça :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-inventory --list -i inventory.yml
{
&amp;#34;_meta&amp;#34;: {
&amp;#34;hostvars&amp;#34;: {
&amp;#34;x.x.x.x&amp;#34;: {
&amp;#34;arch&amp;#34;: &amp;#34;arm64&amp;#34;,
&amp;#34;commercial_type&amp;#34;: &amp;#34;ARM64-2GB&amp;#34;,
&amp;#34;hostname&amp;#34;: &amp;#34;k3smaster1&amp;#34;,
[...]
&amp;#34;k3sworker&amp;#34;: {
&amp;#34;hosts&amp;#34;: [
&amp;#34;x.x.x.x&amp;#34;,
&amp;#34;y.y.y.y&amp;#34;,
&amp;#34;z.z.z.z&amp;#34;
]
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="ssh-fingerprints"&gt;SSH fingerprints
&lt;/h2&gt;&lt;p&gt;Une étape qui est souvent fastidieuse, surtout quand on ajoute beaucoup de serveur, est l’étape de vérification de l&amp;rsquo;empreinte SSH des nouveaux serveurs lors de la première connexion. Cette authentification est très importante et il &lt;b&gt;n’est pas du tout conseillé&lt;/b&gt; (comme je le vois parfois) d’ajouter l’option &lt;strong&gt;ANSIBLE_HOST_KEY_CHECKING=False&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Ici, je vous propose de scanner automatiquement &lt;em&gt;la première fois&lt;/em&gt; l&amp;rsquo;empreinte, et l’ajouter dans votre known_hosts. Ainsi, si l&amp;rsquo;empreinte change en cours de route, vous serez prévenus. Cependant, ce n’est à utiliser que dans le cas de notre bidouille, pas en production.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-inventory --list -i inventory.yml | jq -r &amp;#39;.k3smaster.hosts | .[]&amp;#39; | xargs ssh-keyscan &amp;gt;&amp;gt; ~/.ssh/known_hosts
ansible-inventory --list -i inventory.yml | jq -r &amp;#39;.k3sworker.hosts | .[]&amp;#39; | xargs ssh-keyscan &amp;gt;&amp;gt; ~/.ssh/known_hosts
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vous pouvez maintenant ajouter votre clé SSH dans le ssh-agent, et vérifier qu’on vous pouvez vous connecter à tous les serveurs via Ansible :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;eval `ssh-agent`
ssh-add myprivate.key
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="préparation-du-serveur"&gt;Préparation du serveur
&lt;/h2&gt;&lt;p&gt;C’était facile, non ?&lt;/p&gt;
&lt;p&gt;Et bien la suite l’est encore plus, à l’exception de cette petite subtilité/piège =&amp;gt; Il se trouve que l’image ARM par défaut proposée par Scaleway ne dispose ni de python ni de sudo. Pour faire du Ansible, c’est très très handicapant.&lt;/p&gt;
&lt;p&gt;J’ai donc écris un petit playbook, à n’exécuter la première fois, qui installe les prérequis non présents sur l’image de base (&lt;strong&gt;python&lt;/strong&gt; et &lt;strong&gt;sudo&lt;/strong&gt;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i inventory.yml -u root install_prerequisites_scaleway.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si vous n’êtes pas sur ce genre de machines, vous n’aurez pas à faire cette étapes.&lt;/p&gt;
&lt;p&gt;Maintenant qu’on a des machines avec python et sudo, on peut installer k3s normalement avec Ansible :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i inventory.yml -u root install_k3s_scaleway.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois de plus : ET C’EST TOUT !&lt;/p&gt;
&lt;p&gt;Le cluster est maintenant opérationnel. Les serveurs ont Kubernetes installé et fonctionnel. Le ou les workers ont rejoint le master et font parti d’un même cluster. Un Ingress controller Treafik est créé, on peut jouer dessus directement :-)&lt;/p&gt;
&lt;h2 id="bonus--accéder-au-cluster"&gt;Bonus : accéder au cluster
&lt;/h2&gt;&lt;p&gt;Bon je vous ai un peu feinté.&lt;/p&gt;
&lt;p&gt;Certes, on peut se connecter en SSH sur le master et le piloter avec les commandes &lt;strong&gt;kubectl&lt;/strong&gt; classique (mais il faut rajouter k3s devant car le binaire kubectl est intégré à k3s). Mais c’est quand même plus simple si on peut y accéder à distance, depuis votre machine locale.&lt;/p&gt;
&lt;p&gt;Là encore, j’ai donc fais un petit playbook qui va aspirer la configuration &lt;strong&gt;kubectl&lt;/strong&gt; et la coller dans le fichier &lt;strong&gt;~/.kube/config.k3smaster&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ansible-playbook -i inventory.yml -u root configure_kubeconfig.yml
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, vous devriez pouvoir tester votre nouveau cluster depuis votre PC :-)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd
kubectl --kubeconfig=.kube/config.k3smaster get nodes
NAME STATUS ROLES AGE VERSION
k3smaster1 Ready &amp;lt;none&amp;gt; 2d v1.13.3-k3s.6
k3sworker1 Ready &amp;lt;none&amp;gt; 2d v1.13.3-k3s.6
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Enjoy !!!&lt;/p&gt;</description></item><item><title>Stockage pour un admin geek : QNAP TS431P2 ou Synology DS418(j) ?</title><link>https://blog.zwindler.fr/2018/01/23/stockage-pour-un-admin-geek-qnap-ts431p2-ou-synology-ds418j/</link><pubDate>Tue, 23 Jan 2018 12:45:24 +0000</pubDate><guid>https://blog.zwindler.fr/2018/01/23/stockage-pour-un-admin-geek-qnap-ts431p2-ou-synology-ds418j/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/01/qnap22.webp" alt="Featured image of post Stockage pour un admin geek : QNAP TS431P2 ou Synology DS418(j) ?" /&gt;&lt;h2 id="behold"&gt;Behold!
&lt;/h2&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/01/qnap22.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Mon TS431P2&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;J’en ai déjà parlé sur le blog, j’ai entamé une phase de &lt;em&gt;dés-auto-hébergement&lt;/em&gt;. Oui je sais, c’est triste.&lt;/p&gt;
&lt;p&gt;Au delà des problématiques de disponibilités des services plus réduite en auto-hébergement (sauf à réaliser des efforts conséquents) par rapport à des services en ligne, héberger son serveur, ce n’est pas toujours très écolo et ça peut coûter plus cher.&lt;/p&gt;
&lt;p&gt;Louer une machine physique et y installer un hyperviseur chez Kimsufi (ou OneProvider ou autre) permet de faire des économies pour une qualité de service supérieure (&lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=m4vr0x" &gt;cf les articles de M4vr0x&lt;/a&gt;). Alors ce n’est certainement pas aussi fun &lt;a class="link" href="https://blog.zwindler.fr/2014/03/09/construction-dun-helmer-like-pour-mon-infra-perso-part-1-le-design/" &gt;que de concevoir&lt;/a&gt; et &lt;a class="link" href="https://blog.zwindler.fr/2014/03/10/construction-dun-helmer-like-pour-mon-infra-perso-part-3-lassemblage-et-lamenagement-interieur/" &gt;monter son propre meuble « rack » et y visser une carte mère dedans&lt;/a&gt; mais c’est probablement aussi plus rationnel.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2014/03/meuble_v3-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;N’ayant plus que le « serveur NAS » dans mon Red Helmer maison, j’ai donc décidé d’aller au bout de la démarche et d’abandonner mon Xubuntu customisé pour acquérir un QNAP TS431 P2.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/01/qnap24.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Migration en cours&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="synology-ou-qnap-un-choix-de-société--vous-avez-4-heures-"&gt;Synology ou QNAP, un choix de société ? Vous avez 4 heures !
&lt;/h2&gt;&lt;p&gt;Je vais esquiver (ou au moins tenter d’esquiver) un flame war Synology versus QNAP et simplement lister mes besoins. Je veux remplacer un NAS existant à base d’OS Linux disposant des caractéristiques et fonctionnalités suivantes :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Matériel :
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://www.amazon.fr/gp/product/B015VPX05A/ref=as_li_tl?ie=UTF8&amp;amp;camp=1642&amp;amp;creative=6746&amp;amp;creativeASIN=B015VPX05A&amp;amp;linkCode=as2&amp;amp;tag=zwindsrefle-21&amp;amp;linkId=075f115800c86d9c88cd85db55f2f28a" target="_blank" rel="noopener"
&gt;Intel Pentium (dual core 3GHz)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://www.amazon.fr/gp/product/B0089JIDLC/ref=as_li_tl?ie=UTF8&amp;amp;camp=1642&amp;amp;creative=6746&amp;amp;creativeASIN=B0089JIDLC&amp;amp;linkCode=as2&amp;amp;tag=zwindsrefle-21&amp;amp;linkId=0a7d5dcc2f1502ccb97bf9da4ec7a0b4" target="_blank" rel="noopener"
&gt;8 Go de RAM&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;~6 To via 3x 3To de &lt;a class="link" href="https://www.amazon.fr/gp/product/B00EHBERSE/ref=as_li_tl?ie=UTF8&amp;amp;camp=1642&amp;amp;creative=6746&amp;amp;creativeASIN=B00EHBERSE&amp;amp;linkCode=as2&amp;amp;tag=zwindsrefle-21&amp;amp;linkId=93fe7aceebe269e31d1a928e4735e5b3" target="_blank" rel="noopener"
&gt;HDD Western Digital Red&lt;/a&gt; en grappe RAID 5 via &lt;strong&gt;mdadm&lt;/strong&gt;
. Le but est de réutiliser ces disques.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;4 baies 3,5″ minimum&lt;/strong&gt; (cf ligne précédente)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Performances :
&lt;ul&gt;
&lt;li&gt;Je souhaite disposer d’un NAS capable &lt;strong&gt;&lt;em&gt;a minima&lt;/em&gt; de saturer le port gigabit Ethernet&lt;/strong&gt; (&amp;gt;100 Mo/seconde en lecture ou écriture séquentielle) &lt;strong&gt;sans perte de performance&lt;/strong&gt; sur les autres services&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Fonctionnalités :
&lt;ul&gt;
&lt;li&gt;Partages NFS, CIFS, iSCSI
&lt;ul&gt;
&lt;li&gt;Serveur SFTP, Plex et &lt;em&gt;Deluge centralisant les téléchargement démarrés depuis tous les PC du foyer&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Accès SSH en admin (pour hébergement de petits services complémentaires comme des scripts de supervision, &lt;a class="link" href="https://blog.zwindler.fr/2014/09/22/mise-a-jour-de-votre-dns-chez-ovh-avec-dynhost/" &gt;mise à jour de DynHost OVH&lt;/a&gt;, &amp;hellip;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Prix :
&lt;ul&gt;
&lt;li&gt;Le moins cher possible une fois que les critères de performances et fonctionnalités sont respectés&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Si on met de côté le serveur Deluge qui est un besoin un peu exotique, les fonctionnalités nécessaires sont relativement basiques. Ce n’est donc pas réellement un critère de choix.&lt;/p&gt;
&lt;h2 id="shortlister-du-matériel"&gt;Shortlister du matériel
&lt;/h2&gt;&lt;p&gt;Je me suis néanmoins limité à Synology et QNAP (les deux leaders) pour m’assurer un meilleur support et une meilleure assurance d’avoir de nouvelles fonctionnalités dans les années à venir car leurs OS sont régulièrement mis à jour.&lt;/p&gt;
&lt;p&gt;J’ai donc épluché les références sur le site des deux marques (&lt;a class="link" href="https://www.synology.com/fr-fr/products?bays=4" target="_blank" rel="noopener"
&gt;Synology&lt;/a&gt; et &lt;a class="link" href="https://www.qnap.com/fr-fr/product/?conditions=0-4" target="_blank" rel="noopener"
&gt;QNAP&lt;/a&gt;) et voilà les modèles qui ont retenus mon attention :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;QNAP TS431P2 (Home - Middle range)&lt;/li&gt;
&lt;li&gt;QNAP TS451* (Home - High end)&lt;/li&gt;
&lt;li&gt;Synology DiskStation DS418j (Home - Middle range)&lt;/li&gt;
&lt;li&gt;Synology DiskStation DS418 (Home - Middle range)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Clairement, le TS451 (et ses déclinaisons) est overkill. Outre la sortie HDMI dont je n’ai que faire (le NAS est dans le dressing, loiiiin de la TV), le TS451 dispose d’un Celeron, capable sur le papier de faire tourner des VMs. L’argument est intéressant mais je ne pense pas en avoir l’utilité à la maison, toutes mes VMs ayant été transportées sur les serveurs chez Kimsufi.&lt;/p&gt;
&lt;p&gt;La vraie « battle » s’est donc faite entre le TS431P2 et les deux Synology DS418 et sa version « j ».&lt;/p&gt;
&lt;h2 id="comparer-des-oranges-et-des-bananes"&gt;Comparer des oranges et des bananes
&lt;/h2&gt;&lt;p&gt;Voici un petit tableau comparatif des trois NAS :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/01/qnap25-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h3 id="la-ram"&gt;La RAM
&lt;/h3&gt;&lt;p&gt;Il y a clairement 2 philosophies. Synology se vante d’avoir doublé la capacité de la RAM de ces modèles de 2018 (2G/1G) par rapport à ceux de 2016 (1G/512M). En même temps on partait de tellement loin ! Chez QNAP, si les modèles d’entrée de gamme sont aussi en 1Go, on hésite pas à proposer des modèles avec 2, 4, voire 8 Go, et à indiquer que tous les modèles sont upgradables. Dans l’optique d’héberger de futurs services supplémentaires à la maison, c’est rassurant, mon TS431P2 ne manquera pas de RAM.&lt;/p&gt;
&lt;h3 id="performance-brute"&gt;Performance brute
&lt;/h3&gt;&lt;p&gt;A première vue, les 3 NAS disposent de processeurs ARM récents et se valent.&lt;/p&gt;
&lt;p&gt;Pourquoi je parle de CPU ? Au delà de la vitesse des disques qui est indépendante du NAS choisi, et de la vitesse des ports Gigabit (bridée&amp;hellip; à 1 Gbit ! surprise !), c’est le CPU le facteur limitant sur la plupart des NAS sur le marché.&lt;/p&gt;
&lt;p&gt;Or dans le cas présent, les 3 saturent les ports Ethernet en lecture ou écriture séquentielles (le DS418j n’a qu’un port Ethernet, d’où les débits 2x inférieurs).&lt;/p&gt;
&lt;p&gt;C’était une vraie inquiétude pour moi car les premiers Synology que j’avais pu manipuler il y a quelques années étaient plombés par des ARM sous dimensionnés induisant des plateaux à 40-50 Mo/s et bloquant toutes les autres opérations (CPU à 100%). C’était la raison pour laquelle j’ai monté plusieurs &lt;a class="link" href="https://blog.zwindler.fr/2011/06/29/nasmediacenter-do-it-yourself-or-not/" &gt;« NAS maisons » depuis 2011&lt;/a&gt;, avec des performances bien plus importantes à tarif égal.&lt;/p&gt;
&lt;h3 id="comparer-les-arm-entre-eux"&gt;Comparer les ARM entre eux
&lt;/h3&gt;&lt;p&gt;A ma connaissance, il n’existe pas de base de données en ligne de benchmark sur les différents CPU ARM (&lt;a class="link" href="https://www.cpubenchmark.net/" target="_blank" rel="noopener"
&gt;comme on peut trouver pour Intel et AMD par exemple&lt;/a&gt;), donc pas de possibilité de comparer comme cela.&lt;/p&gt;
&lt;p&gt;Cependant, en fouillant un peu plus, j’ai pu me rendre compte que l’Alpine AL-314 semble surclasser très (très) largement les deux autres. En épluchant la fiche technique du TS431&lt;strong&gt;X&lt;/strong&gt;2 (un NAS QNAP entrée de gamme pour PME avec un port&amp;hellip; 10GbE fibre !) qui a le même processeur, on découvre des performances maximales théoriques de 1014 Mo/s en lecture et 580 Mo/s en écriture ! On sature même le 10GbE en lecture&amp;hellip;&lt;/p&gt;
&lt;p&gt;Cet avantage se confirme sur les transferts chiffrés. Le DS418 ne sature plus qu’un seul port Ethernet et le DS418j tombe même bien en dessous des 100Mo/s en écriture.&lt;/p&gt;
&lt;p&gt;Parallèlement, le TS431P2 garde un débit assez proche de la saturation de ses deux ports Ethernet. Autant dire qu’avec ce processeur, le NAS s’ennuie quand on transfère à 100 Mo/s (ce que j’ai pu vérifier IRL).&lt;/p&gt;
&lt;p&gt;Il n’y a donc aucune contrindication à héberger des services supplémentaires et les gros transferts n’ont aucun impact sur les performances globales du NAS (si ce n’est congestionner le réseau).&lt;/p&gt;
&lt;h2 id="killer-features-containers-et-snapshots"&gt;Killer features (containers et snapshots)
&lt;/h2&gt;&lt;p&gt;Déjà, côté matoss, le QNAP est donc devant.&lt;/p&gt;
&lt;p&gt;Côté fonctionnalités, si DSM (OS des Synology) &lt;a class="link" href="https://www.synology.com/fr-fr/dsm/packages" target="_blank" rel="noopener"
&gt;possède beaucoup plus de paquets/applications&lt;/a&gt; que QTS (OS des QNAP), les DS418(j) &lt;em&gt;ne sont pas compatibles avec l’application &lt;strong&gt;Docker&lt;/strong&gt;&lt;/em&gt; alors que le TS431P2 (et tous les autres QNAP) propose une application officielle pour gérer les containers &lt;strong&gt;&lt;em&gt;LXC&lt;/em&gt;&lt;/strong&gt; ET &lt;strong&gt;&lt;em&gt;Docker&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/01/qnap23.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Container Station&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Dans l’optique de remonter mon serveur Deluge sur le NAS (et d’autres services par la suite), c’est donc un autre point positif pour QNAP.&lt;/p&gt;
&lt;p&gt;Deux derniers point mis en avant par QNAP, la possibilité de gérer &lt;strong&gt;sur tous les modèles de la gamme&lt;/strong&gt; des snapshots de tous les volumes avec la dernière version (QTS 4.3.4), ce qui n’est pas possible sur les DS418(j), ainsi qu’une application pour gérer des devices de type IoT.&lt;/p&gt;
&lt;h2 id="user-friendly-versus-bidouilleur"&gt;User friendly versus bidouilleur
&lt;/h2&gt;&lt;p&gt;Clairement, le positionnement de Synology est de proposer des boitiers &lt;em&gt;suffisants&lt;/em&gt; pour la plupart des utilisateur, &lt;em&gt;un peu&lt;/em&gt; moins customisables et performants mais aussi &lt;em&gt;un peu&lt;/em&gt; plus simple d’utilisation. C’est pour ça que, pour tout autre personne que moi (ou un geek sysadmin), je conseille les Synology.&lt;/p&gt;
&lt;p&gt;J’insiste : les différences sont vraiment infimes car QNAP est aussi très user friendly. L’interface est très fluide et très intuitive, mais on a clairement plus la main (pas encore autant que je voudrais :-p) et un néophyte serait probablement plus à l’aise sur un Synology.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/01/qnap13-1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Le « bureau » de QNAP&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/01/qnap26.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Administration et Filestation&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Mais le fait que le CPU soit bien plus costaud côté sur les QNAP et qu’on ait la possibilité d’augmenter la RAM sont clairement des points qui plaisent aux bidouilleurs dont je fais partie.&lt;/p&gt;
&lt;p&gt;L’ajout de fonctionnalités comme Docker/LXC, les snapshots ou le support de l’IoT sur toute la gamme aussi.&lt;/p&gt;
&lt;p&gt;Sans trop d’hésitation, j’ai donc choisi le TS431P2. En profitant d’une promo j’ai réussi à avoir le modèle 1 Go avec une barrette de RAM 8 Go pour pratiquement le même prix que sans. Je ferai peut être un petit article sur la partie upgrade de la RAM ;-)&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.synology.com/fr-fr/products?bays=4" target="_blank" rel="noopener"
&gt;Liste des NAS 4 Baies Synology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.synology.com/fr-fr/products/performance#4bay" target="_blank" rel="noopener"
&gt;Performance des NAS 4 Baies Synology&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.qnap.com/fr-fr/product/?conditions=0-4" target="_blank" rel="noopener"
&gt;Liste des NAS 4 Baies QNAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.qnap.com/en/product_x_performance/group.php?goal_csn=8" target="_blank" rel="noopener"
&gt;Performance des NAS 4 Baies QNAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://exchange.nagios.org/directory/Plugins/Network-Connections%2C-Stats-and-Bandwidth/Check-QNAP-Disk/details" target="_blank" rel="noopener"
&gt;Plugins Nagios et compatibles pour superviser un QNAP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>