<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Lxcri on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/lxcri/</link><description>Recent content in Lxcri on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr-fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 17 Nov 2025 18:00:00 +0200</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/lxcri/index.xml" rel="self" type="application/rss+xml"/><item><title>Transformer Proxmox VE en node Kubernetes avec LXC et lxcri</title><link>https://blog.zwindler.fr/2025/11/17/transformer-proxmox-ve-en-node-kubernetes-avec-lxc-et-lxcri/</link><pubDate>Mon, 17 Nov 2025 18:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2025/11/17/transformer-proxmox-ve-en-node-kubernetes-avec-lxc-et-lxcri/</guid><description>&lt;img src="https://blog.zwindler.fr/2025/11/proxmox-k8s.webp" alt="Featured image of post Transformer Proxmox VE en node Kubernetes avec LXC et lxcri" /&gt;&lt;h2 id="il-ne-savait-pas-que-cétait-complètement-stupide-alors-il-la-fait"&gt;Il ne savait pas que c&amp;rsquo;était complètement stupide, alors il l&amp;rsquo;a fait
&lt;/h2&gt;&lt;p&gt;Quel mensonge&amp;hellip; &lt;strong&gt;Bien sûr, je sais très bien que c&amp;rsquo;est débile&lt;/strong&gt;. Raison pour laquelle cette idée est donc irrésistible.&lt;/p&gt;
&lt;p&gt;Si vous suivez le blog, vous savez que j&amp;rsquo;utilise beaucoup Proxmox VE (les articles qui attirent le plus sur le blog sont d&amp;rsquo;ailleurs des articles sur cette technologie de virtualisation).&lt;/p&gt;
&lt;p&gt;Proxmox VE, c&amp;rsquo;est très cool ; on peut faire des VMs (QEMU) avec, mais aussi, si on n&amp;rsquo;a pas de VT-x ou qu&amp;rsquo;on veut des &amp;ldquo;lightweight VMs&amp;rdquo; (terme dont on a abusé à outrance), on peut installer des OS complets dans des containers avec LXC.&lt;/p&gt;
&lt;p&gt;Mais au delà de ces deux solutions, les devs du projet Proxmox VE sont assez rigides (et pas que là dessus). C&amp;rsquo;est d&amp;rsquo;ailleurs pour ça que j&amp;rsquo;ai posté quelques &amp;ldquo;hacks&amp;rdquo; pour contourner les limitations de Proxmox, notamment &lt;a class="link" href="https://blog.zwindler.fr/2022/11/07/containers-docker-dans-proxmox-avec-lxc/" target="_blank" rel="noopener"
&gt;cet article où j&amp;rsquo;explique comment lancer des containers Docker (via LXC) dans Proxmox VE (normalement pas possible)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Et si on allait encore plus loin dans le hack idiot ?&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Et si, non seulement on exécutait des containers OCI dans Proxmox VE, mais qu&amp;rsquo;EN PLUS, on transformait nos hôtes Proxmox VE en ✨️ &lt;strong&gt;Nodes Kubernetes&lt;/strong&gt; ✨️ ???&lt;/p&gt;
&lt;h2 id="on-sy-prend-comment-"&gt;On s&amp;rsquo;y prend comment ?
&lt;/h2&gt;&lt;p&gt;Le but n&amp;rsquo;est évidemment pas d&amp;rsquo;installer Kubernetes à côté de Proxmox VE, mais réutiliser le plus de choses possibles. Typiquement, je vais réutiliser la techno de &amp;ldquo;virtu&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Proxmox VE supportant 2 technos de virtualisation différentes (qemu et LXC), il faut choisir. Et comme j&amp;rsquo;aime bien LXC et que j&amp;rsquo;ai déjà expérimenté sur le hack Docker =&amp;gt; LXC sur Proxmox VE, &lt;strong&gt;la question était vite répondue&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Toute la difficulté de l&amp;rsquo;exercice est de trouver comment rendre LXC &amp;ldquo;CRI-compatible&amp;rdquo;. Et on a de la chance, Linux Containers, la fondation qui chapeaute LXC et Incus (ex LXD, &amp;ldquo;refermé&amp;rdquo; par Canonical), a écrit il y a quelques années un CRI pour LXC appelé &lt;a class="link" href="https://github.com/lxc/lxcri" target="_blank" rel="noopener"
&gt;lxcri&lt;/a&gt;. Et bien sûr, comme c&amp;rsquo;est un projet à l&amp;rsquo;utilité discutable, le truc n&amp;rsquo;est plus maintenu depuis 2021.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;avais d&amp;rsquo;ailleurs essayé de l&amp;rsquo;utiliser, passé pas mal de temps dessus en février 2024 (j&amp;rsquo;ai essuyé bug sur bug, suis passé par des forks, &amp;hellip;) pour échouer lamentablement sur un problème de compatibilité avec ma version de LXC (5+ sous Proxmox 8, 6 en Proxmox 9), entre autres bugs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;lxcri is a wrapper around LXC which can be used as a drop-in container runtime replacement for use by CRI-O.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On va donc quand même avoir besoin de 3 trucs en plus sur notre serveur Proxmox pour que mon idée débile fonctionne :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;lxcri&lt;/strong&gt; comme container runtime de base niveau&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cri-o&lt;/strong&gt; comme container runtime de haut niveau&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;kubelet&lt;/strong&gt; pour piloter le runtime et communiquer avec le control plane&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cest-parti"&gt;C&amp;rsquo;est parti
&lt;/h2&gt;&lt;p&gt;OK. lxcri s&amp;rsquo;appuie donc sur &lt;a class="link" href="https://cri-o.io/" target="_blank" rel="noopener"
&gt;cri-o&lt;/a&gt;, le container runtime de Red Hat. On commence donc par installer cri-o :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/cri-o/cri-o/blob/main/install.md" target="_blank" rel="noopener"
&gt;https://github.com/cri-o/cri-o/blob/main/install.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note : mon serveur Proxmox VE 8 de l&amp;rsquo;époque utilisait Debian 12 comme OS de base. On devrait donc se baser là-dessus pour la variable $OS (comme l&amp;rsquo;indique la doc). Cependant, à l&amp;rsquo;heure où j&amp;rsquo;ai testé la première fois, les dépôts de CRI-O étaient en cours de migration, avec une documentation pas à jour et des releases manquantes. Le répo &lt;a class="link" href="https://download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o/" target="_blank" rel="noopener"
&gt;download.opensuse.org/repositories/devel:/kubic:/libcontainers:/stable:/cri-o&lt;/a&gt; n&amp;rsquo;avait pas le PATH Debian_12, ni la version 1.29 de Kubernetes&amp;hellip; &lt;strong&gt;J&amp;rsquo;avais BIEN ragé&lt;/strong&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/cri-o/cri-o/issues/7657" target="_blank" rel="noopener"
&gt;https://github.com/cri-o/cri-o/issues/7657&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://kubernetes.io/blog/2023/10/10/cri-o-community-package-infrastructure/" target="_blank" rel="noopener"
&gt;https://kubernetes.io/blog/2023/10/10/cri-o-community-package-infrastructure/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On ne devrait plus avoir de soucis maintenant :&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;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;v1.32
&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;CRIO_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;v1.32
&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="c1"&gt;# créer un répertoire pour les keyrings (il n&amp;#39;existe pas toujours sur une install fraiche)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo mkdir -p /usr/share/keyrings
&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="c1"&gt;# répo de kubernetes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://pkgs.k8s.io/core:/stable:/&lt;span class="nv"&gt;$KUBERNETES_VERSION&lt;/span&gt;/deb/Release.key &lt;span class="p"&gt;|&lt;/span&gt; sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg
&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;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/&lt;/span&gt;&lt;span class="nv"&gt;$KUBERNETES_VERSION&lt;/span&gt;&lt;span class="s2"&gt;/deb/ /&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; sudo tee /etc/apt/sources.list.d/kubernetes.list
&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="c1"&gt;# répo de crio&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://download.opensuse.org/repositories/isv:/cri-o:/stable:/&lt;span class="nv"&gt;$CRIO_VERSION&lt;/span&gt;/deb/Release.key &lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; sudo gpg --dearmor -o /etc/apt/keyrings/cri-o-apt-keyring.gpg
&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;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/&lt;/span&gt;&lt;span class="nv"&gt;$CRIO_VERSION&lt;/span&gt;&lt;span class="s2"&gt;/deb/ /&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; sudo tee /etc/apt/sources.list.d/cri-o.list
&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 apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install cri-o
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A partir de là, on a cri-o. On pourrait le configurer mais si on fait ça, il utilisera runc et on n&amp;rsquo;utiliserait pas LXC en tant que runtime.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ce n&amp;rsquo;est pas le but de ce hack !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est donc à ce moment là qu&amp;rsquo;on rebascule sur la documentation de lxcri :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/lxc/lxcri/blob/main/doc/setup.md" target="_blank" rel="noopener"
&gt;github.com/lxc/lxcri&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ya-pas-de-release"&gt;Ya pas de release
&lt;/h2&gt;&lt;p&gt;Et oui&amp;hellip; il faut préalablement &lt;strong&gt;builder&lt;/strong&gt; le binaire &lt;code&gt;lxcri&lt;/code&gt; et le déposer dans le /usr/local de notre serveur Proxmox VE. Il n&amp;rsquo;y a pas de binaire précompilé dans le projet, &lt;a class="link" href="https://github.com/lxc/lxcri/issues/57" target="_blank" rel="noopener"
&gt;c&amp;rsquo;est une issue ouverte juste avant qu&amp;rsquo;il ne soit abandonné 😬😬&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Et pour que ce soit encore plus fun, le processus de build passe par un Dockerfile, ce qui est rigolo puisqu&amp;rsquo;on n&amp;rsquo;a pas Docker sur notre node Proxmox&amp;hellip;&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai donc essayé de &lt;a class="link" href="https://github.com/lxc/lxcri/blob/main/README.md" target="_blank" rel="noopener"
&gt;builder lxcri&lt;/a&gt; depuis une machine avec Docker, en suivant la commande indiquée sur le GitHub. Patatra. (Déjà, il manque un &amp;ldquo;.&amp;rdquo; en fin de commande &lt;code&gt;docker build&lt;/code&gt; dans la doc) ça fail misérablement à la compilation&amp;hellip;&lt;/p&gt;
&lt;p&gt;Note : je n&amp;rsquo;ai plus l&amp;rsquo;erreur en question, probablement un problème de dépendances. C&amp;rsquo;est relou parce qu&amp;rsquo;on va devoir faire plein de choses à la main&amp;hellip; Mais ne vous embêtez pas à &lt;code&gt;git clone&lt;/code&gt;, on va partir sur un fork (d&amp;rsquo;un fork).&lt;/p&gt;
&lt;p&gt;En allant jeter un œil au Dockerfile, on se rend vite compte qu&amp;rsquo;on ne fait que lancer un script (install.sh)&amp;hellip;&lt;/p&gt;
&lt;p&gt;Quand on appelle Docker avec le buildarg &lt;code&gt;installcmd=install_runtime&lt;/code&gt;, on lance la fonction &lt;code&gt;install_runtime&lt;/code&gt;, qui appelle &lt;code&gt;install_runtime_noclean&lt;/code&gt;, qui lance &lt;code&gt;add_lxc&lt;/code&gt; puis &lt;code&gt;add_lxcri&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Je veux juste compiler &lt;strong&gt;lxc&lt;/strong&gt; (pour les bindings) et &lt;strong&gt;lxcri&lt;/strong&gt;. Je vais donc le faire à la main. Pour ça, il faut golang 1.16 (ça date&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Il y a pas mal de code pété un peu partout et plusieurs issues ouvertes dans lesquelles les mainteneurs conseillent de partir sur un fork :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/drachenfels-de/lxcri" target="_blank" rel="noopener"
&gt;https://github.com/drachenfels-de/lxcri&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;J&amp;rsquo;ai passé pas mal de temps à le débugger, et au final j&amp;rsquo;ai fait mon propre fork (&lt;a class="link" href="https://github.com/zwindler/lxcri%29" target="_blank" rel="noopener"
&gt;https://github.com/zwindler/lxcri)&lt;/a&gt;, qui nécessite golang 1.22+ et qui ajoute un gros paquet de fixes.&lt;/p&gt;
&lt;h2 id="prérequis-pour-builder-lxcri"&gt;Prérequis pour builder lxcri
&lt;/h2&gt;&lt;p&gt;On va installer un paquet de trucs :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt update
sudo apt install curl git meson pkg-config cmake libdbus-1-dev docbook2x
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On installe Golang si on ne l&amp;rsquo;a pas (peu de chance que vous ayez Golang sur un node Proxmox VE) :&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://go.dev/dl/go1.25.4.linux-amd64.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo rm -rf /usr/local/go &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo tar -C /usr/local -xzf go1.25.4.linux-amd64.tar.gz
&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;PATH&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$PATH&lt;/span&gt;:/usr/local/go/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;go version
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; go version go1.25.4 linux/amd64
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je vais aussi devoir &lt;strong&gt;récupérer et compiler lxc&lt;/strong&gt;. Pendant un moment, j&amp;rsquo;étais bloqué sur la version 4.0.12 (très précisément) car la 4.0.6 qu&amp;rsquo;on trouve sur Debian 11 ne fonctionne &lt;strong&gt;pas&lt;/strong&gt; avec le code de lxcri (j&amp;rsquo;ai mangé plein de bugs).&lt;/p&gt;
&lt;p&gt;Mais la bonne nouvelle, c&amp;rsquo;est que comme je suis un try-harder de l&amp;rsquo;espace, à force de fixes sur mon fork, celui-ci fonctionne avec la dernière version de lxc (6.x), ce qui tombe bien parce que c&amp;rsquo;est la version sur mon Proxmox VE 9 à jour.&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;git clone https://github.com/lxc/lxc
&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; lxc
&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;meson setup -Dprefix&lt;span class="o"&gt;=&lt;/span&gt;/usr -Dsystemd-unitdir&lt;span class="o"&gt;=&lt;/span&gt;PATH build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Build targets in project: &lt;span class="m"&gt;30&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; lxc 6.0.0
&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; User defined options
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; prefix : /usr
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; systemd-unitdir: PATH
&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; Found ninja-1.12.1 at /usr/bin/ninja
&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;meson compile -C build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; INFO: autodetecting backend as ninja
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; INFO: calculating backend &lt;span class="nb"&gt;command&lt;/span&gt; to run: /usr/bin/ninja -C /root/lxc/build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ninja: Entering directory &lt;span class="sb"&gt;`&lt;/span&gt;/root/lxc/build&lt;span class="err"&gt;&amp;#39;&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;544/544&lt;span class="o"&gt;]&lt;/span&gt; Linking target src/lxc/tools/lxc-monitor
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ça a buildé plein de trucs, c&amp;rsquo;est cool. Mais les fichiers qui m&amp;rsquo;intéressent sont ici :&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;find . -name &lt;span class="s2"&gt;&amp;#34;lxc.pc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;./build/meson-private/lxc.pc
&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;ls build/*lxc*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;build/liblxc.so build/liblxc.so.1 build/liblxc.so.1.8.0 build/lxc.spec
&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;build/liblxc.so.1.8.0.p:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;liblxc.so.1.8.0.symbols
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Je mets ça aux bons endroits dans mon Proxmox VE avec un :&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 make install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ldconfig
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="builder-comme-jamais"&gt;Builder comme jamais
&lt;/h2&gt;&lt;p&gt;Ok, c&amp;rsquo;est parti pour jouer &lt;strong&gt;avec mon fork&lt;/strong&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;git clone https://github.com/zwindler/lxcri.git lxcri.zwindler
&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; lxcri.zwindler
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&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;make build
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; go build -ldflags &lt;span class="s1"&gt;&amp;#39;-X main.version=8805687-dirty -X github.com/lxc/lxcri.defaultLibexecDir=/usr/local/libexec/lxcri&amp;#39;&lt;/span&gt; -o lxcri ./cmd/lxcri
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cc -Werror -Wpedantic -o lxcri-start cmd/lxcri-start/lxcri-start.c &lt;span class="k"&gt;$(&lt;/span&gt;pkg-config --libs --cflags lxc&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="nv"&gt;CGO_ENABLED&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt; go build -o lxcri-init ./cmd/lxcri-init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# this is paranoia - but ensure it is statically compiled&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ! ldd lxcri-init 2&amp;gt;/dev/null
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; go build -o lxcri-hook ./cmd/lxcri-hook
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; go build -o lxcri-hook-builtin ./cmd/lxcri-hook-builtin
&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;ls -alrt
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; total &lt;span class="m"&gt;15288&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; -rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; debian debian &lt;span class="m"&gt;7108288&lt;/span&gt; Nov &lt;span class="m"&gt;16&lt;/span&gt; 20:06 lxcri
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; debian debian &lt;span class="m"&gt;17520&lt;/span&gt; Nov &lt;span class="m"&gt;16&lt;/span&gt; 20:06 lxcri-start
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; debian debian &lt;span class="m"&gt;2942584&lt;/span&gt; Nov &lt;span class="m"&gt;16&lt;/span&gt; 20:06 lxcri-init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; debian debian &lt;span class="m"&gt;2834743&lt;/span&gt; Nov &lt;span class="m"&gt;16&lt;/span&gt; 20:06 lxcri-hook
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; -rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; debian debian &lt;span class="m"&gt;2519097&lt;/span&gt; Nov &lt;span class="m"&gt;16&lt;/span&gt; 20:06 lxcri-hook-builtin
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Si on était sur une machine de dev, on pourrait envoyer les binaires sur le serveur Proxmox VE (lxcri dans /usr/local/bin, le reste dans /usr/local/libexec/lxcri).&lt;/p&gt;
&lt;p&gt;Dans mon cas, je suis directement sur la machine qui build et qui run, je fais 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;$ sudo make install
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mkdir -p /usr/local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cp -v lxcri /usr/local/bin
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;lxcri&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/bin/lxcri&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; mkdir -p /usr/local/libexec/lxcri
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; cp -v lxcri-start lxcri-init lxcri-hook lxcri-hook-builtin /usr/local/libexec/lxcri
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;lxcri-start&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/libexec/lxcri/lxcri-start&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;lxcri-init&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/libexec/lxcri/lxcri-init&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;lxcri-hook&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/libexec/lxcri/lxcri-hook&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s1"&gt;&amp;#39;lxcri-hook-builtin&amp;#39;&lt;/span&gt; -&amp;gt; &lt;span class="s1"&gt;&amp;#39;/usr/local/libexec/lxcri/lxcri-hook-builtin&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;et on peut continuer :&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;$ /usr/local/bin/lxcri &lt;span class="nb"&gt;help&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;NAME:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lxcri - lxcri is a OCI compliant runtime wrapper &lt;span class="k"&gt;for&lt;/span&gt; lxc
&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;USAGE:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; lxcri &lt;span class="o"&gt;[&lt;/span&gt;global options&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="nb"&gt;command&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;command&lt;/span&gt; options&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;arguments...&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;VERSION:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="m"&gt;8805687&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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="on-reprend-crio"&gt;On reprend crio
&lt;/h2&gt;&lt;p&gt;Ok, on a buildé lxcri et on a toutes les dépendances pour l&amp;rsquo;utiliser. On peut donc repartir sur la doc officielle de lxcri &amp;ldquo;&lt;a class="link" href="https://github.com/lxc/lxcri/blob/main/doc/setup.md" target="_blank" rel="noopener"
&gt;setup.md&lt;/a&gt;&amp;rdquo; dans l&amp;rsquo;idée de configurer CRI-O, pour qu&amp;rsquo;il n&amp;rsquo;utilise pas runc, &lt;strong&gt;uniquement lxcri&lt;/strong&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 tee /etc/crio/crio.conf.d/10-crio.conf &amp;gt; /dev/null &lt;span class="s"&gt;&amp;lt;&amp;lt;&amp;#39;EOF&amp;#39;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;[crio.image]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;signature_policy = &amp;#34;/etc/crio/policy.json&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;[crio.runtime]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;default_runtime = &amp;#34;lxcri&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;[crio.runtime.runtimes.lxcri]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;runtime_path = &amp;#34;/usr/local/bin/lxcri&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;runtime_type = &amp;#34;oci&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;runtime_root = &amp;#34;/var/lib/lxc&amp;#34; #proxmox lxc folder
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;inherit_default_runtime = false
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s"&gt;runtime_config_path = &amp;#34;&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;container_min_memory = &amp;#34;&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;monitor_path = &amp;#34;/usr/libexec/crio/conmon&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;monitor_cgroup = &amp;#34;system.slice&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;monitor_exec_cgroup = &amp;#34;&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;privileged_without_host_devices = false
&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;A noter, la doc d&amp;rsquo;installation &lt;code&gt;setup.md&lt;/code&gt; nous dit générer une conf propre avec le binaire crio et la commande config, mais ça ne marche pas vraiment et on se retrouve à lancer runc ou crun sans le vouloir. J&amp;rsquo;écrase tout, c&amp;rsquo;est plus simple.&lt;/p&gt;
&lt;p&gt;Et maintenant, on peut lancer crio :&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 &lt;span class="nb"&gt;enable&lt;/span&gt; crio &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo systemctl start crio
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A partir de là, on a un serveur disposant d&amp;rsquo;un CRI &lt;em&gt;a priori&lt;/em&gt; fonctionnel.&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;systemctl status crio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;● crio.service - Container Runtime Interface &lt;span class="k"&gt;for&lt;/span&gt; OCI &lt;span class="o"&gt;(&lt;/span&gt;CRI-O&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Loaded: loaded &lt;span class="o"&gt;(&lt;/span&gt;/lib/systemd/system/crio.service&lt;span class="p"&gt;;&lt;/span&gt; enabled&lt;span class="p"&gt;;&lt;/span&gt; vendor preset: enabled&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; Active: active &lt;span class="o"&gt;(&lt;/span&gt;running&lt;span class="o"&gt;)&lt;/span&gt; since Mon 2025-11-17 12:02:37 UTC&lt;span class="p"&gt;;&lt;/span&gt; 12s ago
&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;journalctl -u crio
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Nov &lt;span class="m"&gt;17&lt;/span&gt; 20:29:43 instance-2025-11-16-15-31-55 systemd&lt;span class="o"&gt;[&lt;/span&gt;1&lt;span class="o"&gt;]&lt;/span&gt;: Starting Container Runtime Interface &lt;span class="k"&gt;for&lt;/span&gt; OCI &lt;span class="o"&gt;(&lt;/span&gt;CRI-O&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;Nov &lt;span class="m"&gt;17&lt;/span&gt; 20:29:43 instance-2025-11-16-15-31-55 crio&lt;span class="o"&gt;[&lt;/span&gt;11906&lt;span class="o"&gt;]&lt;/span&gt;: &lt;span class="nv"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;2025-11-17T20:29:43.61758425Z&amp;#34;&lt;/span&gt; &lt;span class="nv"&gt;level&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;info &lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Using runtime handler lxcri version 8805687&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Yeeees :D&lt;/p&gt;
&lt;p&gt;On peut donc installer kubelet, puis l&amp;rsquo;ajouter à un cluster Kubernetes existant&lt;/p&gt;
&lt;h2 id="fast-forward"&gt;Fast forward
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;avais la flemme de monter un cluster propre avec &lt;a class="link" href="https://blog.zwindler.fr/2023/12/17/kubeadmcfg-introduction-api-kubeadm/" target="_blank" rel="noopener"
&gt;kubeadm ou autre, et d&amp;rsquo;enrôler ensuite un node à la main avec le token+sha&lt;/a&gt;. J&amp;rsquo;aurais aussi pu rejouer avec mon PoC rigolo des &lt;a class="link" href="https://blog.zwindler.fr/2025/07/20/kubernetes-sur-clever-cloud-linux/" target="_blank" rel="noopener"
&gt;workers &amp;ldquo;linux&amp;rdquo; de Clever Cloud pour créer un control plane&lt;/a&gt; chez Clever, puis enrôler à la main avec le node bootstrap token (j&amp;rsquo;ai fait les choses plutôt bien dans ce PoC).&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai donc rejoué à l&amp;rsquo;arrache avec mon projet &lt;a class="link" href="https://github.com/zwindler/demystifions-kubernetes/tree/main" target="_blank" rel="noopener"
&gt;demystifions-kubernetes&lt;/a&gt;, qui permet de monter un cluster mono node à la main en lançant juste des binaires.&lt;/p&gt;
&lt;p&gt;Une fois le control plane bootstrapé (etcd, api-server, controller-manager, scheduler), on s&amp;rsquo;arrête AVANT la partie containerd (on a déjà configuré CRI-O) et on lance le kubelet à la main :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo bin/kubelet --kubeconfig admin.conf --container-runtime-endpoint --container-runtime-endpoint=unix:///var/run/crio/crio.sock --fail-swap-on=false --cgroup-driver=&amp;#34;systemd&amp;#34;
[...]
I1117 13:41:58.741561 88434 kubelet_node_status.go:78] &amp;#34;Successfully registered node&amp;#34; node=&amp;#34;instance-2025-11-16-15-31-55&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On progresse ! Essayons de voir l&amp;rsquo;état de santé du cluster et de déployer un pod :&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;KUBECONFIG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin.conf
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get nodes
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NAME STATUS ROLES AGE VERSION
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; instance-2025-11-16-15-31-55 Ready &amp;lt;none&amp;gt; 13m v1.34.2
&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;$ kubectl create deployment web --image&lt;span class="o"&gt;=&lt;/span&gt;zwindler/vhelloworld
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; deployment.apps/web created
&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&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ kubectl get pods
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; NAME READY STATUS RESTARTS AGE
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; web-6c8cc48c68-cdbtj 1/1 Running &lt;span class="m"&gt;0&lt;/span&gt; 4m17s
&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;$ kubectl logs web-6c8cc48c68-cdbtj
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;Vweb&lt;span class="o"&gt;]&lt;/span&gt; Running app on http://localhost:8081/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="o"&gt;[&lt;/span&gt;Vweb&lt;span class="o"&gt;]&lt;/span&gt; We have &lt;span class="m"&gt;3&lt;/span&gt; workers
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Great success!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;A partir de là, CRI-O partage le moteur LXC de Proxmox VE de manière fonctionnelle.&lt;/p&gt;
&lt;p&gt;Pour s&amp;rsquo;en convaincre, on peut lancer la commande lxc-ls, qui nous affichera un mix de &amp;ldquo;vrais&amp;rdquo; containers LXC (créés avec Proxmox, les 151 et 200) et de containers de pods (les STOPPED sont les init containers de cilium) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;$ lxc-ls -f
NAME STATE AUTOSTART GROUPS IPV4 IPV6 UNPRIVILEGED
151 STOPPED 0 - - - true
200 STOPPED 0 - - - true
3045d1f3abcc069b1009acc869a27b09cf9531d0701a3f9d5a760213d57c7b20 STOPPED 0 - - - false
78057100e5d0613944c2be859dfd09f790eeba88bceebea0e04970841c9bd950 RUNNING 0 - 10.0.0.90 - false
8e5506beea9a50214c46f31fa7fa6d04397963cb912aa397261359865d40a0cd RUNNING 0 - 10.0.0.167, 10.244.0.1, 203.0.113.42, 192.168.1.10 2001:db8::1 false
abdcd5be0a27417aa9e11cc2b27882bc86a63d94f547f909332ca7470a5e075a STOPPED 0 - - - false
aeaed9c2f56328bb6196ede4a78f06c4bb2d3edf5dca7912cf38407b9bf6610a STOPPED 0 - - - false
ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d RUNNING 0 - 10.0.0.167, 10.244.0.1, 203.0.113.42, 192.168.1.10 2001:db8::1 false
edb9d42e35a4029cfec5bed5597746bdf67fbe438f21446230252265ed1c849d STOPPED 0 - - - false
$ ps -ef |grep ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d
root 2674943 1 0 22:32 ? 00:00:00 /usr/libexec/crio/conmon -b /run/containers/storage/overlay-containers/ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d/userdata -c ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d --exit-dir /var/run/crio/exits -l /var/log/pods/kube-system_cilium-operator-56d6cd6767-dps78_6082ea2d-331e-4262-b8b3-d3f88eb4e446/cilium-operator/1.log --log-level info -n k8s_cilium-operator_cilium-operator-56d6cd6767-dps78_kube-system_6082ea2d-331e-4262-b8b3-d3f88eb4e446_1 -P /run/containers/storage/overlay-containers/ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d/userdata/conmon-pidfile -p /run/containers/storage/overlay-containers/ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d/userdata/pidfile --persist-dir /var/lib/containers/storage/overlay-containers/ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d/userdata -r /usr/local/bin/lxcri --runtime-arg --root=/var/lib/lxc --socket-dir-path /var/run/crio --syslog -u ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d -s
root 2674951 2674943 0 22:32 ? 00:00:00 /usr/local/libexec/lxcri/lxcri-start ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d /var/lib/lxc /var/lib/lxc/ed9aaf5a0fd4b11be121296290472d6d71d9016e4c6bb0d05fb2e4a7f4b7a85d/config
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Rien ne nous empêcherait ensuite de pousser le vice, et de faire un petit script qui récupère toutes les informations des containers, et crée les fichiers &lt;code&gt;/etc/pve/lxc/xxx.conf&lt;/code&gt; associés de manière à les afficher dans l&amp;rsquo;UI, comme je l&amp;rsquo;avais fait dans l&amp;rsquo;article :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2022/11/07/containers-docker-dans-proxmox-avec-lxc/" target="_blank" rel="noopener"
&gt;Lancer des containers Docker avec Proxmox VE (et LXC)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En théorie, si cette étape avait du sens, je pourrais créer les releases moi-même sur mon fork pour faciliter l&amp;rsquo;installation.&lt;/p&gt;
&lt;p&gt;Enfin, je pourrais essayer de contribuer mes modifications pour que tout soit mergé sur le projet principal, à ceci près que &lt;a class="link" href="https://github.com/lxc/lxcri/issues/67#issuecomment-2055724867" target="_blank" rel="noopener"
&gt;les mainteneurs refusent les PRs car le projet n&amp;rsquo;est plus maintenu&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Mais j&amp;rsquo;avoue qu&amp;rsquo;après probablement une quinzaine d&amp;rsquo;heures de debug, de Golang, de compilation C, réparties sur 2 ans, j&amp;rsquo;ai un peu été au bout de ma patience pour cette &amp;ldquo;blague&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;OK, c&amp;rsquo;était débile, maintenant que j&amp;rsquo;ai réussi, dodo X_X.&lt;/p&gt;</description></item></channel></rss>