<?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>Cloud on Valérian Pyckaert</title>
    <link>https://valerian-pyckaert.dev/tags/cloud/</link>
    <description>Recent content in Cloud 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, 19 May 2026 08:00:00 +0200</lastBuildDate>
    <atom:link href="https://valerian-pyckaert.dev/tags/cloud/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Kubernetes v1.36</title>
      <link>https://valerian-pyckaert.dev/posts/kubernetes-haru/</link>
      <pubDate>Tue, 19 May 2026 08:00:00 +0200</pubDate>
      <guid>https://valerian-pyckaert.dev/posts/kubernetes-haru/</guid>
      <description>Kubernetes v1.36 : les nouveautés à connaître</description>
      <content:encoded><![CDATA[<blockquote>
<p><strong>Date de sortie :</strong> 22 avril 2026<br>
<strong>Nom de code :</strong> ハル (Haru — « Printemps » en japonais)</p>
</blockquote>
<hr>
<p>Kubernetes v1.36 est sorti fin avril 2026 sous le nom de code <em>Haru</em> (printemps en japonais), et c&rsquo;est une release dense.</p>
<p>Voici mon tour d&rsquo;horizon des changements les plus significatifs.</p>
<hr>
<h2 id="-sécurité--des-fondations-qui-arrivent-enfin-à-maturité">🔐 Sécurité : des fondations qui arrivent enfin à maturité</h2>
<h3 id="user-namespaces---stable">User Namespaces : 🟢 Stable</h3>
<p><strong>Le problème :</strong></p>
<p>Par défaut, un processus qui tourne en tant que <code>root</code> (UID 0) dans un conteneur est aussi <code>root</code> sur le nœud hôte. En cas de fuite de conteneur (<em>container escape</em>), l&rsquo;attaquant dispose immédiatement de privilèges root sur la machine, ce qui compromet l&rsquo;ensemble des workloads du nœud.</p>
<p><strong>La solution :</strong></p>
<p>Les <strong>User Namespaces</strong> (isolation des UID/GID entre le pod et le nœud) passent en <strong>GA</strong> (Stable). Kubernetes remape automatiquement les UID/GID du conteneur vers des UID/GID non privilégiés sur le nœud hôte. Un processus <code>root</code> dans le conteneur (UID 0) est vu comme un utilisateur sans privilège sur le nœud (ex : UID 65534).</p>
<p><strong>Exemple :</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Pod</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">app-with-userns</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">labels</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">app</span><span class="p">:</span><span class="w"> </span><span class="l">secure-app</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">hostUsers</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">  </span><span class="c"># Active les User Namespaces</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">containers</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span>- <span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">app</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">image</span><span class="p">:</span><span class="w"> </span><span class="l">myregistry/my-app:latest</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">securityContext</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">runAsUser</span><span class="p">:</span><span class="w"> </span><span class="m">0</span><span class="w">         </span><span class="c"># root dans le conteneur...</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">allowPrivilegeEscalation</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">capabilities</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">drop</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;ALL&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">    </span><span class="nt">resources</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">      </span><span class="nt">limits</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">memory</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;256Mi&#34;</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">        </span><span class="nt">cpu</span><span class="p">:</span><span class="w"> </span><span class="s2">&#34;500m&#34;</span><span class="w">
</span></span></span></code></pre></div><blockquote>
<p>Avec <code>hostUsers: false</code>, le UID 0 dans le conteneur est remappé vers un UID non privilégié sur le nœud (ex : 65536). Même en cas d&rsquo;évasion, l&rsquo;attaquant n&rsquo;a aucun privilège sur l&rsquo;hôte.</p>
</blockquote>
<h3 id="fine-grained-kubelet-api-authorization---stable">Fine-Grained Kubelet API Authorization : 🟢 Stable</h3>
<p><strong>Le problème :</strong></p>
<p>Kubelet est l&rsquo;agent qui tourne sur chaque machine de votre cluster et qui s&rsquo;assure que vos applications fonctionnent. Jusqu&rsquo;ici, les permissions pour accéder à cet agent étaient soit tout ou rien — un peu comme une serrure unique pour toute une maison.</p>
<p><strong>La solution :</strong></p>
<p>Il est maintenant possible de définir des permissions très précises : cet outil de monitoring peut seulement lire les logs, cet autre outil peut redémarrer des pods mais pas lire les données, etc.</p>
<p><strong>Pourquoi c&rsquo;est important :</strong></p>
<p>Si un outil tiers est compromis, il ne peut pas profiter de ses accès pour faire n&rsquo;importe quoi sur vos machines. C&rsquo;est le principe du moindre privilège appliqué là où ça compte vraiment.</p>
<p><strong>Exemple :</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="c"># Exemple de Role pour accéder uniquement aux logs des pods</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">rbac.authorization.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">Role</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="l">pod-log-reader</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">rules</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl">- <span class="nt">apiGroups</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">resources</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;pods/log&#34;</span><span class="p">]</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">verbs</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&#34;get&#34;</span><span class="p">,</span><span class="w"> </span><span class="s2">&#34;list&#34;</span><span class="p">]</span><span class="w">
</span></span></span></code></pre></div><h3 id="admission-policies-immuables---alpha">Admission Policies immuables : 🔴 Alpha</h3>
<p><strong>Le problème :</strong></p>
<p>Un administrateur mal intentionné (ou simplement qui fait une erreur) peut supprimer des règles de sécurité critiques sur un cluster.</p>
<p><strong>La solution :</strong></p>
<p>Certaines politiques de sécurité peuvent maintenant être déclarées comme permanentes dans des fichiers de configuration. Personne ne peut les supprimer via l&rsquo;API, il faudrait accès direct au cluster pour les retirer.</p>
<p><strong>Exemple :</strong></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-yaml" data-lang="yaml"><span class="line"><span class="cl"><span class="nt">apiVersion</span><span class="p">:</span><span class="w"> </span><span class="l">policy.k8s.io/v1</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">kind</span><span class="p">:</span><span class="w"> </span><span class="l">PodSecurityPolicy</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">metadata</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">name</span><span class="p">:</span><span class="w"> </span><span class="kc">no</span>-<span class="l">privileged</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">spec</span><span class="p">:</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="w">  </span><span class="nt">privileged</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nt">immutable</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="w">
</span></span></span></code></pre></div><h3 id="declarative-validation---stable">Declarative Validation : 🟢 Stable</h3>
<p><strong>Le problème :</strong></p>
<p>Quand on déploie une application sur Kubernetes, on peut définir des règles pour valider les configurations (ex : &ldquo;tous les pods doivent avoir un label env&rdquo;). Historiquement, ces validations passaient par des services externes appelés webhooks, qui rajoutaient de la complexité et pouvaient tomber en panne.</p>
<p><strong>La solution :</strong></p>
<p>Ces règles de validation peuvent maintenant être écrites directement dans la configuration Kubernetes, sans service intermédiaire. Kubernetes les vérifie lui-même, instantanément.</p>
<p><strong>Pourquoi c&rsquo;est important :</strong></p>
<p>Moins de webhooks à maintenir, moins de latence, et une validation plus robuste au niveau de l&rsquo;API Server.</p>
<hr>
<h2 id="-gestion-des-ressources--vers-plus-de-finesse">⚙️ Gestion des ressources : vers plus de finesse</h2>
<h3 id="in-place-vertical-scaling-au-niveau-pod---beta">In-Place Vertical Scaling au niveau Pod : 🟡 Beta</h3>
<p><strong>Le problème :</strong></p>
<p>Imaginez une application qui tourne en production et qui commence à manquer de mémoire.
Jusqu&rsquo;ici, la seule solution était de l&rsquo;arrêter, changer sa configuration, et la redémarrer soit manuellement, soit via le Vertical Pod Autoscaler (VPA).</p>
<p><strong>La solution :</strong></p>
<p>Il est maintenant possible d&rsquo;augmenter (ou réduire) la mémoire et le CPU alloués à une application en direct, sans interruption. Kubernetes ajuste les ressources à chaud.</p>
<p><em>J&rsquo;aime énormément cette feature pour les applications qui ont des besoins variables ou qui sont difficiles à dimensionner à l&rsquo;avance. C&rsquo;est un vrai gain de flexibilité et cette feature sera un atout pour réduire encore un peu plus notre facture cloud.</em></p>
<h3 id="tiered-memory-protection-with-memory-qos---beta">Tiered Memory Protection with Memory QoS : 🟡 Beta</h3>
<p>Kubernetes v1.36 affine le modèle d&rsquo;allocation mémoire : les pods critiques peuvent désormais bénéficier de garanties mémoire plus fortes, tandis que les pods best-effort sont soumis à une pression mémoire plus agressive. Une feature qui change la vie en production sur des nœuds fortement chargés.</p>
<h3 id="mutable-pod-resources-for-suspended-jobs---beta">Mutable Pod Resources for Suspended Jobs : 🟡 Beta</h3>
<p><strong>Le problème :</strong></p>
<p>Kubernetes permet de mettre en pause les ressources de type Job mais si on veut modifier les ressources allouées avant de reprendre le job, ce n&rsquo;était pas possible.</p>
<p><strong>La solution :</strong> Pendant qu&rsquo;un job est en pause, on peut maintenant modifier ses ressources (plus de mémoire, moins de CPU…) avant de le relancer.</p>
<hr>
<h2 id="-observabilité-et-scalabilité-de-lapi">📊 Observabilité et scalabilité de l&rsquo;API</h2>
<h3 id="psi-metrics---stable">PSI Metrics : 🟢 Stable</h3>
<p>Les métriques <strong>PSI (Pressure Stall Information)</strong> qui mesurent la pression réelle subie par les workloads sur le CPU, la mémoire et l&rsquo;I/O passent en <strong>GA</strong>. Ces métriques Linux sont bien plus précises que les métriques CPU classiques pour détecter une saturation réelle. Si vous utilisez Prometheus, commencez à les intégrer dès maintenant.</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-promql" data-lang="promql"><span class="line"><span class="cl"><span class="c1"># Exemple : pression mémoire sur les nœuds</span><span class="w">
</span></span></span><span class="line"><span class="cl"><span class="nv">container_memory_psi_full_total</span><span class="w">
</span></span></span></code></pre></div><p>Cf. <a href="https://kubernetes.io/docs/reference/instrumentation/understand-psi-metrics/">PSI Metrics Documentation</a> pour plus de détails.</p>
<hr>
<h2 id="-stockage">💾 Stockage</h2>
<h3 id="volume-group-snapshots---stable">Volume Group Snapshots : 🟢 Stable</h3>
<p>Les <strong>snapshots groupés de volumes</strong> (capturer atomiquement plusieurs PVCs en une seule opération) atteignent la <strong>GA</strong>. Indispensable pour les bases de données distribuées où la cohérence des snapshots entre plusieurs volumes est critique.</p>
<hr>
<h2 id="-réseau--gateway-api-v15">🌐 Réseau : Gateway API v1.5</h2>
<p>En parallèle de la release Kubernetes, <strong>Gateway API v1.5</strong> est sorti avec plusieurs features passant en stable. Le projet continue de s&rsquo;imposer comme le successeur d&rsquo;Ingress, et l&rsquo;outil <a href="https://kubernetes.io/blog/2026/03/20/ingress2gateway-1-0-release/">Ingress2Gateway 1.0</a> facilite désormais la migration automatisée de vos ressources Ingress existantes.</p>
<p><em>Je prévois de faire un article dédié sur Gateway API dans les prochaines semaines, c&rsquo;est une évolution majeure pour la gestion du trafic dans Kubernetes et il y a beaucoup à dire sur les nouvelles possibilités offertes par cette API.</em></p>
<hr>
<h2 id="-dépréciations-et-suppressions-à-surveiller">🗑️ Dépréciations et suppressions à surveiller</h2>
<h3 id="service-externalips">Service ExternalIPs</h3>
<p>Dépréciés, suppression imminente en v1.37. Si vous utilisez des ExternalIPs pour exposer vos services, il est temps de migrer vers des solutions plus modernes comme les LoadBalancers ou la Gateway API.</p>
<p><strong>Comment vérifier si vous êtes concernés ?</strong></p>
<p>Rien de plus simple avec <a href="https://jqlang.org/">JQ</a> et kubectl :</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">kubectl get svc --all-namespaces -o json <span class="p">|</span> jq <span class="s1">&#39;.items[] | select(.spec.externalIPs != null) | {namespace: .metadata.namespace, name: .metadata.name, externalIPs: .spec.externalIPs}&#39;</span>
</span></span></code></pre></div><hr>
<h2 id="-ce-que-ça-change-pour-vos-clusters">🔄 Ce que ça change pour vos clusters</h2>
<table>
  <thead>
      <tr>
          <th>Domaine</th>
          <th>Nouveauté</th>
          <th>Statut</th>
          <th>Impact</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Sécurité</td>
          <td>User Namespaces</td>
          <td><strong>GA</strong></td>
          <td>Activer en prod dès maintenant</td>
      </tr>
      <tr>
          <td>Sécurité</td>
          <td>Kubelet API Authorization</td>
          <td><strong>GA</strong></td>
          <td>Affiner les RBAC Kubelet</td>
      </tr>
      <tr>
          <td>Observabilité</td>
          <td>PSI Metrics</td>
          <td><strong>GA</strong></td>
          <td>Intégrer dans vos dashboards</td>
      </tr>
      <tr>
          <td>Stockage</td>
          <td>Volume Group Snapshots</td>
          <td><strong>GA</strong></td>
          <td>Utiliser pour les BDD distribuées</td>
      </tr>
      <tr>
          <td>Validation</td>
          <td>Declarative Validation (CEL)</td>
          <td><strong>GA</strong></td>
          <td>Réduire vos admission webhooks</td>
      </tr>
      <tr>
          <td>Ressources</td>
          <td>In-Place Pod Resize (pod-level)</td>
          <td>Beta</td>
          <td>Tester sur staging</td>
      </tr>
      <tr>
          <td>Ressources</td>
          <td>Memory QoS étagé</td>
          <td>Beta</td>
          <td>Utile sur nœuds saturés</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="conclusion">Conclusion</h2>
<p>Kubernetes v1.36 <em>Haru</em> est une release accès sur une gestion plus fine des ressources et sur la sécurité. Plusieurs features clés passent en GA(Stable) et peuvent désormais être utilisées en production.</p>
<p>Le gros point d&rsquo;attention concerne le décommissionnement à venir des ExternalIPs, qui peut impacter les clusters qui les utilisent pour exposer des services.</p>
<hr>
<p><em>Sources : <a href="https://kubernetes.io/blog/2026/04/22/kubernetes-v1-36-release/">Kubernetes v1.36 Release Notes</a> · <a href="https://kubernetes.io/blog/">Kubernetes Blog</a>, <a href="https://kubernetes.io/docs/reference/instrumentation/understand-psi-metrics/">PSI Metrics Documentation</a>, <a href="https://facebookmicrosites.github.io/psi/docs/overview">PSI Overview</a></em></p>
]]></content:encoded>
    </item>
  </channel>
</rss>
