<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>MLOps on Valérian Pyckaert</title>
    <link>https://valerian-pyckaert.dev/tags/mlops/</link>
    <description>Recent content in MLOps on Valérian Pyckaert</description>
    <image>
      <title>Valérian Pyckaert</title>
      <url>https://valerian-pyckaert.dev/images/default-cover.svg</url>
      <link>https://valerian-pyckaert.dev/images/default-cover.svg</link>
    </image>
    <generator>Hugo</generator>
    <language>en</language>
    <lastBuildDate>Tue, 04 Aug 2026 19:00:00 +0200</lastBuildDate>
    <atom:link href="https://valerian-pyckaert.dev/tags/mlops/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Déploiement d&#39;un LLM dans Kubernetes avec Minikube</title>
      <link>https://valerian-pyckaert.dev/posts/ollama-minikube/</link>
      <pubDate>Tue, 04 Aug 2026 19:00:00 +0200</pubDate>
      <guid>https://valerian-pyckaert.dev/posts/ollama-minikube/</guid>
      <description>Découvrez comment déployer un LLM dans un cluster Kubernetes local avec Minikube. Cet article couvre la configuration de Minikube, le choix du modèle, la création des manifests Kubernetes.</description>
      <content:encoded><![CDATA[<h2 id="introduction">Introduction</h2>
<p>Les Large Language Models (LLM) ont révolutionné le domaine de l&rsquo;intelligence artificielle, il existe désormais tout un tas de modèles opensource pouvant être déployés localement.
C&rsquo;est ce que nous allons voir dans cet article, nous allons déployer un LLM dans un cluster Kubernetes local en utilisant Minikube, ce qui permet de tester différents modèles sans coûts cloud et faire un premier pas dans l&rsquo;IA.</p>
<h2 id="pré-requis">Pré-requis</h2>
<p>Avant de commencer, assurez-vous d&rsquo;avoir les éléments suivants installés :</p>
<ul>
<li><strong>Minikube</strong></li>
<li><strong>kubectl</strong></li>
<li><strong>Docker</strong></li>
<li><strong>Helm</strong></li>
<li>16 Go de RAM minimum</li>
<li>20 Go d&rsquo;espace disque disponible</li>
</ul>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">minikube version
</span></span><span class="line"><span class="cl">kubectl version --client
</span></span><span class="line"><span class="cl">docker --version
</span></span></code></pre></div><h2 id="étape-1--configuration-de-minikube-pour-les-llm">Étape 1 : Configuration de Minikube pour les LLM</h2>
<p>Les LLM nécessitent des ressources importantes. Nous devons configurer Minikube avec suffisamment de mémoire et de CPU.</p>
<h3 id="démarrage-de-minikube-avec-des-ressources-adaptées">Démarrage de Minikube avec des ressources adaptées</h3>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="c1"># Démarrer Minikube avec 16 Go de RAM et 8 CPU</span>
</span></span><span class="line"><span class="cl">minikube start --memory<span class="o">=</span><span class="m">8192</span> --cpus<span class="o">=</span><span class="m">4</span> --disk-size<span class="o">=</span>20g
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Vérifier le statut</span>
</span></span><span class="line"><span class="cl">minikube status
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1"># Vérifier les ressources allouées</span>
</span></span><span class="line"><span class="cl">kubectl get nodes
</span></span><span class="line"><span class="cl">kubectl describe node minikube <span class="p">|</span> grep -A <span class="m">3</span> <span class="s2">&#34;Allocatable&#34;</span>
</span></span></code></pre></div><h2 id="étape-2--choix-du-modèle-et-de-limage-container">Étape 2 : Choix du modèle et de l&rsquo;image container</h2>
<p>Plusieurs options s&rsquo;offrent à vous pour déployer un LLM :</p>
<h3 id="option-1--vllm">Option 1 : vLLM</h3>
<p><a href="https://github.com/vllm-project/vllm">vLLM</a> est un framework optimisé pour le déploiement et le serving de LLM, développé par les créateurs de Ray. Il offre :</p>
<ul>
<li><strong>PagedAttention</strong> : Optimisation mémoire pour gérer des séquences longues</li>
<li>Support multi-GPU</li>
<li>Compatibilité avec HuggingFace</li>
<li>API OpenAI compatible</li>
</ul>
<h3 id="option-2--ollama">Option 2 : Ollama</h3>
<p><a href="https://ollama.ai/">Ollama</a> est une solution légère et facile à utiliser pour exécuter des LLM localement. C&rsquo;est l&rsquo;option la plus simple pour commencer avec Minikube.</p>
<p>Pour cet article, nous utiliserons <strong>Ollama</strong> pour sa simplicité et son efficacité.</p>
<h2 id="étape-3--déploiement-dollama-dans-minikube">Étape 3 : Déploiement d&rsquo;Ollama dans Minikube</h2>
<h3 id="les-ressources-nécessaires">Les ressources nécessaires</h3>
<ul>
<li><strong>namespace</strong> : pour y déployer toutes les ressources liées à ce projet</li>
<li><strong>pvc</strong> : pour le stockage du modèle</li>
<li><strong>deployment</strong>: pour servir l&rsquo;application</li>
<li><strong>service</strong>: pour pouvoir exposer l&rsquo;application</li>
</ul>
<h3 id="helm-chart--installation">Helm chart &amp; installation</h3>
<p>Pour faciliter le déploiement j&rsquo;ai écris un chart Helm qui configure toutes ces ressources.
Le repository se trouve <a href="https://github.com/Bernedotcom2312/ollama-minikube">ici</a>.</p>
<p>Clonez le repository puis faites :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">helm install ollama . 
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#Vérifier que les pods sont Running</span>
</span></span><span class="line"><span class="cl">kubectl get pods -n ollama
</span></span></code></pre></div><p>Les pods peuvent mettre un certain temps à démarrer car il faut télécharger le modèle ~1.3Go, j&rsquo;utilise pour cela un <em>initContainer</em> qui va le télécharger et le stocker dans un volume que le pod pourra ensuite récupérer.</p>
<h2 id="étape-4--utilisation-en-ligne-de-commande">Étape 4 : Utilisation en ligne de commande</h2>
<p>La chart déploie l&rsquo;application et l&rsquo;expose sur le port <strong>11434</strong>.</p>
<p>Pour appeler le modèle :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl -n ollama port-forward svc/ollama 11434:11434
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">#puis</span>
</span></span><span class="line"><span class="cl">curl http://localhost:11434/api/generate -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;model&#34;: &#34;llama3.2.1b&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;prompt&#34;: &#34;Explique Kubernetes en une phrase.&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;stream&#34;: false
</span></span></span><span class="line"><span class="cl"><span class="s1">}&#39;</span>
</span></span></code></pre></div><p>Vous devriez avoir un résultat de ce type :
<img alt="Ollama curl response" loading="lazy" src="/ollama_curl_response.png"></p>
<h2 id="étape-5--utilisation-en-web-ui">Étape 5 : Utilisation en web UI</h2>
<p>J&rsquo;ai volontairement omis de mentionner que la chart déploie 2 ressources supplémentaires : un déploiement et un service &ldquo;open-webui&rdquo; pour exposer l&rsquo;API d&rsquo;Ollama à travers une interface web.
Pour l&rsquo;utiliser, rien de plus simple :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl -n ollama port-forward svc/open-webui 8080:8080
</span></span></code></pre></div><p><a href="http://localhost:8080">Ouvrez votre navigateur</a>.</p>
<p>Vous devriez voir une interface de ce type :</p>
<p><img alt="ollama Web UI" loading="lazy" src="/ollama-webui.png"></p>
<p>Cliquez sur démarrer, après un process de login vous devriez obtenir une page sensiblement ressemblante à celle de ChatGPT :</p>
<p><img alt="Ollama WebUI Prompt" loading="lazy" src="/ollama_prompt.png"></p>
<p>Enfin, écrivez votre prompt et constatez le résultat :</p>
<p><img alt="Ollama WebUI prompt response" loading="lazy" src="/ollama_webui_response.png"></p>
<h2 id="conclusion">Conclusion</h2>
<p>Déployer un LLM dans Kubernetes avec Minikube se fait sans trop de difficultés,
un modèle est finalement exposé via une API comme le serait un webservice classique.
Il faut garder en tête que les modèles sont lourds et nécessitent beaucoup de ressources pour les faire tourner.</p>
<h2 id="ressources-supplémentaires">Ressources supplémentaires</h2>
<ul>
<li><a href="https://github.com/jmorganca/ollama">Documentation Ollama</a></li>
<li><a href="https://docs.vllm.ai/">vLLM Documentation</a></li>
<li><a href="https://minikube.sigs.k8s.io/docs/">Minikube Documentation</a></li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
