<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Ubuntu on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/ubuntu/</link><description>Recent content in Ubuntu on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Sat, 04 Jan 2025 18:00:00 +0200</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/ubuntu/index.xml" rel="self" type="application/rss+xml"/><item><title>Sidero Omni - Talos Linux sur Oracle Cloud (en free tier)</title><link>https://blog.zwindler.fr/2025/01/04/sideros-omni-talos-oracle-cloud/</link><pubDate>Sat, 04 Jan 2025 18:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2025/01/04/sideros-omni-talos-oracle-cloud/</guid><description>&lt;img src="https://blog.zwindler.fr/2025/01/omni-oracle.webp" alt="Featured image of post Sidero Omni - Talos Linux sur Oracle Cloud (en free tier)" /&gt;&lt;p&gt;Fun fact, le 4 janvier 2024 (il y a tout pile un an donc), mon premier article de l&amp;rsquo;année était sur &lt;a class="link" href="https://blog.zwindler.fr/2024/01/04/un-peu-plus-loin-avec-maas-canonical" &gt;Maas&lt;/a&gt;. Commencer 2025, le même jour, avec un autre article à propos d&amp;rsquo;une solution qui vise à automatiser de l&amp;rsquo;infra, notamment en bare metal, c&amp;rsquo;est drôle :)&lt;/p&gt;
&lt;h2 id="contexte"&gt;Contexte
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;ai gagné !!!&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/01/sidero-win.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Je joue de temps en temps à des jeux sur les réseaux sociaux (plus rarement maintenant) et il m&amp;rsquo;arrive aussi de faire des concours parfois en conférence.&lt;/p&gt;
&lt;p&gt;Et là, j&amp;rsquo;ai gagné un an d&amp;rsquo;abonnement au SaaS de Sidero Labs (les créateurs de Talos Linux), &lt;strong&gt;Omni&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Pour celles et ceux qui se demandent, Omni est une solution de déploiement de clusters Kubernetes qui permet d&amp;rsquo;orchestrer des serveurs sous Talos, un système d&amp;rsquo;exploitation Linux minimaliste et sécurisé dédié à Kubernetes. Pour ce qui est de Talos, on en reparlera certainement dans de prochains articles.&lt;/p&gt;
&lt;h2 id="quel-rapport-avec-oracle-cloud-"&gt;Quel rapport avec Oracle Cloud ?
&lt;/h2&gt;&lt;p&gt;Gagner, c&amp;rsquo;est bien, ça fait toujours plaisir. Mais j&amp;rsquo;en fais quoi, désormais, de ce SaaS ?&lt;/p&gt;
&lt;p&gt;La première idée qui vient à l&amp;rsquo;esprit est de commander un serveur dédié quelque part et d&amp;rsquo;installer Talos dessus (avec un ISO généré par Omni), ou alors de faire la même chose, mais d&amp;rsquo;installer un hyperviseur, puis de créer des VMs Talos Linux (là encore, grâce à Omni).&lt;/p&gt;
&lt;p&gt;Mais je suis &lt;del&gt;radin&lt;/del&gt; un éternel économe et j&amp;rsquo;ai vu qu&amp;rsquo;Oracle Cloud Infrastructure (OCI) est supporté par Talos Linux et Omni, et donc j&amp;rsquo;ai voulu essayer.&lt;/p&gt;
&lt;p&gt;Pour ceux qui ne connaissent pas OCI, j&amp;rsquo;ai fait une série d&amp;rsquo;articles en 2023 pour expliquer comment créer un cluster gratuit avec &lt;code&gt;kubeadm&lt;/code&gt; sur le free tier (assez généreux) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2023/04/24/cluster-kubernetes-gratuit-part1/" &gt;Un cluster Kubernetes gratuit pour vos labs persos ! - part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2023/05/23/cluster-kubernetes-gratuit-part2/" &gt;Un cluster Kubernetes gratuit pour vos labs persos ! - part 2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On va donc réutiliser le free tier ici, mais pour déployer et gérer des clusters avec Omni.&lt;/p&gt;
&lt;p&gt;Note : vous pouvez les relire, mais j&amp;rsquo;ai fait mieux depuis car j&amp;rsquo;ai réussi à intégrer les machines du free tier DANS un cluster Kubernetes managé, bien plus agréable à utiliser. Stay tuned pour l&amp;rsquo;article à venir ;).&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Pour Talos Linux sur Oracle Cloud Infrastructure (OCI) et plus spécifiquement intégrer les machines à Omni, il y a quelques étapes de configuration nécessaires.&lt;/p&gt;
&lt;p&gt;Note : ce tutoriel s&amp;rsquo;appuie partiellement sur &lt;a class="link" href="https://www.talos.dev/v1.9/talos-guides/install/cloud-platforms/oracle/" target="_blank" rel="noopener"
&gt;la documentation officielle de Talos Linux&lt;/a&gt;, adaptée pour Omni et avec des détails complémentaires sur Oracle Cloud Infrastructure.&lt;/p&gt;
&lt;p&gt;Je pars du principe que vous avez déjà un compte sur Oracle Cloud Infrastructure, ainsi que les binaires &lt;code&gt;talosctl&lt;/code&gt; et la CLI &lt;code&gt;oci&lt;/code&gt;. Sinon un petit :&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;brew update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew install oci-cli talosctl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Authentifiez-vous avec l&amp;rsquo;outil CLI :&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;oci session authenticate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Lorsque l&amp;rsquo;authentification est demandée, choisissez la région correspondant à votre localisation (par exemple, eu-paris-1). Une fois terminé, vous verrez un message de confirmation dans le navigateur et il faudra donner un petit nom mignon au profil pour &lt;code&gt;oci&lt;/code&gt; dans le terminal et valider.&lt;/p&gt;
&lt;h2 id="récupération-du-compartment-id"&gt;Récupération du compartment ID
&lt;/h2&gt;&lt;p&gt;Un des concepts intéressants d&amp;rsquo;Oracle Cloud Infrastructure (qu&amp;rsquo;on retrouve chez d&amp;rsquo;autres cloud providers sous une forme ou une autre) est la notion de &amp;ldquo;compartment&amp;rdquo;. Grosso modo, les ressources sont stockées dans des &amp;ldquo;compartiments&amp;rdquo; (la traduction littérale fonctionne pour comprendre) pour organiser les ressources.&lt;/p&gt;
&lt;p&gt;On peut travailler dans le &amp;ldquo;root&amp;rdquo; compartment, mais c&amp;rsquo;est quand même plus propre d&amp;rsquo;en créer un spécifique pour l&amp;rsquo;occasion.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/01/compartments.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Exemple d&amp;rsquo;OCID :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ocid1.compartment.oc1..aaaaaaaayrmiilkb5m2b7never345435gonna345give87978you12upu6ifoh6csihm4awsjq
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="préparation-de-lenvironnement-oracle-cloud"&gt;Préparation de l&amp;rsquo;environnement Oracle Cloud
&lt;/h2&gt;&lt;p&gt;Une fois qu&amp;rsquo;on a ça, on va utiliser la CLI pour créer tous les trucs dont on va avoir besoin pour que nos machines virtuelles puissent s&amp;rsquo;enregistrer sur le SaaS d&amp;rsquo;omni.&lt;/p&gt;
&lt;p&gt;Création d&amp;rsquo;un VCN (Virtual Cloud Network) et configuration réseau :&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="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;cidr_block&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.0.0.0/16
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;subnet_block&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.0.0.0/24
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;compartment_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;votre_ocid_compartment&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Créer le VCN et le sous-réseau :&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="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;vcn_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;oci network vcn create --cidr-block &lt;span class="nv"&gt;$cidr_block&lt;/span&gt; --display-name talos-example --compartment-id &lt;span class="nv"&gt;$compartment_id&lt;/span&gt; --query data.id --raw-output&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;rt_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;oci network subnet create --cidr-block &lt;span class="nv"&gt;$subnet_block&lt;/span&gt; --display-name kubernetes --compartment-id &lt;span class="nv"&gt;$compartment_id&lt;/span&gt; --vcn-id &lt;span class="nv"&gt;$vcn_id&lt;/span&gt; --query data.route-table-id --raw-output&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;À l&amp;rsquo;issue de la 2e commande, on récupère non pas l&amp;rsquo;OCID du subnet (on n&amp;rsquo;en a pas besoin), mais celui de la &amp;ldquo;Route Table&amp;rdquo;, un sous-composant du subnet, qui permet de définir la table de routage du subnet qu&amp;rsquo;on vient de créer.&lt;/p&gt;
&lt;p&gt;Configurer une passerelle (Internet Gateway) :&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="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;ig_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;oci network internet-gateway create --compartment-id &lt;span class="nv"&gt;$compartment_id&lt;/span&gt; --is-enabled &lt;span class="nb"&gt;true&lt;/span&gt; --vcn-id &lt;span class="nv"&gt;$vcn_id&lt;/span&gt; --query data.id --raw-output&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ajouter une règle de routage (à notre route table) pour permettre l&amp;rsquo;accès Internet :&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;oci network route-table update --rt-id &lt;span class="nv"&gt;$rt_id&lt;/span&gt; --route-rules &lt;span class="s2"&gt;&amp;#34;[{\&amp;#34;cidrBlock\&amp;#34;:\&amp;#34;0.0.0.0/0\&amp;#34;,\&amp;#34;networkEntityId\&amp;#34;:\&amp;#34;&lt;/span&gt;&lt;span class="nv"&gt;$ig_id&lt;/span&gt;&lt;span class="s2"&gt;\&amp;#34;}]&amp;#34;&lt;/span&gt; --force
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Désactiver les règles par défaut du pare-feu (YOLO) :&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="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;sl_id&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;oci network vcn list --compartment-id &lt;span class="nv"&gt;$compartment_id&lt;/span&gt; --query &lt;span class="s1"&gt;&amp;#39;data[0].&amp;#34;default-security-list-id&amp;#34;&amp;#39;&lt;/span&gt; --raw-output&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;À partir de là, on a la partie réseau fonctionnelle, prête à accueillir nos machines !&lt;/p&gt;
&lt;h2 id="mais-ce-nest-pas-terminé--"&gt;Mais ce n&amp;rsquo;est pas terminé :-/
&lt;/h2&gt;&lt;p&gt;Chez Oracle Cloud Infrastructure, il est possible de booter une liste d&amp;rsquo;OS prédéfinis, mais dans notre cas, Talos Linux n&amp;rsquo;est pas dans la liste.&lt;/p&gt;
&lt;p&gt;Heureusement, Omni va nous générer un disque virtuel préconfiguré avec nos credentials, qui va nous permettre d&amp;rsquo;enrôler des serveurs Talos Linux à notre SaaS Omni dès le premier boot. Classe 😎.&lt;/p&gt;
&lt;p&gt;On se connecte donc à notre interface Omni et on télécharge l&amp;rsquo;image de Talos Linux adaptée :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/01/omni_iso_generation.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ici, j&amp;rsquo;ai choisi la version 1.9.1 (la toute dernière car on aime le danger), pour architecture amd64. Je récupère l&amp;rsquo;image &lt;code&gt;oracle-amd64-omni-zwindler-v1.9.1.qcow2.xz&lt;/code&gt; que je décompresse :&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;xz --decompress ./oracle-amd64-omni-zwindler-v1.9.1.qcow2.xz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Rappel : le free tier d&amp;rsquo;OCI consiste en :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;2 machines &lt;strong&gt;amd64&lt;/strong&gt; de 1 oCPU (= vCPU) et 1 Go de RAM chacune&lt;/li&gt;
&lt;li&gt;une combinaison &lt;em&gt;flexible&lt;/em&gt; d&amp;rsquo;instances &lt;strong&gt;arm64&lt;/strong&gt; ayant 1 x &lt;strong&gt;n&lt;/strong&gt; oCPU et 6 x &lt;strong&gt;n&lt;/strong&gt; Go, tant que le total n&amp;rsquo;excède pas 4 oCPU (et donc 6x4 = 24 Go de RAM).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sur OCI, il existe plusieurs formats pour importer des disques. Le plus simple est d&amp;rsquo;utiliser le format &amp;ldquo;maison&amp;rdquo; d&amp;rsquo;OCI (le .oci, extra original comme nom), qui se compose d&amp;rsquo;un fichier de métadonnées et du QCOW2.&lt;/p&gt;
&lt;p&gt;Créez le fichier de métadonnées pour l&amp;rsquo;importation, avec la shape &lt;strong&gt;VM.Standard.E2.1.Micro&lt;/strong&gt; car on a une image amd64 (sinon c&amp;rsquo;est VM.Standard.A1.Flex) :&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;cat &amp;gt; image_metadata.json &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;version&amp;#34;: 2,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;externalLaunchOptions&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;firmware&amp;#34;: &amp;#34;UEFI_64&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;networkType&amp;#34;: &amp;#34;PARAVIRTUALIZED&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;bootVolumeType&amp;#34;: &amp;#34;PARAVIRTUALIZED&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;remoteDataVolumeType&amp;#34;: &amp;#34;PARAVIRTUALIZED&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;localDataVolumeType&amp;#34;: &amp;#34;PARAVIRTUALIZED&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;launchOptionsSource&amp;#34;: &amp;#34;PARAVIRTUALIZED&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;pvAttachmentVersion&amp;#34;: 2,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;pvEncryptionInTransitEnabled&amp;#34;: true,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;consistentVolumeNamingEnabled&amp;#34;: true
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;imageCapabilityData&amp;#34;: null,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;imageCapsFormatVersion&amp;#34;: null,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;operatingSystem&amp;#34;: &amp;#34;Talos&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;operatingSystemVersion&amp;#34;: &amp;#34;1.9.1&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;additionalMetadata&amp;#34;: {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;shapeCompatibilities&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;internalShapeName&amp;#34;: &amp;#34;VM.Standard.E2.1.Micro&amp;#34;,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;ocpuConstraints&amp;#34;: null,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; &amp;#34;memoryConstraints&amp;#34;: null
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; ]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;EOF&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et créez ensuite l&amp;rsquo;image pour l&amp;rsquo;importation :&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;qemu-img convert -f raw -O qcow2 oracle-amd64-omni-zwindler-v1.9.1.raw oracle-amd64-omni-zwindler-v1.9.1.qcow2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar zcf oracle-amd64-omni-zwindler-v1.9.1.oci oracle-amd64-omni-zwindler-v1.9.1.qcow2 image_metadata.json
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="importation-de-limage-sur-oracle-cloud"&gt;Importation de l&amp;rsquo;image sur Oracle Cloud
&lt;/h2&gt;&lt;p&gt;On a le fichier prêt à être uploadé&amp;hellip; mais on l&amp;rsquo;uploade où ??&lt;/p&gt;
&lt;p&gt;Pas de chance, cette étape se fait en 2 parties. D&amp;rsquo;abord, il faut uploader le fichier .oci sur un bucket. C&amp;rsquo;est assez simple à faire dans l&amp;rsquo;UI (on aurait aussi pu le faire en CLI) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Créez un bucket dans la section Storage pour uploader l&amp;rsquo;image compressée.&lt;/li&gt;
&lt;li&gt;Uploadez l&amp;rsquo;image (oracle-amd64-omni-zwindler-v1.9.1.oci) dans ce bucket.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/01/bucket.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Deuxième étape, on transforme le fichier en &amp;ldquo;Custom images&amp;rdquo; (dans la section &lt;strong&gt;Compute&lt;/strong&gt;) :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/01/custom-images.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Cette étape est bizarrement assez longue, l&amp;rsquo;image qui ne fait que 100 Mo a pris 10 minutes à chaque essai que j&amp;rsquo;ai fait pour l&amp;rsquo;instant.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/01/custom-images-2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="création-de-la-vm"&gt;Création de la VM
&lt;/h2&gt;&lt;p&gt;Une fois l&amp;rsquo;image importée, on peut maintenant utiliser notre image customisée par Omni pour booter nos machines free tier.&lt;/p&gt;
&lt;p&gt;Je l&amp;rsquo;ai fait là aussi via l&amp;rsquo;interface OCI, mais là encore, on pourrait le faire en CLI.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/01/vm1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/01/vm2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Quelques secondes après le boot, elle apparaît dans l&amp;rsquo;UI d&amp;rsquo;Omni et peut être ajoutée à un cluster.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/01/omni-oracle.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Have fun !!&lt;/p&gt;
&lt;h2 id="addendum--est-ce-que-cest-vraiment-gratuit-"&gt;Addendum : est-ce que c&amp;rsquo;est vraiment gratuit ?
&lt;/h2&gt;&lt;p&gt;Oui&amp;hellip;-ish.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;En théorie&lt;/strong&gt;, les machines sont gratuites (forever free comme ils disent). Mais attention, plein de petits trucs peuvent être payants.&lt;/p&gt;
&lt;p&gt;Par exemple, le bucket sur lequel on a uploadé le QCOW2/.oci est très probablement payant. Idem pour la custom image, qui est facturée comme 1 Go de stockage (selon l&amp;rsquo;UI, je n&amp;rsquo;ai pas encore la facture LOL).&lt;/p&gt;
&lt;p&gt;Si vous mettez les VMs derrière un load balancer (il n&amp;rsquo;y a pas de raison que vous le fassiez ici), attention, seul le LB &amp;ldquo;non flexible&amp;rdquo; bridé à 10 Mbps est gratuit (et un seul).&lt;/p&gt;
&lt;p&gt;Et si comme moi, vous avez déjà 4 disques de 50 Go, le stockage de l&amp;rsquo;OS est payant (1,85€ / mois).&lt;/p&gt;
&lt;p&gt;Bref, vous l&amp;rsquo;aurez compris, c&amp;rsquo;est comme souvent dans le cloud, rien n&amp;rsquo;est vraiment gratuit et il faut bien lire tous les petits caractères.&lt;/p&gt;</description></item><item><title>Déployer un hyperviseur VMware ESXi avec MAAS</title><link>https://blog.zwindler.fr/2024/01/08/maas-canonical-esxi/</link><pubDate>Mon, 08 Jan 2024 18:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2024/01/08/maas-canonical-esxi/</guid><description>&lt;img src="https://blog.zwindler.fr/2024/01/bearmetal2.webp" alt="Featured image of post Déployer un hyperviseur VMware ESXi avec MAAS" /&gt;&lt;p&gt;Cet article fait partie d&amp;rsquo;une série d&amp;rsquo;articles dédiés à la découverte de MAAS, un outil de déploiement d&amp;rsquo;OS sur un parc de serveurs (souvent baremetal mais pas que) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2023/12/21/premiers-pas-avec-maas-baremetal-canonical" &gt;Premiers pas avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2024/01/04/un-peu-plus-loin-avec-maas-canonical" &gt;Un peu plus loin avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2024/01/08/maas-canonical-esxi" &gt;Déployer un hyperviseur VMware ESXi avec MAAS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="résumé-des-épisodes-précédents"&gt;Résumé des épisodes précédents
&lt;/h2&gt;&lt;p&gt;Dans les deux derniers épisodes, on a vu comment déployer MAAS sur un lab perso, comment déployer ensuite nos premiers OS sur des machines baremetal de manière automatisée, comment les customiser en changeant de version d&amp;rsquo;Ubuntu ou avec cloud-init.&lt;/p&gt;
&lt;p&gt;Mais dans les promesses de MAAS, il y a plus que ça. En théorie, on doit pouvoir démarrer &amp;ldquo;out of the box&amp;rdquo; (ouais pas tout à fait, mais je ne spoil pas plus) des serveurs d&amp;rsquo;autres OS, comme Windows (beurk) ou des hyperviseurs VMware ESXi. Et même plus (mais ça n&amp;rsquo;est pas le but de cet article pour l&amp;rsquo;instant).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/deploy-any.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="esxi-"&gt;ESXi ?
&lt;/h2&gt;&lt;p&gt;Vous l&amp;rsquo;avez compris, point de Windows Server dans ce tutoriel, cependant sachez qu&amp;rsquo;avec les deux liens que j&amp;rsquo;ai déjà donnés dans l&amp;rsquo;article précédent, vous devriez pouvoir vous en sortir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://maas.io/docs/customising-images-for-specific-needs" target="_blank" rel="noopener"
&gt;Documentation de Canonical MAAS - How to customise images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://discourse.maas.io/t/how-to-build-maas-images/5100" target="_blank" rel="noopener"
&gt;Discourse de Canonical MAAS - How to build MAAS images&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Même si c&amp;rsquo;est un hyperviseur propriétaire, j&amp;rsquo;ai quand même passé pas mal de temps à travailler avec VMware et j&amp;rsquo;ai toujours été relativement content d&amp;rsquo;ESXi (no comment sur le reste de la &amp;ldquo;suite&amp;rdquo; par contre).&lt;/p&gt;
&lt;p&gt;Note : vous pouvez d&amp;rsquo;ailleurs retrouver tous &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=vmware" target="_blank" rel="noopener"
&gt;les articles qui parlent de VMware&lt;/a&gt; sur ce blog, ça date un peu, mais il reste peut-être des trucs utiles.&lt;/p&gt;
&lt;p&gt;On va donc voir si c&amp;rsquo;est si facile que ça&amp;hellip;&lt;/p&gt;
&lt;h2 id="ubuntu-pro-"&gt;Ubuntu Pro ?
&lt;/h2&gt;&lt;p&gt;La première chose qu&amp;rsquo;on apprend dans la doc, c&amp;rsquo;est qu&amp;rsquo;il existe 2 manières de customiser des OS non Ubuntu pour les faire marcher dans MAAS :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/canonical/packer-maas" target="_blank" rel="noopener"
&gt;Packer MAAS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MAAS Image Builder&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;MAAS Image Builder nécessitant une souscription Ubuntu Pro, je vais évidemment me rabattre uniquement sur Packer MAAS&amp;hellip;&lt;/p&gt;
&lt;p&gt;Heureusement, le projet est relativement bien fourni, avec des CentOS (8 ou 9 stream), des Debian jusqu&amp;rsquo;à la 12, et donc&amp;hellip; VMware ESXi, de la 6 à la 8.&lt;/p&gt;
&lt;p&gt;Pour cet article, je me suis d&amp;rsquo;abord basé sur le &lt;a class="link" href="https://maas.io/tutorials/maas-esxi-quickstart#1-overview" target="_blank" rel="noopener"
&gt;tutoriel officiel&lt;/a&gt;, mais il est sévèrement &amp;ldquo;pas à jour&amp;rdquo; (on a un petit doute dès la première étape qui demande d&amp;rsquo;utiliser Ubuntu 18.04) et pointe vers des versions obsolètes&amp;hellip;&lt;/p&gt;
&lt;h2 id="installer-packer"&gt;Installer Packer
&lt;/h2&gt;&lt;p&gt;Comme son nom le laisse deviner, on va avoir besoin de Packer, un tool de mes copain⋅es de chez &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=hashicorp" target="_blank" rel="noopener"
&gt;Hashicorp&lt;/a&gt;. Pour l&amp;rsquo;instant personne n&amp;rsquo;a forké Packer, donc :&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;wget -O- https://apt.releases.hashicorp.com/gpg &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com &lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;lsb_release -cs&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt; main&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; sudo tee /etc/apt/sources.list.d/hashicorp.list
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install packer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On vérifie que ça a bien marché&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;packer --version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Packer v1.10.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="récupérer-un-iso-chez-vmware"&gt;Récupérer un ISO chez VMware
&lt;/h2&gt;&lt;p&gt;Alors, là, c&amp;rsquo;est la partie pénible. Si on n&amp;rsquo;est pas client VMware, il n&amp;rsquo;est pas possible de télécharger d&amp;rsquo;ISO de VMware ESXi sans :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;se créer un compte&lt;/li&gt;
&lt;li&gt;demander un trial sur une version (idéalement la dernière) d&amp;rsquo;ESXi&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C&amp;rsquo;est pénible, ça demande plein d&amp;rsquo;infos personnelles et ça pourri les BAL, mais bon&amp;hellip; c&amp;rsquo;est ça aussi, d&amp;rsquo;utiliser des logiciels privateurs. Avant, l&amp;rsquo;usage de l&amp;rsquo;ESXi était gratuit, mais visiblement, c&amp;rsquo;est de l&amp;rsquo;histoire ancienne&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/download-trial.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pas de bol, j&amp;rsquo;avais fait mes premiers tests sur VMware ESXi 8.0u1, et j&amp;rsquo;ai voulu récupérer la u2, mais voici ce que me dit VMware&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Your evaluation has expired on August 29, 2023&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Pour paraphraser un certain Linus T., &lt;strong&gt;F&amp;hellip; YOU VMware!&lt;/strong&gt; Tant pis, je vais donc faire avec l&amp;rsquo;ISO que j&amp;rsquo;ai&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;VMware-VMvisor-Installer-8.0U1a-21813344.x86_64.iso&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="récupérer-packer-maas"&gt;Récupérer packer-maas
&lt;/h2&gt;&lt;p&gt;Si vous suivez le tuto que je vous ai donné en début d&amp;rsquo;article, il y a un moment où on va vous demander un Nom/Prénom/Email pour avoir le droit de télécharger un script pour transformer notre ISO VMware en image MAAS.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://maas.io/vmware-images" target="_blank" rel="noopener"
&gt;maas.io/vmware-images&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sauf que :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;l&amp;rsquo;archive que vous allez télécharger est obsolète et ne fonctionnera pas&lt;/li&gt;
&lt;li&gt;les sources et les releases sont dispos et à jour sur le &lt;a class="link" href="https://github.com/canonical/packer-maas/tree/main" target="_blank" rel="noopener"
&gt;github du projet&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Rant: Je suis éventuellement OK pour donner mes informations personnelles en échange de l&amp;rsquo;outil, mais s&amp;rsquo;il vous plait, gardez vos tutos à jour !?!&lt;/p&gt;
&lt;p&gt;On va donc plutôt télécharger directement la dernière version de packer-maas qui supporte les Debian et des variantes de RHEL supplémentaires :) et est disponible ici (&lt;a class="link" href="https://github.com/canonical/packer-maas/releases/tag/v1.1.0" target="_blank" rel="noopener"
&gt;page de la release&lt;/a&gt; / &lt;a class="link" href="https://github.com/canonical/packer-maas/archive/refs/tags/v1.1.0.tar.gz" target="_blank" rel="noopener"
&gt;archive tgz&lt;/a&gt;)&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;wget https://github.com/canonical/packer-maas/archive/refs/tags/v1.1.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;tar xzf v1.1.0.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; packer-maas-1.1.0/vmware-esxi/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="construire-limage-vmware-esxi-pour-maas"&gt;Construire l&amp;rsquo;image VMware ESXi pour MAAS
&lt;/h2&gt;&lt;p&gt;On commence par charger le driver &lt;code&gt;nbd&lt;/code&gt;. Si comme moi, vous ne savez pas ce que c&amp;rsquo;est, sachez que c&amp;rsquo;est &lt;a class="link" href="https://en.wikipedia.org/wiki/Network_block_device" target="_blank" rel="noopener"
&gt;Network Block Devices&lt;/a&gt;.&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;sudo modprobe nbd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# si ça ne renvoie rien, c&amp;#39;est bon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ensuite, on lance Packer avec les arguments suivants :&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;sudo packer init .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo &lt;span class="nv"&gt;PACKER_LOG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt; packer build -var &lt;span class="s1"&gt;&amp;#39;vmware_esxi_iso_path=../../VMware-VMvisor-Installer-8.0U1a-21813344.x86_64.iso&amp;#39;&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note: packer-maas fourni aussi un Makefile pour vous simplifier encore plus la vie&amp;hellip; Vous pouvez juste lancer &lt;code&gt;make ISO=/path/to/VMware-VMvisor-Installer.iso&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;À ce moment-là, les scripts de packer-maas vont booter une VM avec notre ISO et réaliser des actions pour &amp;ldquo;l&amp;rsquo;installer&amp;rdquo; en envoyant des caractères dans une session VNC !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/esxi-qemu-install.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Quand on y réfléchit, c&amp;rsquo;est à la fois un peu bourrin et &lt;em&gt;awesome&lt;/em&gt; à la fois.&lt;/p&gt;
&lt;p&gt;Si tout se passe bien, vous devriez vous retrouver avec un fichier &lt;code&gt;vmware-esxi.dd.gz&lt;/code&gt; au bout de quelques minutes.&lt;/p&gt;
&lt;h2 id="esxi-dans-maas"&gt;ESXi dans MAAS
&lt;/h2&gt;&lt;p&gt;Maintenant qu&amp;rsquo;on a notre image, on va l&amp;rsquo;envoyer dans MAAS !&lt;/p&gt;
&lt;p&gt;Sur l&amp;rsquo;UI, récupérer une clé pour API (sinon on ne pourra pas pousser l&amp;rsquo;image) sur votre utilisateur (il doit être avec des privilèges &lt;strong&gt;admin&lt;/strong&gt;) :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/apikey.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Je n&amp;rsquo;ai pas trouvé de menu dans la GUI pour le faire, mais on peut loguer notre terminal avec la commande suivante (en n&amp;rsquo;oubliant pas de renseigner l&amp;rsquo;API key) :&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;maas login admin http://192.168.x.y:5240/MAAS/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;API key &lt;span class="o"&gt;(&lt;/span&gt;leave empty &lt;span class="k"&gt;for&lt;/span&gt; anonymous access&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis envoyer l&amp;rsquo;image en CLI&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;maas admin boot-resources create &lt;span class="nv"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;esxi/8.0u1&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;title&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;VMware ESXi 8.0u1&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;architecture&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;amd64/generic&amp;#39;&lt;/span&gt; &lt;span class="nv"&gt;filetype&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ddgz&amp;#39;&lt;/span&gt; content@&lt;span class="o"&gt;=&lt;/span&gt;vmware-esxi.dd.gz
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note 1 : ne faites pas de Packer sur une partition Windows montée sous Linux (fuse + packer = KK)
Note 2 : si vous avez installé MAAS en tant que snap sur votre poste, vous ne pouvez accéder aux fichiers que dans votre /home (vous vous prendrez un &amp;ldquo;no such file or directory&amp;rdquo;)&lt;/p&gt;
&lt;p&gt;À partir de là, elle devrait apparaitre dans la liste des &amp;ldquo;Images&amp;rdquo; disponibles !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/esxi-image.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s go la déployer sur une machine du lab&amp;hellip; Et au bout de quelques minutes&amp;hellip;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/esxi_booted.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/esxi-connected.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Victoire !&lt;/p&gt;</description></item><item><title>Un peu plus loin avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical</title><link>https://blog.zwindler.fr/2024/01/04/un-peu-plus-loin-avec-maas-canonical/</link><pubDate>Thu, 04 Jan 2024 06:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2024/01/04/un-peu-plus-loin-avec-maas-canonical/</guid><description>&lt;img src="https://blog.zwindler.fr/2024/01/bearmetal.webp" alt="Featured image of post Un peu plus loin avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical" /&gt;&lt;p&gt;Cet article fait partie d&amp;rsquo;une série d&amp;rsquo;articles dédiés à la découverte de MAAS, un outil de déploiement d&amp;rsquo;OS sur un parc de serveurs (souvent baremetal mais pas que) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2023/12/21/premiers-pas-avec-maas-baremetal-canonical" &gt;Premiers pas avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2024/01/04/un-peu-plus-loin-avec-maas-canonical" &gt;Un peu plus loin avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2024/01/08/maas-canonical-esxi" &gt;Déployer un hyperviseur VMware ESXi avec MAAS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Dans la première partie, nous nous étions arrêté au moment où MAAS était installé sur un Raspberry Pi, routeur entre mon LAN et mon lab. Nous avions également déployé un OS (Ubuntu 20.04 par défaut) pour valider que l&amp;rsquo;installation fonctionnait&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/maas.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans cette partie, on va essayer d&amp;rsquo;aller un peu plus loin et de faire des trucs plus funs pour déployer des OS différents, et pourquoi pas des hyperviseurs !&lt;/p&gt;
&lt;h2 id="modifier-los-par-défaut"&gt;Modifier l&amp;rsquo;OS par défaut
&lt;/h2&gt;&lt;p&gt;Il est possible de modifier l&amp;rsquo;OS installé par défaut sur nos machines lors des phases &amp;ldquo;Commissioning&amp;rdquo; et &amp;ldquo;Deploying&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Comme j&amp;rsquo;avais déjà récupéré les ISO pour Ubuntu 22.04, j&amp;rsquo;ai donc essayé de modifier toutes les étapes en Ubuntu 22.04.&lt;/p&gt;
&lt;p&gt;La procédure est assez simple, on peut même changer le kernel par défaut (pratique pour profiter des dernières avancées eBPF, notamment si vous voulez faire du Kubernetes! )&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/default_commissioning_os.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/default_deploy_os.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Rappel : la phase commissioning sert à faire une première installation d&amp;rsquo;un hôte minimal pour l&amp;rsquo;enrôler dans notre pool de serveurs disponibles avec MAAS, en vue d&amp;rsquo;une future installation. Si on veut modifier l&amp;rsquo;OS installé par défaut quand on déploie une machine, c&amp;rsquo;est bien le menu de la phase &amp;ldquo;Deploying&amp;rdquo; qu&amp;rsquo;il faut modifier.&lt;/p&gt;
&lt;h2 id="déployer-un-hôte-kvm"&gt;Déployer un hôte &amp;ldquo;KVM&amp;rdquo;
&lt;/h2&gt;&lt;p&gt;Par défaut, il est également possible de déployer des hôtes qui vont gérer des machines virtuelles directement depuis MAAS.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/deploy_libvirt.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/deploy_lxd.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Même si j&amp;rsquo;avais le doute au début, les machines LXD sont bien de vraies machines virtuelles (pas de containers LXC), comme l&amp;rsquo;explique la documentation officielle &lt;a class="link" href="https://web.archive.org/web/20231204160638/https://maas.io/docs/virtual-machines#heading--lxd-vs-libvirt" target="_blank" rel="noopener"
&gt;LXD vs libvirt - maas.io/docs/virtual-machines (lien mort, j&amp;rsquo;utilise Internet Archive)&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Both libvirt KVMs and LXD VMs are based on QEMU, but LXD VMs offer more advantages such as enhanced security and a robust API. Unlike libvirt KVMs, LXD VMs can be managed remotely without requiring SSH access.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A noter, les machines &lt;em&gt;libvirt&lt;/em&gt; sont aujourd&amp;rsquo;hui considérées comme &amp;ldquo;legacy&amp;rdquo; et il n&amp;rsquo;est pas possible d&amp;rsquo;en ajouter provenant de l&amp;rsquo;extérieur dans l&amp;rsquo;UI 3.4.0 beta que j&amp;rsquo;ai installé, contrairement aux machines LXD qui peuvent être ajoutées à MAAS même si elles ne sont pas sur des serveurs gérés par MAAS.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/virsh_host.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/lxd_host.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On peut ensuite aller dans virsh/LXD (selon ce qu&amp;rsquo;on a choisi) et poper des VMs depuis l&amp;rsquo;interface de MAAS.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/compose_vm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et ce qui est rigolo, c&amp;rsquo;est qu&amp;rsquo;on peut ensuite installer des trucs sur ces machines, qui se retrouvent dans notre liste :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/NewLXDMachine.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Machines making machines! How perverse.&lt;/p&gt;
&lt;p&gt;&amp;ndash; C3PO - Star Wars Episode 2&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Et on peut déployer des trucs dessus bien sûr ;-)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/AwesomeVM1_deploying.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/AwesomeVM1_deployed.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Bon, ce n&amp;rsquo;est par contre pas spécialement user friendly (mais ça marche). L&amp;rsquo;idée est probablement un peu plus utile avec Juju (que je ne testerai pas ici).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;VM hosts offer unique benefits when integrated with Juju, including dynamic VM allocation with custom interface constraints.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="customiser-son-os-avec-cloud-init"&gt;Customiser son OS avec cloud-init
&lt;/h2&gt;&lt;p&gt;Avouez que déployer des OS nus (juste l&amp;rsquo;OS, rien d&amp;rsquo;autre) avec MAAS, c&amp;rsquo;est cool, mais c&amp;rsquo;est quand même un poil limité en prod. Pour aller plus loin, MAAS nous donne accès à plusieurs mécanismes pour customiser notre OS.&lt;/p&gt;
&lt;p&gt;Pour faire simple et parce que c&amp;rsquo;est devenu un des standards du marché, je vais tester l&amp;rsquo;utilisation de cloud-init avec MAAS pour customiser mon OS.&lt;/p&gt;
&lt;p&gt;Et parce que j&amp;rsquo;aime Kubernetes, je vais poper un &amp;ldquo;cluster&amp;rdquo; de test avec microk8s. En l&amp;rsquo;état celà ne servira pas à grand-chose en utilisation réelle, mais ça vous donne une idée de ce qu&amp;rsquo;on peut faire avec.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/maas-cloud-init.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;#cloud-config
runcmd:
- |
# install and start microk8s
snap install microk8s --classic
microk8s start
usermod -a -G microk8s ubuntu
mkdir /home/ubuntu/.kube
chown -R ubuntu ~/.kube
apt_update: true
apt_upgrade: true
package_update: true
package_upgrade: true
package_reboot_if_required: false
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Au bout de quelques minutes, la machine est déployée, et l&amp;rsquo;OS est correctement customisé :&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;ssh -J 192.168.x.y ubuntu@10.10.0.4
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;microk8s kubectl get pods
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;No resources found in default namespace.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note : Ici j&amp;rsquo;utilise le RPi comme &amp;ldquo;JumpHost&amp;rdquo; car je n&amp;rsquo;ai pas d&amp;rsquo;accès direct aux machines depuis mon LAN.&lt;/p&gt;
&lt;h2 id="aller-plus-loin---déployer-ses-propres-images-sur-ses-machines"&gt;Aller plus loin - déployer ses propres images sur ses machines
&lt;/h2&gt;&lt;p&gt;Ici, je tease un peu le(s) prochain(s) article(s). Ne vous attendez pas à lire la solution ici, il faudra attendre un peu ;-).&lt;/p&gt;
&lt;p&gt;Par défaut, les OS disponibles sur MAAS proviennent d&amp;rsquo;images qui sont stockées sur maas.io. On y retrouve toutes les LTS d&amp;rsquo;Ubuntu jusqu&amp;rsquo;à la 12.04 (!?!) ainsi que les non-LTS de la 20.10 à la 23.10, et pour plusieurs architectures.&lt;/p&gt;
&lt;p&gt;Dans la section &amp;ldquo;Other Images&amp;rdquo;, il n&amp;rsquo;y a malheureusement que CentOS 7 et 8.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2024/01/images-sync.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Pour utiliser d&amp;rsquo;autres images, on va pouvoir utiliser des &lt;em&gt;registry customs&lt;/em&gt; depuis l&amp;rsquo;interface ou créer nos propres builds qu&amp;rsquo;on poussera sur l&amp;rsquo;interface.&lt;/p&gt;
&lt;p&gt;Si vous êtes trop curieux, je vous laisse quand même quelques liens qui devraient vous donner une bonne idée de ce qu&amp;rsquo;on va faire la prochaine fois.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://maas.io/docs/customising-images-for-specific-needs" target="_blank" rel="noopener"
&gt;Documentation de Canonical MAAS - How to customise images&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://discourse.maas.io/t/how-to-build-maas-images/5100" target="_blank" rel="noopener"
&gt;Discourse de Canonical MAAS - How to build MAAS images&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En attendant, have fun !&lt;/p&gt;</description></item><item><title>Premiers pas avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical</title><link>https://blog.zwindler.fr/2023/12/21/premiers-pas-avec-maas-baremetal-canonical/</link><pubDate>Thu, 21 Dec 2023 14:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2023/12/21/premiers-pas-avec-maas-baremetal-canonical/</guid><description>&lt;img src="https://blog.zwindler.fr/2023/12/pxe_tftp2.webp" alt="Featured image of post Premiers pas avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical" /&gt;&lt;p&gt;Cet article fait partie d&amp;rsquo;une série d&amp;rsquo;articles dédiés à la découverte de MAAS, un outil de déploiement d&amp;rsquo;OS sur un parc de serveurs (souvent baremetal mais pas que) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2023/12/21/premiers-pas-avec-maas-baremetal-canonical" &gt;Premiers pas avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2024/01/04/un-peu-plus-loin-avec-maas-canonical" &gt;Un peu plus loin avec MAAS - Metal as a Service, l’outil de déploiement de machines baremetal de Canonical&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2024/01/08/maas-canonical-esxi" &gt;Déployer un hyperviseur VMware ESXi avec MAAS&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Il y a quelques mois, après plusieurs discussions avec mon collègue (et ami!) Julien, j&amp;rsquo;ai voulu tester MAAS (Metal As A Service) sur mon homelab.&lt;/p&gt;
&lt;p&gt;Pour ceux qui ne connaissent pas cet outil, c&amp;rsquo;est un logiciel qui va permettre de déployer des machines baremetal de manière automatique.&lt;/p&gt;
&lt;p&gt;En théorie, l&amp;rsquo;outil est plutôt prévu pour faciliter le déploiement de serveurs de manière flexible en datacenters, mais il existe plusieurs exemples de personnes qui ont réussi à l&amp;rsquo;utiliser sur des NUCs ou des machines desktop.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est donc un parfait premier cas d&amp;rsquo;usage pour mon homelab, composé de &lt;a class="link" href="https://blog.zwindler.fr/2023/03/16/lab-2023-dell-micro-occasion" &gt;3 dell micro et d&amp;rsquo;un raspberry pi&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/03/dell_lab.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;avais deux possibilités en termes d&amp;rsquo;architecture et j&amp;rsquo;ai d&amp;rsquo;ailleurs testé les deux. La première était de créer le lab dans mon LAN. Ca nécessite de bidouiller un peu le DHCP de ma box Bouygues pour que MAAS puisse gérer les IPs des machines ainsi que de configurer le DHCP pour propager le PXE.&lt;/p&gt;
&lt;p&gt;A priori c&amp;rsquo;est faisable, mais j&amp;rsquo;ai trouvé ça pénible dans l&amp;rsquo;idée et potentiellement disruptif pour mon LAN perso, alors j&amp;rsquo;ai décidé de mettre le homelab dans un LAN à part, dont le RPi serait le routeur. J&amp;rsquo;ai ajouté une interface réseau à l&amp;rsquo;aide d&amp;rsquo;un adaptateur ethernet USB et roule ma poule.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/maas.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;A l&amp;rsquo;époque (en juin), ça n&amp;rsquo;avait pas marché (peut être à cause d&amp;rsquo;un bug ?), les machines étaient bien déployables, mais je ne pouvais pas réaliser l&amp;rsquo;action &amp;ldquo;Deploy&amp;rdquo;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Node has no address family in common with the server
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cependant, cette fois-ci, ça a marché ! Voici donc un premier article sur le sujet !&lt;/p&gt;
&lt;h2 id="préparer-le-rpi"&gt;Préparer le RPI
&lt;/h2&gt;&lt;p&gt;Avant de toucher aux Dell micro, j&amp;rsquo;ai donc commencé par configurer le Raspberry Pi, avec Rpi Imager.&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#1-overview" target="_blank" rel="noopener"
&gt;https://ubuntu.com/tutorials/how-to-install-ubuntu-on-your-raspberry-pi#1-overview&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/rpi1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/rpi2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois la carte préparée, sur la partition system-boot, éditer le fichier &lt;code&gt;config.txt&lt;/code&gt; pour configurer l&amp;rsquo;écran portable (ou &lt;code&gt;/boot/firmware/config.txt&lt;/code&gt; une fois booté). Ici, ça sert juste pour mon petit écran portable 7 pouces (peut être que ça peut aider dans d&amp;rsquo;autres cas) mais je vous le mets quand même, pour info.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;[all]
max_usb_current=1
hdmi_force_hotplug=1
config_hdmi_boost=10
hdmi_group=2
hdmi_mode=87
hdmi_cvt 1024 600 60 6 0 0 0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On boot le pi, on se connecte en ssh, on update/upgrade tous les packages et on reboot, histoire de commencer sur des bases saines.&lt;/p&gt;
&lt;h2 id="installer-maas-sur-le-rpi"&gt;Installer MAAS sur le RPI
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://maas.io/docs/how-to-do-a-fresh-install-of-maas" target="_blank" rel="noopener"
&gt;maas.io/docs/how-to-do-a-fresh-install-of-maas&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En prérequis MAAS demande de désactiver le client ntp existant pour éviter des conflits&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;sudo systemctl disable --now systemd-timesyncd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et comme j&amp;rsquo;ai décidé que mes machines seraient dans un LAN à part (cf schéma ci-dessus) et que le RPi serait le &amp;ldquo;routeur&amp;rdquo; entre les deux, il faut bien sûr autoriser le routage :&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;sudo vi /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; net.ipv4.ip_forward &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; net.ipv6.conf.all.forwarding&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo sysctl -p /etc/sysctl.conf
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et pour finir, je vais configurer mon resolver DNS dans &lt;code&gt;/etc/resolv.conf&lt;/code&gt; sur ma Box internet&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;sudo vi /etc/resolv.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; nameserver @IP
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Addendum : histoire d&amp;rsquo;éviter des soucis de changement d&amp;rsquo;adresse IP à cause de mon DHCP pourri, on fixe les IPs via une configuration netplan. Ici, mon interface ethernet du RPi est eth0 (celle reliée à mon LAN) et celle (USB) reliée à mon lab et aux 3 dell micros est enxa0cec80428b7.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="l"&gt;vi /etc/netplan/50-cloud-init.yaml&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;network&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;ethernets&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;eth0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;192.168&lt;/span&gt;&lt;span class="l"&gt;.x.y/24]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;gateway4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;192.168&lt;/span&gt;&lt;span class="l"&gt;.x.z&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;nameservers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;9.9.9.9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;192.168&lt;/span&gt;&lt;span class="l"&gt;.x.z]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;enxa0cec80428b7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;dhcp4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;addresses&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;10.10.0.1&lt;/span&gt;&lt;span class="l"&gt;/16]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Et on valide avec&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;netplan apply
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si vous suivez la doc bêtement comme je le fais moi, MAAS propose de s&amp;rsquo;installer en tant que snap. Si c&amp;rsquo;est le cas, il ne pourra accéder qu&amp;rsquo;à /home et /media (cf &lt;a class="link" href="https://discourse.maas.io/t/maas-boot-resources-create-fails-with-no-such-file-or-directory/3627" target="_blank" rel="noopener"
&gt;ce post sur le discourse de maas.io&lt;/a&gt;). Il existe aussi une version .deb de MAAS mais pour le test je me suis contenté de ça.&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;zwindler@maas:~$ sudo snap install --channel&lt;span class="o"&gt;=&lt;/span&gt;3.4/beta maas
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;maas &lt;span class="o"&gt;(&lt;/span&gt;3.4/beta&lt;span class="o"&gt;)&lt;/span&gt; 3.4.0-14319-g.3ab76533f from Canonical✓ installed
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note : point important, l&amp;rsquo;expérience utilisateur entre la version 3.3 et la version 3.4 est significativement différente. Au delà de l&amp;rsquo;UI qui change d&amp;rsquo;un menu horizontal à un menu vertical, certaines opérations semblent ne pas être totalement identiques. Il est possible que ce tuto ne marche pas en 3.3.&lt;/p&gt;
&lt;p&gt;Plutôt qu&amp;rsquo;installer une base PostgreSQL pour stocker les données de MAAS, je vais également simplement utiliser le snap &lt;code&gt;maas-test-db&lt;/code&gt;, qui comme son nom l&amp;rsquo;indique, est une base de données postgres préconfigurée pour faire des tests avec MAAS (donc pas production ready !).&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;zwindler@maas:~$ sudo snap install maas-test-db
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;maas-test-db &lt;span class="o"&gt;(&lt;/span&gt;3.3/stable&lt;span class="o"&gt;)&lt;/span&gt; 14.2-29-g.ed8d7f2 from Canonical✓ installed
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A partir de là, mon Raspberry Pi 4 modèle 2 Go (oui j&amp;rsquo;ai été radin) est à l&amp;rsquo;agonie. Heureusement, un petit reboot suffit à lui donner un second souffle.&lt;/p&gt;
&lt;h2 id="configurer-maas"&gt;Configurer MAAS
&lt;/h2&gt;&lt;p&gt;Une fois que c&amp;rsquo;est fait, on peut initialiser notre MAAS en mode &amp;ldquo;region+rack&amp;rdquo;. Ca va nous permettre d&amp;rsquo;avoir la totalité des fonctionnalités sur le serveur MAAS du RPi.&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;zwindler@maas:~$ sudo maas init region+rack --database-uri maas-test-db:///
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MAAS URL &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;default&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;http://@IP:5240/MAAS&lt;span class="o"&gt;]&lt;/span&gt;: &lt;span class="o"&gt;(&lt;/span&gt;valider avec entrée&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;/&lt;span class="o"&gt;]&lt;/span&gt; Performing database migrations
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MAAS has been &lt;span class="nb"&gt;set&lt;/span&gt; up.
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;If you want to configure external authentication or use
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;MAAS with Canonical RBAC, please run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo maas configauth
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;To create admins when not using external authentication, run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo maas createadmin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;To &lt;span class="nb"&gt;enable&lt;/span&gt; TLS &lt;span class="k"&gt;for&lt;/span&gt; secured communication, please run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo maas config-tls &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour faire simple, je ne vais pas configurer une authentification externe et me contenter (là encore) de simplement créer un utilisateur local d&amp;rsquo;administration :&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;zwindler@maas:~$ sudo maas createadmin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Username: zwindler
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Password:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Again:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Email: blog@zwindler.fr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Import SSH keys &lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;lp:user-id or gh:user-id&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On peut donc ouvrir la page d&amp;rsquo;admin (http://@IP:5240/MAAS/r/) et rentrer le login/mdp qu&amp;rsquo;on vient de créer.&lt;/p&gt;
&lt;p&gt;La première chose qu&amp;rsquo;on va nous demander c&amp;rsquo;est de finir le setup via un wizard. On va créer notre première région, ajouter nos premières images, ajouter une clé SSH&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/wizard1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/wizard2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/wizard3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/wizard4.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="configurer-un-subnet"&gt;Configurer un subnet
&lt;/h2&gt;&lt;p&gt;Une fois le wizard terminé, on va avoir l&amp;rsquo;auto-découverte de ce qui se passe sur notre LAN. Le truc, c&amp;rsquo;est que dans mon cas précis, ce n&amp;rsquo;est pas ce qui est sur mon LAN (de ma box) qui m&amp;rsquo;intéresse, mais ce qui va être sur le LAN de MAAS, via mon autre interface Ethernet (USB).&lt;/p&gt;
&lt;p&gt;Je vais donc créer un réseau interne 10.10.0.0/16 (cf la doc &lt;a class="link" href="https://maas.io/docs/about-networking" target="_blank" rel="noopener"
&gt;maas.io/docs/about-networking&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/network1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois créé, je l&amp;rsquo;édite pour ajouter des infos&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/network2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/network3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;De retour sur la fabric, on va sur le VLAN par défaut et on configure le DHCP&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/vlan1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/vlan2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois que c&amp;rsquo;est fait, on va pouvoir commencer à booter des machines en PXE pour les enroller dans MAAS !!&lt;/p&gt;
&lt;h2 id="enroller-des-machines"&gt;Enroller des machines
&lt;/h2&gt;&lt;p&gt;A partir de là en vrai, il n&amp;rsquo;y a plus grand-chose à faire. J&amp;rsquo;ai configuré le BIOS de mes dell micro pour qu&amp;rsquo;il boot d&amp;rsquo;abord sur le PXE. Le serveur DHCP / PXE de MAAS sur le RPi a pris le relai, et a fait booter la machine sur une image d&amp;rsquo;enrôlement.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/pxe_tftp1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/pxe_tftp2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/pxe_tftp3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Au bout de plusieurs minutes, dans l&amp;rsquo;onglet Machines, on voit mon Dell micro arriver. On peut la tester :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/test.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et là, patatra, &lt;strong&gt;error&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;En vrai, c&amp;rsquo;est parce qu&amp;rsquo;il me manque une étape. J&amp;rsquo;ai oublié d&amp;rsquo;indiquer à MAAS comment démarrer la machine.&lt;/p&gt;
&lt;p&gt;Dans mon cas, il ne s&amp;rsquo;agit pas de matériel de type &amp;ldquo;serveur&amp;rdquo;. Je ne peux donc pas piloter l&amp;rsquo;allumage de la machine à distance avec un ILO / iDRAC. De même, je n&amp;rsquo;ai pas pris de multiprise manageable (je vais y réfléchir cela dit). Je dois donc configurer la &amp;ldquo;power source&amp;rdquo; de la machine et indiquer comme &amp;ldquo;Power type&amp;rdquo; la valeur &amp;ldquo;Manual&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/power1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois que c&amp;rsquo;est fait, je fais un &amp;ldquo;Commission&amp;rdquo; (et j&amp;rsquo;appuie moi même si le bouton &amp;ldquo;On&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/commission1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/commission2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et si tous les tests sont bien passés, on doit se retrouver avec une machine à l&amp;rsquo;état &amp;ldquo;Ready&amp;rdquo;. A partir de là, je peux la &amp;ldquo;Deploy&amp;rdquo; (et il faut encore que j&amp;rsquo;appuie sur le bouton &amp;ldquo;On&amp;rdquo;).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/deploy.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et cette fois-ci, c&amp;rsquo;est une victoire ;-)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/enrolled.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/12/deployed.avif"
loading="lazy"
&gt;&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;➜ ~ ssh -J zwindler@@IP ubuntu@10.10.0.2
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Welcome to Ubuntu 20.04.6 LTS &lt;span class="o"&gt;(&lt;/span&gt;GNU/Linux 5.4.0-169-generic x86_64&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ubuntu@daring-tomcat:~$
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="liens-en-vrac"&gt;Liens en vrac
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://insights.ubuntu.com/2016/01/21/introduction-deploying-openstack-on-maas-1-9-with-juju/" target="_blank" rel="noopener"
&gt;Tutoriels MAAS+JUJU éparpillés un peu partout sur le net (insights.ubuntu.com) - part 1&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://ubuntu.com/blog/hardware-setup-deploying-openstack-on-maas-1-9-with-juju" target="_blank" rel="noopener"
&gt;Tutoriels MAAS+JUJU éparpillés un peu partout sur le net (ubuntu.com/blog) - part 2&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.naydenov.net/2016/01/maas-setup-deploying-openstack-on-maas-1-9-with-juju/" target="_blank" rel="noopener"
&gt;Tutoriels MAAS+JUJU éparpillés un peu partout sur le net (blog.naydenov.net) - part 3&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://maas.io/blog/nodes-networking-deploying-openstack-on-maas-1-9-with-juju" target="_blank" rel="noopener"
&gt;Tutoriels MAAS+JUJU éparpillés un peu partout sur le net (maas.io) - part 4&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://maas.io/tutorials/build-your-own-bare-metal-cloud-using-a-raspberry-pi-cluster-with-maas#1-overview" target="_blank" rel="noopener"
&gt;Cluster de RPi&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://maas.io/tutorials/build-a-maas-and-lxd-environment-in-30-minutes-with-multipass-on-ubuntu#7-verify-and-explore-your-maas-and-lxd-installation" target="_blank" rel="noopener"
&gt;Sur une machine (laptop)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a class="link" href="https://www.reddit.com/r/homelab/comments/12qd446/got_6_mini_pcs_working_with_maas/" target="_blank" rel="noopener"
&gt;Avec des minis Pc comme les miens&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Kubeadm, Ubuntu 22.04 et cilium - mes petites galères récentes</title><link>https://blog.zwindler.fr/2023/06/06/kubeadm-ubuntu-cilium-mes-petites-galeres/</link><pubDate>Tue, 06 Jun 2023 12:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2023/06/06/kubeadm-ubuntu-cilium-mes-petites-galeres/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/06/kubernetes2.webp" alt="Featured image of post Kubeadm, Ubuntu 22.04 et cilium - mes petites galères récentes" /&gt;&lt;h2 id="kubernetes-le-retour-de-la-vengeance"&gt;Kubernetes, le retour de la vengeance
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;ai été pas mal pris ces derniers temps, autant côté pro que côté perso, et j&amp;rsquo;ai un peu délaissé mes clusters Kubernetes (qui vivent leur vie).&lt;/p&gt;
&lt;p&gt;Aussi, quand j&amp;rsquo;ai eu le temps de m&amp;rsquo;y remettre, j&amp;rsquo;ai perdu pas mal de temps sur plusieurs &amp;ldquo;petites&amp;rdquo; bêtises liés, la plupart du temps à des modifications introduites dans les composants de ma stacks.&lt;/p&gt;
&lt;p&gt;Une preuve (si c&amp;rsquo;était nécessaire) qu&amp;rsquo;il est important de se maintenir à la page, à jour et surtout de bien lire les changelogs.&lt;/p&gt;
&lt;p&gt;Voici donc la liste des soucis que j&amp;rsquo;ai rencontrés et de comment on les corrige / contourne.&lt;/p&gt;
&lt;h2 id="cilium-et-kernel-ubuntu-minimal"&gt;cilium et kernel Ubuntu Minimal
&lt;/h2&gt;&lt;p&gt;L&amp;rsquo;an dernier, j&amp;rsquo;ai décidé de concevoir un nouveau talk inspiré de &amp;ldquo;dessine moi un cluster&amp;rdquo; de Jérôme Petazzoni. Dans ce talk dont j&amp;rsquo;ai déjà parlé ici, je construis en live coding un &amp;ldquo;cluster&amp;rdquo; Kubernetes brique par brique, binaire par binaire.&lt;/p&gt;
&lt;p&gt;Et pour le CNI, j&amp;rsquo;avais choisi Cilium que j&amp;rsquo;utilise par ailleurs et que j&amp;rsquo;aime bien.&lt;/p&gt;
&lt;p&gt;Sauf que 2 jours avant de monter sur scène, j&amp;rsquo;ai changé d&amp;rsquo;hébergeur un peu en urgence (problème de disponibilité) et patatra, le talk ne marchait plus. Cilium avait l&amp;rsquo;air de s&amp;rsquo;installer correctement mais les pods finissaient par crasher, rendant toute communication avec les Pods / Services de mon cluster impossible&amp;hellip;&lt;/p&gt;
&lt;p&gt;En creusant un peu, je suis tombé sur ces logs dans le container de l&amp;rsquo;agent cilium sur mon node :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code class="language-log" data-lang="log"&gt;level=warning msg=&amp;#34;+ tc qdisc replace dev cilium_vxlan clsact&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;RTNETLINK answers: Operation not supported&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;+ true&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;++ grep -v &amp;#39;pref 1 bpf chain 0 $\\|pref 1 bpf chain 0 handle 0x1&amp;#39;&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;++ tc filter show dev cilium_vxlan ingress&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;RTNETLINK answers: Operation not supported&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;Dump terminated&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;+ &amp;#39;[&amp;#39; -z &amp;#39;&amp;#39; &amp;#39;]&amp;#39;&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;+ cilium bpf migrate-maps -s bpf_overlay.o&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;+ tc filter replace dev cilium_vxlan ingress prio 1 handle 1 bpf da obj bpf_overlay.o sec from-overlay&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;RTNETLINK answers: Operation not supported&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;We have an error talking to the kernel&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;+ cilium bpf migrate-maps -e bpf_overlay.o -r 1&amp;#34; subsys=datapath-loader
level=warning msg=&amp;#34;+ return 1&amp;#34; subsys=datapath-loader
level=fatal msg=&amp;#34;Error while creating daemon&amp;#34; error=&amp;#34;error while initializing daemon: failed while reinitializing datapath: exit status 1&amp;#34; subsys=daemon
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Et le message important là dedans, c&amp;rsquo;est &lt;code&gt;RTNETLINK answers: Operation not supported&lt;/code&gt;, qui m&amp;rsquo;a permis de trouver &lt;a class="link" href="https://github.com/cilium/cilium/issues/20858#issuecomment-1212024027" target="_blank" rel="noopener"
&gt;cette issue sur le dépôt github de cilium&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Lorsque j&amp;rsquo;avais changé d&amp;rsquo;hébergeur, je n&amp;rsquo;avais pas fait attention mais les machines Ubuntu livrées l&amp;rsquo;étaient avec une install &amp;ldquo;minimal&amp;rdquo; sur laquelle il manque des capabilities, en particulier &lt;code&gt;CONFIG_NET_CLS_ACT=y&lt;/code&gt; qui est un des prérequis de cilium.&lt;/p&gt;
&lt;p&gt;Cependant, l&amp;rsquo;installation échoue silencieusement (ou alors c&amp;rsquo;est discret). Un gros warning aurait été le bienvenu&amp;hellip;&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;erreur disparaît quand on change de kernel ou d&amp;rsquo;image de base.&lt;/p&gt;
&lt;h2 id="containerd-et-cgroups-systemd"&gt;containerd et cgroups systemd
&lt;/h2&gt;&lt;p&gt;En essayant de créer un nouveau cluster Kubernetes avec &lt;code&gt;kubeadm&lt;/code&gt; sur des machines Ubuntu 22.04, je me suis retrouvé assez vite avec un problème bizarre et très vite bloquant : les noeuds de mon cluster etcd tombaient les uns à la suite des autres, provoquant on crash du cluster.&lt;/p&gt;
&lt;p&gt;Alors que tout semble ok, le container s&amp;rsquo;arrête avec un laconique &lt;code&gt;received signal; shutting down&lt;/code&gt; :&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;2022-02-05&lt;/span&gt;&lt;span class="err"&gt;T&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;42.582666628&lt;/span&gt;&lt;span class="err"&gt;Z&lt;/span&gt; &lt;span class="err"&gt;stderr&lt;/span&gt; &lt;span class="err"&gt;F&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;level&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;info&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-02-05T00:46:42.582Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;embed/serve.go:188&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;serving client traffic securely&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;address&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;172.31.58.179:2379&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;2022-02-05&lt;/span&gt;&lt;span class="err"&gt;T&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;42.582757689&lt;/span&gt;&lt;span class="err"&gt;Z&lt;/span&gt; &lt;span class="err"&gt;stderr&lt;/span&gt; &lt;span class="err"&gt;F&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;level&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;info&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-02-05T00:46:42.582Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;etcdmain/main.go:47&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;notifying init daemon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;2022-02-05&lt;/span&gt;&lt;span class="err"&gt;T&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;42.58276643&lt;/span&gt;&lt;span class="err"&gt;Z&lt;/span&gt; &lt;span class="err"&gt;stderr&lt;/span&gt; &lt;span class="err"&gt;F&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;level&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;info&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-02-05T00:46:42.582Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;etcdmain/main.go:53&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;successfully notified init daemon&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;2022-02-05&lt;/span&gt;&lt;span class="err"&gt;T&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;42.582906352&lt;/span&gt;&lt;span class="err"&gt;Z&lt;/span&gt; &lt;span class="err"&gt;stderr&lt;/span&gt; &lt;span class="err"&gt;F&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;level&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;info&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-02-05T00:46:42.582Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;embed/serve.go:188&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;serving client traffic securely&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;address&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;127.0.0.1:2379&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="mi"&gt;2022-02-05&lt;/span&gt;&lt;span class="err"&gt;T&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="mf"&gt;2.302978572&lt;/span&gt;&lt;span class="err"&gt;Z&lt;/span&gt; &lt;span class="err"&gt;stderr&lt;/span&gt; &lt;span class="err"&gt;F&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;level&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;info&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2022-02-05T00:56:02.302Z&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;caller&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;osutil/interrupt_unix.go:64&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;msg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;received signal; shutting down&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;signal&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;terminated&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;En réalité, il s&amp;rsquo;agit d&amp;rsquo;une modification d&amp;rsquo;un paramètre de &lt;code&gt;containerd&lt;/code&gt; que je n&amp;rsquo;avais jamais eu besoin de modifier lors de mes installations précédentes mais qui semble nécessaire maintenant.&lt;/p&gt;
&lt;p&gt;En effet, quand on génère la configuration par défaut de container avec la commande &lt;code&gt;containerd config default&lt;/code&gt;, la valeur SystemdCgroup est à &lt;strong&gt;false&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai perdu un peu de temps mais heureusement je suis assez vite tombé sur &lt;a class="link" href="https://github.com/etcd-io/etcd/issues/13670#issuecomment-1337727102" target="_blank" rel="noopener"
&gt;cette issue&lt;/a&gt;, ainsi que sur &lt;a class="link" href="https://kubernetes.io/docs/setup/production-environment/container-runtimes/#containerd-systemd" target="_blank" rel="noopener"
&gt;la documentation officielle qui indique bien la bonne configuration à faire&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="kubeadm-et-plusieurs-interfaces"&gt;&lt;code&gt;kubeadm&lt;/code&gt; et plusieurs interfaces
&lt;/h2&gt;&lt;p&gt;Jusqu&amp;rsquo;à présent, je n&amp;rsquo;avais travaillé qu&amp;rsquo;avec des nodes qui n&amp;rsquo;avaient qu&amp;rsquo;une seule IP principale. Récemment, j&amp;rsquo;ai dû configurer &lt;code&gt;kubeadm&lt;/code&gt; sur des machines avec plusieurs IPs/VLAN.&lt;/p&gt;
&lt;p&gt;Lorsque j&amp;rsquo;ai commencé à essayer de configurer kubeadm pour qu&amp;rsquo;il en tienne compte, je me suis emmêlé les pinceaux&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;avais bien remarqué la présence d&amp;rsquo;un flag &lt;code&gt;--api-advertise&lt;/code&gt; dans la commande &lt;code&gt;kubeadm init&lt;/code&gt; mais je ne pouvais pas utiliser ce flag car j&amp;rsquo;utilise des fichiers de configuration &lt;em&gt;kubeadmcfg&lt;/em&gt; de manière à pouvoir customiser de manière plus poussée mes clusters, et l&amp;rsquo;usage de flags conjointement avec le &lt;code&gt;--config&lt;/code&gt; n&amp;rsquo;est pas supporté&lt;/p&gt;
&lt;p&gt;Mon erreur avait été d&amp;rsquo;insérer un le bloc &lt;strong&gt;localAPIEndpoint&lt;/strong&gt; (l&amp;rsquo;équivalent du &lt;code&gt;--api-advertise&lt;/code&gt; mais dans la config) dans la &lt;strong&gt;ClusterConfiguration&lt;/strong&gt; alors qu&amp;rsquo;il faut créer un autre manifest dans le même fichier avec pour kind &lt;strong&gt;InitConfiguration&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kubeadm.k8s.io/v1beta3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;InitConfiguration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;localAPIEndpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;advertiseAddress&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.0.0.4&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;bindPort&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;6443&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nn"&gt;---&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;apiVersion&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;kubeadm.k8s.io/v1beta3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;kind&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;ClusterConfiguration&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;controlPlaneEndpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;10.10.10.10&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="l"&gt;...]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cette valeur qui a priori semble ne concerner que l&amp;rsquo;API server override en fait tous les composants dans votre control plane (etcd, scheduler, controller manager) donc pas besoin de les configurer en plus.&lt;/p&gt;
&lt;p&gt;A noter, pour tout ce qui est utilisation d&amp;rsquo;une Virtual IP qui &lt;em&gt;loadbalancerait&lt;/em&gt; les requêtes vers vos APIservers, c&amp;rsquo;est bien &lt;strong&gt;controlPlaneEndpoint&lt;/strong&gt; qu&amp;rsquo;il faut utiliser.&lt;/p&gt;
&lt;h2 id="et-alors-kubelet-et-plusieurs-interfaces-"&gt;Et alors, &lt;code&gt;kubelet&lt;/code&gt; et plusieurs interfaces ?
&lt;/h2&gt;&lt;p&gt;Si jamais vous voulez modifier les IPs des composants du control plane, il est probable que vous voudrez aussi modifier celle du &lt;code&gt;kubelet&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour modifier l&amp;rsquo;&lt;em&gt;InternalIP&lt;/em&gt; de vos nodes, il est nécessaire de modifier les paramètres dans le &lt;code&gt;kubelet.conf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;A partir de là, vous avez deux possibilités. La plus simple si vous avez plusieurs hostnames pour chaque IP, est d&amp;rsquo;utiliser le paramètre &lt;code&gt;--hostname-override&lt;/code&gt; qui va permettre d&amp;rsquo;à la fois changer le hostname par défaut de la machine quand elle s&amp;rsquo;enregistre dans Kubernetes, mais aussi L&amp;rsquo;InternalIP.&lt;/p&gt;
&lt;p&gt;Dans mon cas, ça ne m&amp;rsquo;aidait pas car l&amp;rsquo;IP qui m&amp;rsquo;intéressait n&amp;rsquo;avait pas de résolution DNS et je ne voulais pas modifier le hostname tel qu&amp;rsquo;il était.&lt;/p&gt;
&lt;p&gt;Pour modifier l&amp;rsquo;interface sur laquelle &lt;code&gt;kubelet&lt;/code&gt; écoute et l&amp;rsquo;InternalIP, il est nécessaire de modifier 2 paramètres : &lt;code&gt;--address&lt;/code&gt; (pour l&amp;rsquo;interface d&amp;rsquo;écoute) et &lt;code&gt;--node-ip&lt;/code&gt; (modifier l&amp;rsquo;InternalIP)&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;kubectl get nodes -o wide
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zwindler-01 Ready control-plane 28m v1.24.14 10.0.0.4 &amp;lt;none&amp;gt; Ubuntu 22.04.2 LTS 5.19.0-42-generic containerd://1.6.21
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zwindler-02 Ready control-plane 28m v1.24.14 10.0.0.5 &amp;lt;none&amp;gt; Ubuntu 22.04.2 LTS 5.19.0-42-generic containerd://1.6.21
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zwindler-03 Ready control-plane 27m v1.24.14 10.0.0.6 &amp;lt;none&amp;gt; Ubuntu 22.04.2 LTS 5.19.0-42-generic containerd://1.6.21
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zwindler-04 Ready node 27m v1.24.14 10.0.0.7 &amp;lt;none&amp;gt; Ubuntu 22.04.2 LTS 5.19.0-42-generic containerd://1.6.21
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;zwindler-05 Ready node 27m v1.24.14 10.0.0.8 &amp;lt;none&amp;gt; Ubuntu 22.04.2 LTS 5.19.0-42-generic containerd://1.6.21
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="ubuntu-2204-et-manageforeignroutes"&gt;Ubuntu 22.04 et ManageForeignRoutes
&lt;/h2&gt;&lt;p&gt;Je ne me suis pas le seul à s&amp;rsquo;être mangé de plein fouet cette modification de systemd sur les Ubuntu récents, puisque cette modification est la &amp;ldquo;rootcause&amp;rdquo; de l&amp;rsquo;incident global de mars de Datadog (vous pouvez aller &lt;a class="link" href="https://www.datadoghq.com/blog/engineering/2023-03-08-deep-dive-into-platform-level-impact/" target="_blank" rel="noopener"
&gt;lire le postmortem ici&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;Quand j&amp;rsquo;installais cilium sur des serveurs Ubuntu 22.04, instantanément, il n&amp;rsquo;était plus possible de ping et/ou contacter les IPs locale de la machine, mais aucun problème pour contacter le reste du monde.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
^C
--- 10.0.0.1 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4076ms
$ ping 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=63 time=0.285 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=63 time=0.233 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=63 time=0.248 ms
$ traceroute 10.0.0.1
traceroute to 10.0.0.1 (10.0.0.1), 30 hops max, 60 byte packets
1 * * *
2 zwindler-01 (10.0.0.1) 0.084 ms 0.079 ms 0.060 ms
3 * * *
4 zwindler-01 (10.0.0.1) 0.075 ms 0.097 ms 0.081 ms
5 * * *
6 zwindler-01 (10.0.0.1) 0.121 ms 0.137 ms 0.145 ms
7 * * *
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je montre avec ping, mais c&amp;rsquo;était pareil avec tous les ports. Et donc, toutes les liveness des composants du control plane crashaient puisque je ne pouvais plus contacter les IPs locales !&lt;/p&gt;
&lt;p&gt;En réalité, si on creuse les &lt;a class="link" href="https://docs.cilium.io/en/v1.13/operations/system_requirements/#systemd-based-distributions" target="_blank" rel="noopener"
&gt;system requirements de cilium&lt;/a&gt;, c&amp;rsquo;est écrit !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2023/06/systemd-networkd.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Par défaut, systemd-networkd supprime toutes les routes qu&amp;rsquo;il ne connaît pas et rentre en conflit direct avec cilium, d&amp;rsquo;où les problématiques de routage cheloues.&lt;/p&gt;
&lt;p&gt;Et c&amp;rsquo;est exactement le même problème qu&amp;rsquo;a rencontré Datadog, puisqu&amp;rsquo;ils utilisent eux aussi Ubuntu 22.04 et cilium. Quand les updates sont passées, ils se sont retrouvés avec tous leurs clusters (worldwide) en vrac.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;on start-up of v248, systemd-networkd flushes all IP rules it does not know about. Five months after this initial change, an additional commit introduced in v249 made it possible to opt out of this behavior using a new &lt;code&gt;ManageForeignRoutingPolicyRules&lt;/code&gt; setting. Both these changes were backported to systemd v248 and v247.&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Mon iPad (ou Android), un écran de plus pour Ubuntu !</title><link>https://blog.zwindler.fr/2022/08/17/ipad-un-ecran-de-plus-pour-ubuntu/</link><pubDate>Fri, 05 Aug 2022 15:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2022/08/17/ipad-un-ecran-de-plus-pour-ubuntu/</guid><description>&lt;img src="https://blog.zwindler.fr/2022/08/partage3.webp" alt="Featured image of post Mon iPad (ou Android), un écran de plus pour Ubuntu !" /&gt;&lt;h2 id="astuce-bien-pratique"&gt;Astuce bien pratique
&lt;/h2&gt;&lt;p&gt;Vous avez sûrement vu des gens sur Mac connecter un iPad comme écran secondaire, en nomadisme ? C&amp;rsquo;est officiellement supporté et &lt;a class="link" href="https://support.apple.com/fr-fr/HT210380" target="_blank" rel="noopener"
&gt;mis en avant comme une fonctionnalité par Apple&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;De même, vous avez peut-être aussi croisé des gens qui ont investi dans des écrans secondaires nomades pour ordinateur portable (dans les 150€ souvent, parfois beaucoup plus).&lt;/p&gt;
&lt;p&gt;Mais admettons que vous n&amp;rsquo;ayez ni Mac, ni envie de payer pour cet équipement supplémentaire, et que vous avez une vieille tablette Android ou un iPad à disposition.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est typiquement mon cas. J&amp;rsquo;ai un laptop sous Ubuntu et un iPad acheté il y a quelques années que j&amp;rsquo;utilise de manière occasionnelle.&lt;/p&gt;
&lt;p&gt;Et rarement (surtout en conférence), il m&amp;rsquo;arrive d&amp;rsquo;avoir besoin d&amp;rsquo;un second écran (typiquement quand j&amp;rsquo;ai un livecoding et ma doc à côté).&lt;/p&gt;
&lt;h2 id="gnome-42-à-la-rescousse"&gt;GNOME 42 à la rescousse
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;avais vu passer la news sur Twitter il y a 2 mois, mais je n&amp;rsquo;avais pas encore essayé.&lt;/p&gt;
&lt;p&gt;Tout est parti de ce commentaire sur &lt;a class="link" href="https://www.reddit.com/r/gnome/comments/uz5as7/gnome_has_made_it_super_simple_to_extend_your/" target="_blank" rel="noopener"
&gt;reddit&lt;/a&gt;, faisant suite à &lt;a class="link" href="https://gitlab.gnome.org/GNOME/gnome-remote-desktop/-/merge_requests/69" target="_blank" rel="noopener"
&gt;cette PR&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Pour vous la faire courte, les développeurs de Gnome ont ajouté (entre autres choses), les &lt;em&gt;virtual monitors&lt;/em&gt; dans l&amp;rsquo;implémentation du bureau à distance inclus avec Gnome.&lt;/p&gt;
&lt;p&gt;On va tirer parti de cette fonctionnalité pour se connecter sur notre PC depuis l&amp;rsquo;iPad, mais au lieu d&amp;rsquo;afficher l&amp;rsquo;écran principal, on va afficher sur l&amp;rsquo;iPad un nouvel écran, virtuel.&lt;/p&gt;
&lt;h2 id="comment-on-lactive"&gt;Comment on l&amp;rsquo;active
&lt;/h2&gt;&lt;p&gt;Pour l&amp;rsquo;instant c&amp;rsquo;est encore un peu caché. En lisant le post reddit, vous verrez qu&amp;rsquo;il faut activer la fonction en ligne de commande&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;gsettings set org.gnome.desktop.remote-desktop.rdp screen-share-mode extend
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois que c&amp;rsquo;est fait, allez dans les paramètres (Partage ou Sharing en anglais) de votre laptop. Il faut activer &amp;ldquo;Partage&amp;rdquo; tout en haut, avant de pouvoir activer &amp;ldquo;Bureau à distance&amp;rdquo; (grisé).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/08/partage1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On active le bureau à distance RDP (avec un login et un mot de passe hein).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/08/partage2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On récupère notre IP avec votre méthode préférée (&lt;code&gt;ip --brief address show&lt;/code&gt; par exemple).&lt;/p&gt;
&lt;p&gt;Dans le cas d&amp;rsquo;un setup en nomadisme, il faudra donc connecter tout ce petit monde sur un seul et même Wi-Fi pour que ça fonctionne, ou via un VPN (sur lequel serait le laptop ET la tablette).&lt;/p&gt;
&lt;h2 id="client-rdp"&gt;Client RDP
&lt;/h2&gt;&lt;p&gt;Ensuite, sur l&amp;rsquo;iPad (ou la tablette android ou tout autre device avec un écran et capable de faire du RDP), on installe un client RDP.&lt;/p&gt;
&lt;p&gt;Le post initial parle du client officiel de Microsoft et a priori il marche bien.&lt;/p&gt;
&lt;p&gt;On configure l&amp;rsquo;iPad pour se connecter à l&amp;rsquo;IP récupérée à l&amp;rsquo;étape d&amp;rsquo;avant, on renseigne le username et le password et &amp;hellip;&lt;/p&gt;
&lt;p&gt;TADAM&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2022/08/partage3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="premiers-retours"&gt;Premiers retours
&lt;/h2&gt;&lt;p&gt;Contrairement à la fonctionnalité officielle d&amp;rsquo;Apple ou à un écran nomade, ici c&amp;rsquo;est clairement du &amp;ldquo;just hack it&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Mais&amp;hellip; ça fonctionne.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;crude, but effective&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Il y a un peu de lag avec l&amp;rsquo;aller-retour wifi, mais c&amp;rsquo;est supportable. L&amp;rsquo;écran est bien détecté même si ça me casse le positionnement de mes écrans à chaque fois.&lt;/p&gt;
&lt;p&gt;N&amp;rsquo;imaginez pas en revanche passer une vidéo dessus (quoique ?) ça ne sera probablement pas très agréable.&lt;/p&gt;
&lt;p&gt;Je verrai si j&amp;rsquo;ose l&amp;rsquo;utiliser la prochaine fois que je fais un livecoding en présentiel, ou pas :).&lt;/p&gt;</description></item><item><title>Mon PeerTube sur Ubuntu 20.04</title><link>https://blog.zwindler.fr/2021/12/06/mon-peertube-sur-ubuntu-20-04/</link><pubDate>Mon, 06 Dec 2021 06:00:00 +0000</pubDate><guid>https://blog.zwindler.fr/2021/12/06/mon-peertube-sur-ubuntu-20-04/</guid><description>&lt;img src="https://blog.zwindler.fr/2021/12/peertube.webp" alt="Featured image of post Mon PeerTube sur Ubuntu 20.04" /&gt;&lt;h2 id="pourquoi-peertube-"&gt;Pourquoi Peertube ?
&lt;/h2&gt;&lt;p&gt;Il y a plus de 15 ans (autour de 2003-2004), je m&amp;rsquo;adonnais abondamment à ma passion du moment : l&amp;rsquo;écriture, le tournage et le montage de vidéos humoristiques. J&amp;rsquo;ai fais, avec des copains, une grosse dizaine de sketch pendant une très courte période. Un genre de &amp;ldquo;Youtubeur&amp;rdquo; avant l&amp;rsquo;heure, on dira.&lt;/p&gt;
&lt;p&gt;A l&amp;rsquo;époque, quand on voulait partager en ligne des vidéos et surtout diffuser du contenu, il n&amp;rsquo;y avait pas 50 choix. On pouvait héberger soit même les vidéos sur un serveur HTTP ou FTP, mais je n&amp;rsquo;avais (du haut de mes 16 ans) pas encore l&amp;rsquo;infrastructure nécessaire pour le faire (et encore moins la ligne télécom). Du coup, je gravais mes productions sur DVDs et les projetais à un peu tout le monde dès que j&amp;rsquo;en avais l&amp;rsquo;occasion. Pas super pratique&amp;hellip;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est à peu près à ce moment là que Youtube et Dailymotion ont été créés (début 2005) et j&amp;rsquo;ai sauté sur l&amp;rsquo;occasion pour utiliser ces services qui me permettaient de diffuser à toutes mes connaissances ces vidéos sans effort.&lt;/p&gt;
&lt;p&gt;Je n&amp;rsquo;ai malheureusement plus le temps de faire le clown comme je le faisais avant (en vrai ça m&amp;rsquo;arrive encore mais 🤫) donc pendant longtemps je me suis contenté de ces services. Cependant, je ne suis pas insensible à l&amp;rsquo;hégémonie de Google sur les services en ligne. C&amp;rsquo;est pour ça qu&amp;rsquo;en tant qu&amp;rsquo;ancien utilisateur de ce type de solutions, j&amp;rsquo;ai vu d&amp;rsquo;un très bon oeil le &lt;a class="link" href="https://www.kisskissbankbank.com/fr/projects/peertube-a-free-and-federated-video-platform" target="_blank" rel="noopener"
&gt;crowfunding en 2018 de Framasoft&lt;/a&gt; dans le but de créer un logiciel permettant d&amp;rsquo;héberger soit même des plateformes de streaming vidéo.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;PeerTube, proposé par Framasoft, est l&amp;rsquo;alternative libre et décentralisée aux plateformes vidéos, qui vous donne accès à plus de 400 000 vidéos proposées par 60 000 utilisateur⋅ices et visionnées plus de 15 millions de fois&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je ne me suis jamais trop plus intéressé que ça, n&amp;rsquo;en ayant plus vraiment l&amp;rsquo;usage. Jusqu&amp;rsquo;à ce que je décide de rapatrier au même endroit toutes les vidéos enregistrées de tous mes talks, sur un coup de tête, un lundi soir.&lt;/p&gt;
&lt;h2 id="fonctionnalités"&gt;Fonctionnalités
&lt;/h2&gt;&lt;p&gt;Ce que je trouve bien avec Framasoft (ainsi que d&amp;rsquo;autres outils / projets) c&amp;rsquo;est qu&amp;rsquo;ils ont bien compris qu&amp;rsquo;ils ne battraient pas les big techs en proposant un clone libre ou open source des outils du marché. Il faut proposer aux utilisateurs un logiciel avec les fonctionnalités minimales similaires certes, MAIS, aussi proposé autre chose (en plus, ou différent).&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est totalement ce qui est fait avec PeerTube. Au delà d&amp;rsquo;une simple plateforme de streaming qu&amp;rsquo;on peut auto-héberger (et donc permettre de contribuer à un web décentralisé), c&amp;rsquo;est surtout une plateforme de streaming de vidéos en mode peer-to-peer.&lt;/p&gt;
&lt;p&gt;Un des challenges quand on fait du streaming en ligne, a fortiori quand il s&amp;rsquo;agit de vidéo, c&amp;rsquo;est qu&amp;rsquo;il est nécessaire de disposer d&amp;rsquo;une bande passante colossale pour permettre à des centaines, milliers, voire plus, d&amp;rsquo;utilisateurs de regarder plusieurs vidéos en non synchrone en même temps (pas en multicast comme l&amp;rsquo;IPTV). C&amp;rsquo;est d&amp;rsquo;ailleurs un des terrains sur lesquels se battent les ISP contre Youtube et maintenant Netflix : un portion très significative de la bande passante totale d&amp;rsquo;Internet est consommée par ces services.&lt;/p&gt;
&lt;p&gt;La solution &amp;ldquo;maline&amp;rdquo; est donc de permettre aux instances PeerTube de se fédérer entre elles afficher du contenu de plusieurs plateformes sur une seule, mais aussi aux clients connectés eux même de participer à l&amp;rsquo;envoie des &amp;ldquo;chunks&amp;rdquo; de vidéos à d&amp;rsquo;autres utilisateurs (en peer-to-peer). On peut ainsi héberger PeerTube sur des machines assez modestes et que ça marche quand même.&lt;/p&gt;
&lt;p&gt;Au delà de ça, les avantages de ce type de solutions par rapport à un hébergeur central sont :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;le code open source de la solution&lt;/li&gt;
&lt;li&gt;l&amp;rsquo;absence de traçage publicitaire&lt;/li&gt;
&lt;li&gt;l&amp;rsquo;absence de mécanismes de censure automatisée des vidéos&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Qu&amp;rsquo;est ce que je rigole quand je vois certains vidéastes, open source bashers notoires, cracher sur PeerTube et vénérer le sacro-saint Youtube, qui les châtie autant qu&amp;rsquo;il les nourri&amp;hellip;&lt;/p&gt;
&lt;h2 id="installer-peertube"&gt;Installer PeerTube
&lt;/h2&gt;&lt;p&gt;Bref, je venais de télécharger l&amp;rsquo;ensemble des replays de mes confs, j&amp;rsquo;avais installé une VM Ubuntu 20.04 vierge avec 2 vCPU, 4 Go de RAM et 100 Go de stockage plutôt véloce. En théorie, c&amp;rsquo;est suffisant si j&amp;rsquo;en crois cette &lt;a class="link" href="https://joinpeertube.org/faq#should-i-have-a-big-server-to-run-PeerTube" target="_blank" rel="noopener"
&gt;page dédiée sizing&lt;/a&gt; de la doc officielle.&lt;/p&gt;
&lt;p&gt;La documentation d&amp;rsquo;installation est elle disponible sur le site &lt;a class="link" href="https://docs.joinpeertube.org/install-any-os" target="_blank" rel="noopener"
&gt;docs.joinpeertube.org&lt;/a&gt;. Au fil des années, j&amp;rsquo;en ai vu des docs d&amp;rsquo;install. C&amp;rsquo;est d&amp;rsquo;ailleurs une des raisons d&amp;rsquo;être du blog, certains softs étant très déficitaires de ce côté et nécessitant des explications complémentaires pour le profane.&lt;/p&gt;
&lt;p&gt;Ce n&amp;rsquo;est pas du tout le cas ici. C&amp;rsquo;est sans aucun doute une des docs les plus claires, propres, détaillées que j&amp;rsquo;aie été amené de voir au fil des ans. D&amp;rsquo;autant qu&amp;rsquo;elle est rédigée en français et en anglais, et se paie le luxe d&amp;rsquo;être proposée pour une large gamme d&amp;rsquo;OS. Un grand BRAVO.&lt;/p&gt;
&lt;p&gt;Bon&amp;hellip; Elle est claire, que j&amp;rsquo;ai sauté un peu vite l&amp;rsquo;introduction 🤦‍♂️. J&amp;rsquo;ai donc évidemment commencé par louper l&amp;rsquo;encart &lt;strong&gt;Dependencies&lt;/strong&gt; (oups) qui pointe vers tout ce qu&amp;rsquo;on doit installer AVANT de commencer la doc d&amp;rsquo;installation elle même&amp;hellip;&lt;/p&gt;
&lt;p&gt;Tout ce qui est dépendances/prérequis est donc &lt;a class="link" href="https://docs.joinpeertube.org/dependencies" target="_blank" rel="noopener"
&gt;détaillé ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Je vous conseille plutôt de suivre la doc d&amp;rsquo;installation plutôt que ce billet si vous voulez installer un PeerTube. Mais pour montrer que c&amp;rsquo;est &lt;strong&gt;vraiment&lt;/strong&gt; simple, je vous &amp;ldquo;dump&amp;rdquo; les commandes que moi j&amp;rsquo;ai lancées, dans mon contexte personnel.&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;apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt upgrade
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt-get install curl sudo unzip vim
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install python3-dev python-is-python3
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install certbot nginx ffmpeg postgresql postgresql-contrib openssl g++ make redis-server git cron wget
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Une fois tout ce beau petit monde installé, on démarre redis (pas encore bien compris à quoi il servait) et postgresql.&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;sudo systemctl start redis postgresql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pour l&amp;rsquo;installation de la version 14 de &lt;code&gt;nodeJS&lt;/code&gt;, la documentation nous laisse un peu nous débrouiller, mais grosso modo on trouve &lt;a class="link" href="https://github.com/nodesource/distributions/blob/master/README.md#deb" target="_blank" rel="noopener"
&gt;tout ce qu&amp;rsquo;il faut ici&lt;/a&gt;.&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;curl -fsSL https://deb.nodesource.com/setup_14.x &lt;span class="p"&gt;|&lt;/span&gt; sudo -E bash -
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install -y nodejs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Grrrr, un &lt;code&gt;curl | sudo bash&lt;/code&gt; en 2021&amp;hellip;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ensuite, rebelote pour &lt;code&gt;yarn&lt;/code&gt;, il faut aller chercher la &lt;a class="link" href="https://github.com/yarnpkg/yarn/releases/tag/v1.22.17" target="_blank" rel="noopener"
&gt;dernière version disponible sur Github&lt;/a&gt; et pas celle installable avec &lt;code&gt;apt&lt;/code&gt; sinon ça ne fonctionnera pas (car il existe 2 versions majeures avec 2 CLI totalement différentes).&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;wget https://github.com/yarnpkg/yarn/releases/download/v1.22.17/yarn_1.22.17_all.deb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;apt install ./yarn_1.22.17_all.deb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="préparation-de-peertube"&gt;Préparation de PeerTube
&lt;/h2&gt;&lt;p&gt;Maintenant qu&amp;rsquo;on a installé tous les prérequis, il faut paramétrer l&amp;rsquo;utilisateur unix PeerTube :&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;mkdir /var/www/peertube -p
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;useradd -m -d /var/www/peertube -s /bin/bash -p peertube peertube
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;chown peertube: /var/www/peertube
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;passwd peertube
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -u peertube mkdir config storage versions
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -u peertube chmod &lt;span class="m"&gt;750&lt;/span&gt; config/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis celui de la base de données postgresql :&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;pg_ctlcluster &lt;span class="m"&gt;12&lt;/span&gt; main start
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/peertube
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -u postgres createuser -P peertube
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -u postgres psql -c &lt;span class="s2"&gt;&amp;#34;CREATE EXTENSION pg_trgm;&amp;#34;&lt;/span&gt; peertube_prod
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -u postgres psql -c &lt;span class="s2"&gt;&amp;#34;CREATE EXTENSION unaccent;&amp;#34;&lt;/span&gt; peertube_prod
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="installation-de-peertube-lui-même"&gt;Installation de PeerTube lui même
&lt;/h2&gt;&lt;p&gt;Enfin, on peut télécharger PeerTube lui même et l&amp;rsquo;installer&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="nv"&gt;VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;curl -s https://api.github.com/repos/chocobozzz/peertube/releases/latest &lt;span class="p"&gt;|&lt;/span&gt; grep tag_name &lt;span class="p"&gt;|&lt;/span&gt; cut -d &lt;span class="s1"&gt;&amp;#39;&amp;#34;&amp;#39;&lt;/span&gt; -f 4&lt;span class="k"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Latest Peertube version is &lt;/span&gt;&lt;span class="nv"&gt;$VERSION&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;sudo -u peertube wget -q &lt;span class="s2"&gt;&amp;#34;https://github.com/Chocobozzz/PeerTube/releases/download/&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/peertube-&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.zip&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -u peertube unzip -q peertube-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.zip &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo -u peertube rm peertube-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;.zip
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -u peertube ln -s versions/peertube-&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;VERSION&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; ./peertube-latest
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ./peertube-latest &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo -H -u peertube yarn install --production --pure-lockfile
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Puis configurer le service&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;sudo -u peertube cp peertube-latest/config/default.yaml config/default.yaml
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo -u peertube cp peertube-latest/config/production.yaml.example config/production.yaml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Les variables permettant de définir les informations de votre DB (mot de passe notamment), hostname, etc, sont à modifier dans le fichier &lt;code&gt;config/production.yaml&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Et enfin, on peut tout démarrer :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo cp /var/www/peertube/peertube-latest/support/systemd/peertube.service /etc/systemd/system/
sudo systemctl enable peertube
sudo systemctl start peertube
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, vous avez une instance PeerTube disponible en local uniquement sur le port 9000. Je ne vais pas détailler cette partie, vous avez compris le principe ; on va copier le fichier de configuration nginx d&amp;rsquo;exemple fourni par PeerTube et utiliser nginx+certbot comme point d&amp;rsquo;entrée / reverse proxy HTTPS de notre instance.&lt;/p&gt;
&lt;p&gt;Vous voyez, j&amp;rsquo;ai pas menti quand je dis qu&amp;rsquo;on peut installer un PeerTube en moins d&amp;rsquo;une heure. Franchement, je pense qu&amp;rsquo;en 10 minutes, c&amp;rsquo;est jouable. D&amp;rsquo;autant qu&amp;rsquo;il existe des gens qui ont écrit des roles ansible sur galaxy pour l&amp;rsquo;automatiser (&lt;a class="link" href="https://github.com/wiseflat/ansible-peertube" target="_blank" rel="noopener"
&gt;ici&lt;/a&gt; et là (github.com/kotovalexarian/ansible-role-peertube, lien mort, pas testé).&lt;/p&gt;
&lt;p&gt;Une fois tout correctement configuré, vous pourrez vous connecter en tant qu&amp;rsquo;admin et créer vos premiers utilisateurs.&lt;/p&gt;
&lt;h2 id="et-ça-ressemble-à-quoi-"&gt;Et ça ressemble à quoi ?
&lt;/h2&gt;&lt;p&gt;Si vous voulez voir mon instance (et pourquoi pas regarder un de mes replays), elle est &lt;a class="link" href="https://peertube.zwindler.fr" target="_blank" rel="noopener"
&gt;disponible ici&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;interface est hyper agréable et très intuitive (encore BRAVO). On est pas perdus, l&amp;rsquo;ajout des utilisateurs est simple à réaliser.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/12/peertube_admin_1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;On peut ensuite les configurer, comme leur ajouter des quotas par exemple.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/12/peertube_admin_2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois connecté avec l&amp;rsquo;utilisateur (il n&amp;rsquo;est pas recommandé d&amp;rsquo;utiliser l&amp;rsquo;utilisateur d&amp;rsquo;admin pour publier des vidéos), on se connecte avec et on peut commencer à créer des &amp;ldquo;chaînes&amp;rdquo;, configurer des valeurs par défaut pour nos vidéos, etc.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/12/peertube_admin_3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;interface d&amp;rsquo;upload est elle aussi hyper intuitive, on sélectionne le fichier, on configure la description et les catégorie et hop, ça upload.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/12/peertube_upload.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Une fois la vidéo publiée, elle est ajoutée dans une file de transcodage pour être adaptée au streaming (ça prend environ 1 CPU). Même en envoyant 9 vidéos d&amp;rsquo;un coup, je n&amp;rsquo;ai pas mis à genou le serveur (c&amp;rsquo;est bien géré).&lt;/p&gt;
&lt;p&gt;Ensuite, une fois la vidéo transcodée, elle devient visible et tout un chacun peu la lire, s&amp;rsquo;abonner à votre flux, etc.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/12/peertube_video.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Quant au player, que ce soit sur un navigateur ou depuis un smartphone, tout est bien intégré et fonctionne de manière fluide.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2021/12/peertube_player.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="et-demain-"&gt;Et demain ?
&lt;/h2&gt;&lt;p&gt;C&amp;rsquo;est amusant que j&amp;rsquo;aie décidé de travailler sur PeerTube 3.4 pile cette semaine, car entre le moment où j&amp;rsquo;ai installé l&amp;rsquo;instance et le moment où j&amp;rsquo;ai rédigé l&amp;rsquo;article, Framasoft a publié un billet de blog pour annoncer la disponibilité de la prochaine majeure (version 4 rc1) de Peertube.&lt;/p&gt;
&lt;p&gt;Le &lt;a class="link" href="https://framablog.org/2021/11/30/peertube-v4-prenez-le-pouvoir-pour-presenter-vos-videos/" target="_blank" rel="noopener"
&gt;billet en question est ici&lt;/a&gt;. Grosso modo, après de gros ajouts de features techniques (les lives dispos en 3.0), les features que la v4 inclue sont surtout à destination des vidéastes, pour faciliter l&amp;rsquo;administration des chaines disposant d&amp;rsquo;un grand nombre de vidéos.&lt;/p&gt;
&lt;p&gt;Ca ne m&amp;rsquo;intéresse pas forcément mais ça montre la vigueur du projet qui ajoute des fonctionnalités au fur et à mesure.&lt;/p&gt;
&lt;p&gt;Pour moi c&amp;rsquo;est un carton plein, ce projet est une grande réussite de la part de Framasoft (et Chocobozzz), le logiciel est abouti dans tous les domaines.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai envie de soutenir ce genre de projets, même si je ne suis pas sûr de vraiment l&amp;rsquo;utiliser au quotidien et j&amp;rsquo;ai donc fais un don (certes symbolique) à Framasoft pour que ce genre d&amp;rsquo;initiatives perdurent. Si vous trouvez vous aussi ce projet utile et que vous en avez les moyens, &lt;a class="link" href="https://soutenir.framasoft.org/fr/" target="_blank" rel="noopener"
&gt;je vous invite à faire de même&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="sources-additionnelles"&gt;Sources additionnelles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://joinpeertube.org/" target="_blank" rel="noopener"
&gt;Site officiel de PeerTube&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/Chocobozzz/PeerTube" target="_blank" rel="noopener"
&gt;Github du projet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://framasoft.org/fr/#soutenir" target="_blank" rel="noopener"
&gt;Soutenir Framasoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://joinpeertube.org/faq#should-i-have-a-big-server-to-run-peertube" target="_blank" rel="noopener"
&gt;FAQ Sizing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://peertube.zwindler.fr" target="_blank" rel="noopener"
&gt;Mon instance PeerTube personnelle&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>k3os, le reboot de RancherOS à la sauce k3s</title><link>https://blog.zwindler.fr/2020/12/08/k3os-le-reboot-de-rancheros-a-la-sauce-k3s/</link><pubDate>Tue, 08 Dec 2020 07:45:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/12/08/k3os-le-reboot-de-rancheros-a-la-sauce-k3s/</guid><description>&lt;img src="https://blog.zwindler.fr/2020/12/k3s.webp" alt="Featured image of post k3os, le reboot de RancherOS à la sauce k3s" /&gt;&lt;h2 id="k3os-encore-un-produit-rancher-"&gt;k3os, encore un produit Rancher ?
&lt;/h2&gt;&lt;p&gt;Oui, k3os. Je vais donc ENCORE parler d’un produit de Rancher aujourd’hui, et la raison principale est que cet article est plus ou moins la suite logique des deux précédents sur RancherOS et RKE&lt;/p&gt;
&lt;p&gt;Dans &lt;a class="link" href="https://blog.zwindler.fr/2020/10/26/kubernetes-avec-rancheros-et-rke-partie-1/" &gt;Kubernetes avec RancherOS et RKE partie 1&lt;/a&gt;, je vous expliquais que j’avais ENCORE changé d’infra et que pour le fun, j’avais souhaité essayer d’installer &lt;a class="link" href="https://blog.zwindler.fr/2020/10/26/kubernetes-avec-rancheros-et-rke-partie-1/" &gt;RancherOS&lt;/a&gt; puis &lt;a class="link" href="https://blog.zwindler.fr/2020/11/30/kubernetes-avec-rancheros-et-rke-partie-2/" &gt;RKE&lt;/a&gt;, respectivement comme distrib pour mes nodes Kubernetes et comme méthode d’installation de Kubernetes lui même.&lt;/p&gt;
&lt;p&gt;Bon, alors d’abord j’ai pas été super convaincu par RancherOS (pas seulement pour mon usage perso, mais aussi plus globalement) et en plus, j’ai découvert grâce aux commentaires que RancherOS était en fait abandonné.&lt;/p&gt;
&lt;p&gt;Bummer&amp;hellip;&lt;/p&gt;
&lt;h2 id="k3s-pour-mon-usecase-cest-quand-même-mieux"&gt;k3s pour mon usecase c’est quand même mieux
&lt;/h2&gt;&lt;p&gt;Bon en vrai ce n’était pas bien grave, car le but était de tester ces produits dont j’entendais parler depuis un moment. Mais du coup, je n’ai toujours pas de Kubernetes viable pour mes geekeries&amp;hellip;&lt;/p&gt;
&lt;p&gt;Un des outils qui correspond le mieux à mon usecase, là encore chez Rancher, c’est &lt;strong&gt;&lt;a class="link" href="https://k3s.io/" target="_blank" rel="noopener"
&gt;k3s&lt;/a&gt;&lt;/strong&gt;. Un Kubernetes minimaliste qui prend très peu de ressources et qui est simple à installer.&lt;/p&gt;
&lt;p&gt;J’avais d’ailleurs fait quelques articles dessus, notamment pour parler d’un playbook Ansible qui permettait de déployer k3s sur des instances ARM dans le cloud de Scaleway (la bonne époque où ils en proposaient, en tout cas&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Le code est toujours dispo et &lt;strong&gt;n’était pas spécifique à ARM ni à Scaleway&lt;/strong&gt;, si ça vous intéresse.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/zwindler/ansible-scaleway-k3s" target="_blank" rel="noopener"
&gt;Le code sur Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2019/03/21/deployer-en-5-minutes-un-cluster-kubernetes-sur-arm-avec-k3s-et-ansible/" &gt;L’article pour en parler&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="et-k3os-dans-tout-ça-"&gt;Et k3os dans tout ça ?
&lt;/h2&gt;&lt;p&gt;La méthode d’installation de Kubernetes est donc choisie. Mais ça ne répond pas à la seconde question, à savoir, sur quelle distribution je l’installe.&lt;/p&gt;
&lt;p&gt;Je peux l’installer sur n’importe quel OS Linux généraliste (Debian, Ubuntu, CentOS, &amp;hellip; you name it), mais le but, c’est quand même d’installer un Kubernetes le plus léger possible (car je suis radin sur les serveurs que je loue et ils sont peu puissants).&lt;/p&gt;
&lt;p&gt;Qu’à cela ne tienne, me dis-je ! Pourquoi ne pas retenter l’expérience CoreOS et RancherOS avec k3os ?&lt;/p&gt;
&lt;p&gt;Et c’est vraiment une bonne question&amp;hellip;&lt;/p&gt;
&lt;h2 id="k3os-donc"&gt;k3OS donc
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;k3OS is a Linux distribution designed to remove as much OS maintenance as possible in a Kubernetes cluster. It is specifically designed to only have what is needed to run &lt;a class="link" href="https://github.com/rancher/k3s" target="_blank" rel="noopener"
&gt;k3s&lt;/a&gt;. Additionally the OS is designed to be managed by kubectl once a cluster is bootstrapped. Nodes only need to join a cluster and then all aspects of the OS can be managed from Kubernetes. Both k3OS and k3s upgrades are handled by the k3OS operator.
&lt;a class="link" href="https://github.com/rancher/k3os" target="_blank" rel="noopener"
&gt;github.com/rancher/k3os&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;k3os est donc une distribution optimisée par Rancher pour fonctionner avec k3s et consommer le moins de ressources possibles.&lt;/p&gt;
&lt;p&gt;Les avantages mis en avant sont que dès que l’OS est installé, on a un Kubernetes fonctionnel puisque k3s est préinstallé et configuré à l’install de l’OS.&lt;/p&gt;
&lt;p&gt;L’autre avantage mis en avant est que tout la gestion du cycle de vie de l’OS est piloté à l’aide d’un operateur dans Kubernetes (k3OS operator) qui va nous permettre de gérer l’OS depuis Kubernetes directement.&lt;/p&gt;
&lt;p&gt;Mkay, pourquoi pas.&lt;/p&gt;
&lt;h2 id="et-cest-reparti-pour-un-tour"&gt;Et c’est reparti pour un tour
&lt;/h2&gt;&lt;p&gt;Même procédure que pour l’article sur RancherOS, les principes sont très similaires. On va télécharger une image iso, créer une VM et se connecter dessus en liveCD pour installer l’OS sur le disque.&lt;/p&gt;
&lt;p&gt;La page des releases est ici : &lt;a class="link" href="https://github.com/rancher/k3os/releases" target="_blank" rel="noopener"
&gt;github.com/rancher/k3os/releases&lt;/a&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cd /var/lib/vz/template/iso
wget https://github.com/rancher/k3os/releases/download/v0.11.1/k3os-amd64.iso
&lt;/code&gt;&lt;/pre&gt;&lt;blockquote&gt;
&lt;p&gt;To copy k3OS to local disk, after logging in as rancher run sudo k3os install. Then remove the ISO from the virtual machine and reboot.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/12/k3os-0.11.1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;STOOOOOP&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Exactement comme dans l’install de RancherOS, si vous partez bille en tête vous risquez de tomber sur un OS (ahah).&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://blog.zwindler.fr/2020/10/26/kubernetes-avec-rancheros-et-rke-partie-1/" &gt;Dans l’article précédent&lt;/a&gt;, j’avais fait l’andouille et lancé la commande, pour me rendre compte qu’une fois installé, je n’avais ni réseau, ni clé SSH pour me connecter sur l’utilisateur rancher post install.&lt;/p&gt;
&lt;p&gt;En vrai, tout doit se faire via cloud-config&amp;hellip;&lt;/p&gt;
&lt;p&gt;Bon, pour être honnête, cette fois-ci, ils ont quand même un peu plus prévu le coup. Si vous ne fournissez pas de cloud-config, cette fois-ci k3os vous propose de rentrer un mot de passe pour votre rancher.&lt;/p&gt;
&lt;p&gt;Mais vous n’aurez pas plus de réseau si comme moi vous n’avez pas mis de DHCP sur votre LAN (cf aparté pour les bolosses qui n’ont pas de DHCP plus tard dans l’article).&lt;/p&gt;
&lt;h2 id="cloud-config"&gt;cloud-config
&lt;/h2&gt;&lt;p&gt;Partons donc pour l’instant du principe que vous avez un DHCP et que vous aurez donc, une fois k3OS installé, accès réseau à votre machine.&lt;/p&gt;
&lt;p&gt;Proxmox a la bonne idée de permettre la création de volume cloud-init directement depuis l’UI.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/12/k3os_cloud-init.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/12/k3os_cloudinit_2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Cependant, j’ai bien l’impression que le format du cloud-init de Proxmox ne correspond pas au format attendu par k3OS&amp;hellip;&lt;/p&gt;
&lt;p&gt;OK, je suis pas fâché.&lt;/p&gt;
&lt;p&gt;On va donc devoir le faire à la mimine et ça tombe bien, car on a ENCORE le souci du clavier Qwerty/Azerty&amp;hellip; (&lt;a class="link" href="https://blog.zwindler.fr/2020/10/26/kubernetes-avec-rancheros-et-rke-partie-1/" &gt;cf Bonus Qwerty&lt;/a&gt;), ce qui est parfait pour copier à la main une clé SSH, c’est bien connu.&lt;/p&gt;
&lt;p&gt;Vous l’aurez compris, on va s’en sortir une fois de plus avec un port série et la console de type xterm.js&amp;hellip;&lt;/p&gt;
&lt;p&gt;Grosso modo, mon cloud config s’est limité à ça.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat &amp;gt; config.yml &amp;lt;&amp;lt; EOF
k3os:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQAaaaaaaaaaaaaaaaaaaaaaaaaaaaOF0lZiHOjIZ/27aaHmNTq27Vws2dhzJ9 rancher
EOF
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Tout ça pour ça me direz-vous ? Oui&amp;hellip;&lt;/p&gt;
&lt;p&gt;Mais bon, une fois qu’on a ça, on peut passer à l’install elle-même, qui est en fait un mini installeur qui vous pose quelques questions un peu triviales comme « rôle du node », « token », « chemin de la clé SSH ».&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;k3os-15121 [~]$ sudo k3os install
Running k3OS configuration
Choose operation
1. Install to disk
2. Configure server or agent
Select Number [1]:
Config system with cloud-init file? [y/N]: y
cloud-init file location (file path or http URL): config.yml
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ces valeurs peuvent d’ailleurs être ajoutées au cloud-config pour vous permettre d’automatiser la totalité de l’opération.&lt;/p&gt;
&lt;p&gt;A l’issue de l’opération&amp;hellip; magie ! vous aurez un Kubernetes tout neuf et tout léger :)&lt;/p&gt;
&lt;h2 id="aparté-pour-les-bolosses-qui-nont-pas-de-dhcp-aka-moi"&gt;Aparté pour les bolosses qui n’ont pas de DHCP (aka. moi)
&lt;/h2&gt;&lt;p&gt;Ça aurait été plus simple de monter un petit serveur DHCP vite fait mais je suis têtu comme pas deux.&lt;/p&gt;
&lt;p&gt;La blague avec k3OS est que, contrairement à RancherOS, il n’est tout simplement pas possible d’installer l’OS en lui spécifiant l’adresse réseau physique qu’il devra avoir post install.&lt;/p&gt;
&lt;p&gt;En fait au début, j’avais copié ce que j’avais fait pour RancherOS. L’installeur de k3OS ne râle pas, mais il ignore simplement le code en trop.&lt;/p&gt;
&lt;p&gt;Et vous ne pourrez plus vous connecter&amp;hellip;&lt;/p&gt;
&lt;p&gt;Mais comme je suis têtu (je me répète), j’ai cherché à tout prix la solution.&lt;/p&gt;
&lt;p&gt;L’idée ici est de feinter l’installeur en ne lui donnant PAS de cloud config. On garde ainsi la possibilité de se loguer à l’utilisateur rancher avec un mot de passe (pas bien ça&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Une fois k3OS installé, on se connecte une nouvelle fois en console (oui, on risque pas de le faire en SSH&amp;hellip;) et on configure la carte réseau.&lt;/p&gt;
&lt;p&gt;k3OS est un dérivé d’Alpine (pour les binaires userspace) avec le kernel d’Ubuntu 20.04 (oh&amp;hellip;kay ?).&lt;/p&gt;
&lt;p&gt;Pour setter le réseau, vous pouvez donc faire :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo connmanctl services
*AR Wired ethernet_c6eb50d8c655_cable
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Cette commande vous renvoie le nom de la carte réseau virtuelle. Vous pouvez maintenant regarder la configuration par défaut&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo connmanctl services ethernet_c6eb50d8c655_cable
/net/connman/service/ethernet_c6eb50d8c655_cable
Type = ethernet
Security = [ ]
State = ready
Favorite = True
Immutable = False
AutoConnect = True
Name = Wired
Ethernet = [ Method=auto, Interface=eth0, Address=C6:EB:50:D8:C6:55, MTU=1500 ]
IPv4 = [ Method=auto, Address=169.254.126.16, Netmask=255.255.0.0 ]
IPv4.Configuration = [ Method=auto ]
IPv6 = [ ]
IPv6.Configuration = [ Method=auto, Privacy=disabled ]
Nameservers = [ 8.8.8.8 ]
Nameservers.Configuration = [ ]
Timeservers = [ ]
Timeservers.Configuration = [ ]
Domains = [ ]
Domains.Configuration = [ ]
Proxy = [ Method=direct ]
Proxy.Configuration = [ ]
mDNS = False
mDNS.Configuration = False
Provider = [ ]
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Grande classe. 8.8.8.8 en DNS&amp;hellip; No comment.&lt;/p&gt;
&lt;p&gt;Et setter votre carte réseau post installation avec cette dernière commande (à remplacer par vos valeurs à vous, hein) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo connmanctl config ethernet_d2416991aa5b_cable --ipv4 manual 192.168.1.15 255.255.255.0 192.168.1.1 --nameservers 192.168.1.1
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Bon je crois qu’il est temps d’arrêter de se faire du mal&amp;hellip;&lt;/p&gt;
&lt;p&gt;Oui clairement, je me suis mis dans un exemple un peu foireux. Tout le monde de normalement constitué dispose d’un DHCP de nos jours. Surtout que k3OS cible les usages de k3s, à savoir le edge et l’IoT.&lt;/p&gt;
&lt;p&gt;Mais du coup, j’ai l’impression qu’on est vraiment dans le marché de niche de la niche : un OS optimisé pour l’IoT ou l’edge uniquement. Je ne suis clairement pas ciblé par k3OS.&lt;/p&gt;
&lt;p&gt;Ça ne m’a pas vraiment donné envie de regarder plus en détails la partie k3OS operator, qui permet de gérer les mises à jours de l’OS depuis Kube.&lt;/p&gt;
&lt;p&gt;La documentation sur le sujet est disponible ici et ça a l’air d’avoir beaucoup bougé entre la v0.9, la v0.10 et la v0.11, puisqu’il y a des exceptions dans tous les sens&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/rancher/k3os#upgrade-and-maintenance" target="_blank" rel="noopener"
&gt;github.com/rancher/k3os#upgrade-and-maintenance&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Bref&amp;hellip; il est temps que je m’installe un bête OS généraliste&amp;hellip;&lt;/p&gt;</description></item></channel></rss>