<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Observability on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/observability/</link><description>Recent content in Observability on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 03 Nov 2025 12:00:00 +0200</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/observability/index.xml" rel="self" type="application/rss+xml"/><item><title>Un nouveau champ `log` pour les network policies Cilium : une idée de use case</title><link>https://blog.zwindler.fr/2025/11/03/cilium-policy-log-field-limitation-fr/</link><pubDate>Mon, 03 Nov 2025 12:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2025/11/03/cilium-policy-log-field-limitation-fr/</guid><description>&lt;img src="https://blog.zwindler.fr/2025/10/cilium-hubble.webp" alt="Featured image of post Un nouveau champ `log` pour les network policies Cilium : une idée de use case" /&gt;&lt;h2 id="tldr"&gt;TL;DR
&lt;/h2&gt;&lt;p&gt;Cilium 1.18 a ajouté un champ &lt;code&gt;log&lt;/code&gt; aux CiliumNetworkPolicies pour taguer les verdicts de flux (FORWARDED, DROPPED, AUDIT, &amp;hellip;) avec des labels personnalisés. Dans l&amp;rsquo;idée, c&amp;rsquo;est la fonctionnalité parfaite pour éviter de logger le trafic bloqué que l&amp;rsquo;on connait dans nos dashboards de monitoring !&lt;/p&gt;
&lt;p&gt;Mais il y a un hic, sans rapport avec cette fonctionnalité, qui rend cette idée inutilisable : on ne peut pas l&amp;rsquo;utiliser avec &lt;code&gt;egressDeny&lt;/code&gt; + &lt;code&gt;toFQDNs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;ET, il y a un bug, qui fait que le &amp;ldquo;log&amp;rdquo; n&amp;rsquo;est visible que sur le trafic &amp;ldquo;autorisé&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Je vous raconte&amp;hellip;&lt;/p&gt;
&lt;h2 id="le-problème--monitor-all-the-things-mais-pas-trop"&gt;Le problème : monitor all the things (mais pas trop)
&lt;/h2&gt;&lt;p&gt;Comme toute bonne équipe &amp;ldquo;ops&amp;rdquo; qui se respecte, nous monitorons/loggons les flux réseau de notre cluster Kubernetes avec Hubble pour une analyse ultérieure et de l&amp;rsquo;alerting. Nous (en particulier mon collègue Nicolas Nativel) poussons tous les flux &lt;code&gt;AUDIT&lt;/code&gt; et &lt;code&gt;DROPPED&lt;/code&gt; vers un dashboard Grafana pour pouvoir rapidement repérer quand quelque chose est bloqué et décider :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;C&amp;rsquo;est légitime ? → On ouvre le flux&lt;/li&gt;
&lt;li&gt;C&amp;rsquo;est suspect ? → On déclenche l&amp;rsquo;alarme 🚨&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/10/cilium-hubble.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Ça fonctionne plutôt bien&amp;hellip; jusqu&amp;rsquo;à ce qu&amp;rsquo;on commence à bloquer &lt;strong&gt;explicitement&lt;/strong&gt; des choses qu&amp;rsquo;on &lt;em&gt;sait&lt;/em&gt; devoir être bloquées.&lt;/p&gt;
&lt;p&gt;Dans notre cas, nous voulions empêcher une application tierce d&amp;rsquo;envoyer les données de &amp;ldquo;télémétrie&amp;rdquo; (ouais, appelons ça comme ça 😏). On parle d&amp;rsquo;appels HTTPS vers des domaines de tracking externes.&lt;/p&gt;
&lt;p&gt;Le problème ? Si on bloque simplement ces flux, ils apparaîtront comme &lt;code&gt;DROPPED&lt;/code&gt; dans Hubble, déclencheront notre monitoring, et on se retrouvera avec des alertes pour quelque chose qu&amp;rsquo;on a &lt;em&gt;intentionnellement&lt;/em&gt; bloqué.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est du bruit dont on ne veut pas.&lt;/p&gt;
&lt;h2 id="et-donc-ce-champ-log-des-network-policies-de-cilium-118-"&gt;Et donc, ce champ log des network policies de Cilium 1.18 ?
&lt;/h2&gt;&lt;p&gt;Bonne nouvelle ! Cilium 1.18 a introduit exactement ce dont nous avions besoin : la possibilité d&amp;rsquo;ajouter des champs de log personnalisés aux verdicts sur les network policies.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cf. &lt;a class="link" href="https://isovalent.com/blog/post/cilium-1-18/#hubble-flow-policy-log-field" target="_blank" rel="noopener"
&gt;l&amp;rsquo;annonce dans le blogpost officiel&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;idée est simple : vous ajoutez un champ &lt;code&gt;log.value&lt;/code&gt; à votre CiliumNetworkPolicy :&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="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;cilium.io/v2&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;CiliumNetworkPolicy&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;metadata&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-policy&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;spec&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;endpointSelector&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;matchLabels&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;app&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-app&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;egress&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;toFQDNs&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;matchName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;example.com&amp;#34;&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;log&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;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;my-custom-log-tag&amp;#34;&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;Ensuite, quand vous observez les flux dans Hubble, vous pouvez &lt;strong&gt;les filtrer&lt;/strong&gt; en utilisant &lt;a class="link" href="https://kubernetes.io/docs/reference/using-api/cel/" target="_blank" rel="noopener"
&gt;CEL (Common Expression Language)&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;hubble observe &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --verdict AUDIT &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --not &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --cel-expression &lt;span class="s2"&gt;&amp;#34;(_flow.policy_log.endsWith(&amp;#39;my-custom-log-tag&amp;#39;))&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --print-raw-filters
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Output :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;allowlist:
- &amp;#39;{&amp;#34;verdict&amp;#34;:[&amp;#34;AUDIT&amp;#34;]}&amp;#39;
denylist:
- &amp;#39;{&amp;#34;experimental&amp;#34;:{&amp;#34;cel_expression&amp;#34;:[&amp;#34;(_flow.policy_log.endsWith(&amp;#39;&amp;#39;my-custom-log-tag&amp;#39;&amp;#39;))&amp;#34;]}}&amp;#39;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Parfait ! Vous savez maintenant taguer les calls que vous avez explicitement bloqués et les exclure de votre monitoring. 🎉&lt;/p&gt;
&lt;h2 id="le-plan--bloquer-la-télémétrie-élégamment"&gt;Le plan : bloquer la télémétrie élégamment
&lt;/h2&gt;&lt;p&gt;À l&amp;rsquo;aide de cette nouvelle fonctionnalité, nous avons élaboré notre stratégie :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Utiliser &lt;code&gt;egressDeny&lt;/code&gt; pour bloquer explicitement les domaines de télémétrie&lt;/li&gt;
&lt;li&gt;Ajouter un champ de log personnalisé : &lt;code&gt;app-explicit-traffic-blocked&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Configurer Hubble pour filtrer les verdicts de flux avec ce tag&lt;/li&gt;
&lt;li&gt;Profit ! 🎉&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Voici ce que nous avons essayé :&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="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;cilium.io/v2&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;CiliumNetworkPolicy&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;metadata&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;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;app-external-block-policy&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;namespace&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-namespace&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;spec&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;endpointSelector&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;matchLabels&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;app.kubernetes.io/name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;my-app&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="c"&gt;# note: egressDeny prend la précédence sur les règles egress&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="c"&gt;# https://docs.cilium.io/en/stable/security/policy/language/#deny-policies&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;egressDeny&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="c"&gt;# Bloquer tout le trafic externe et le logger avec un champ de log arbitraire&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="c"&gt;# Ceci est utilisé pour empêcher l&amp;#39;app d&amp;#39;envoyer des données de télémétrie à l&amp;#39;extérieur&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="c"&gt;# sans déclencher d&amp;#39;alerte AUDIT/DROPPED&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="c"&gt;# fonctionnalité ajoutée dans cilium 1.18.0 https://github.com/cilium/cilium/pull/39902&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;toFQDNs&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;matchPattern&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;*.telemetry.example.com&amp;#34;&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;toPorts&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;ports&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;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;443&amp;#34;&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;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;TCP&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;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;80&amp;#34;&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;protocol&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;TCP&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;log&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;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;app-explicit-traffic-blocked&amp;#34;&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;Ça devrait fonctionner, non ? On utilise &lt;code&gt;egressDeny&lt;/code&gt; (qui &lt;a class="link" href="https://docs.cilium.io/en/stable/security/policy/language/#deny-policies" target="_blank" rel="noopener"
&gt;prend la précédence sur les autres règles&lt;/a&gt;, ce qui est une bonne chose !), et on le tague avec notre log personnalisé.&lt;/p&gt;
&lt;h2 id="retour-à-la-réalité"&gt;Retour à la réalité
&lt;/h2&gt;&lt;p&gt;Et puis&amp;hellip; &lt;strong&gt;patatra&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;En lisant la &lt;a class="link" href="https://docs.cilium.io/en/stable/security/policy/language/#deny-policies" target="_blank" rel="noopener"
&gt;documentation Cilium sur les deny policies&lt;/a&gt;, nous sommes tombés sur cette petite note de rien du tout :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Deny policies do not support:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;policy enforcement at L7, i.e., specifically denying an URL&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;toFQDNs&lt;/strong&gt;, i.e., specifically denying traffic to a specific domain name.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;Attendez, quoi ?&lt;/p&gt;
&lt;p&gt;On &lt;strong&gt;ne peut pas&lt;/strong&gt; utiliser &lt;code&gt;toFQDNs&lt;/code&gt; avec &lt;code&gt;egressDeny&lt;/code&gt;. Tout notre plan vient de s&amp;rsquo;effondrer 😱.&lt;/p&gt;
&lt;h2 id="pourquoi-cest-un-problème-déjà-"&gt;Pourquoi c&amp;rsquo;est un problème, déjà ?
&lt;/h2&gt;&lt;p&gt;Le problème, c&amp;rsquo;est le modèle de précédence dans Cilium :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Les règles &lt;code&gt;egressDeny&lt;/code&gt; prennent la précédence sur les règles &lt;code&gt;egress&lt;/code&gt; (by design, et c&amp;rsquo;est bien !)&lt;/li&gt;
&lt;li&gt;Mais si on utilise &lt;code&gt;egressDeny&lt;/code&gt;, on ne peut pas utiliser &lt;code&gt;toFQDNs&lt;/code&gt; pour cibler intelligemment le domaine incriminé, on doit bloquer par IP ou CIDR&lt;/li&gt;
&lt;li&gt;Ces services de télémétrie utilisent &lt;em&gt;probablement&lt;/em&gt; des IPs dynamiques pour leurs endpoints (bonne chance pour maintenir une liste&amp;hellip;)&lt;/li&gt;
&lt;li&gt;Et si on bloque tout le trafic 80/443 dans &lt;code&gt;egressDeny&lt;/code&gt;, on ne peut pas faire d&amp;rsquo;exceptions pour le trafic légitime dans les règles &lt;code&gt;egress&lt;/code&gt; car&amp;hellip; &lt;em&gt;deny&lt;/em&gt; prend la précédence sur &lt;em&gt;allow&lt;/em&gt; !&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;On est coincé entre le marteau et l&amp;rsquo;enclume :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Utiliser &lt;code&gt;egress&lt;/code&gt; avec &lt;code&gt;toFQDNs&lt;/code&gt; → ça marche, mais on ne peut pas &lt;strong&gt;bloquer&lt;/strong&gt;, seulement autoriser&lt;/li&gt;
&lt;li&gt;Utiliser &lt;code&gt;egressDeny&lt;/code&gt; avec des IPs → on va jouer au chat et à la souris avec des plages IP qui changent&lt;/li&gt;
&lt;li&gt;Utiliser &lt;code&gt;egressDeny&lt;/code&gt; pour bloquer tout le 80/443 → on bloque tout, y compris le trafic légitime&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="solutions-de-contournement-potentielles"&gt;Solutions de contournement potentielles
&lt;/h2&gt;&lt;p&gt;En attendant que Cilium supporte &lt;code&gt;toFQDNs&lt;/code&gt; dans les policies &lt;code&gt;egressDeny&lt;/code&gt;, voici quelques approches alternatives que vous pourriez envisager :&lt;/p&gt;
&lt;h3 id="trouver-un-moyen-de-désactiver-la-télémétrie-directement-dans-lapp"&gt;Trouver un moyen de désactiver la télémétrie directement dans l&amp;rsquo;app
&lt;/h3&gt;&lt;p&gt;C&amp;rsquo;est la meilleure option, mais malheureusement pas toujours sur la table.&lt;/p&gt;
&lt;h3 id="blocage-basé-sur-le-dns"&gt;Blocage basé sur le DNS
&lt;/h3&gt;&lt;p&gt;Configurer le serveur DNS pour retourner NXDOMAIN pour les domaines de télémétrie, comme un serveur &lt;a class="link" href="https://pi-hole.net/" target="_blank" rel="noopener"
&gt;pi-hole&lt;/a&gt; personnel le ferait avec les pubs. L&amp;rsquo;application échouera à résoudre le domaine et n&amp;rsquo;enverra pas de données.&lt;/p&gt;
&lt;h3 id="utiliser-egressdeny-basé-sur-les-ips-avec-un-overhead-de-maintenance"&gt;Utiliser egressDeny basé sur les IPs (avec un overhead de maintenance)
&lt;/h3&gt;&lt;p&gt;Résoudre les FQDNs de télémétrie vers leurs plages IP actuelles et les bloquer avec &lt;code&gt;egressDeny&lt;/code&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="nt"&gt;egressDeny&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;toCIDRSet&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;cidr&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="m"&gt;203.0.113.0&lt;/span&gt;&lt;span class="l"&gt;/24 &lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c"&gt;# Exemple de plage IP de télémétrie&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;toPorts&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;ports&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;port&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;443&amp;#34;&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;Si la liste n&amp;rsquo;évolue pas trop souvent, c&amp;rsquo;est une bonne option.&lt;/p&gt;
&lt;h2 id="ok-mais-imaginons-quil-ny-ait-pas-de-trafic-légitime-peut-on-utiliser-la-fonctionnalité-pour-ajouter-un-log-sur-le-trafic-droppé-"&gt;OK, mais imaginons qu&amp;rsquo;il n&amp;rsquo;y ait pas de trafic légitime. Peut-on utiliser la fonctionnalité pour ajouter un log sur le trafic droppé ?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Malheureusement non, pas pour le moment.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Il y a un bug dans cette nouvelle fonctionnalité de Cilium qui ne log le champ &lt;code&gt;policy_log&lt;/code&gt; que sur les flux &amp;ldquo;autorisés&amp;rdquo;, pas sur les flux audit/dropped.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/cilium/cilium/issues/42044" target="_blank" rel="noopener"
&gt;Policy log does not work for DROPPED/AUDIT flow&lt;/a&gt; ouverte par mon collègue Nicolas :&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;When defining a CiliumNetworkPolicy with the spec.log field configured, I expect the relevant hubble flows to have the policy_log field. It works for allowed flow.&lt;/p&gt;
&lt;p&gt;But for denied/audited flow resulting from the rule (implicit or explicit), policy_log is never available.&lt;/p&gt;
&lt;p&gt;Note: I observe the same issue with &lt;code&gt;--print-policy-names&lt;/code&gt; option of hubble, the k8s:io.cilium.k8s.policy.derived-from label is not set for denied flows (but correctly set for allowed flows).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;et une autre issue &lt;a class="link" href="https://github.com/cilium/cilium/issues/41912" target="_blank" rel="noopener"
&gt;[Hubble CLI] &amp;ndash;print-policy-names flag does not do anything&lt;/a&gt; ouverte par quelqu&amp;rsquo;un d&amp;rsquo;autre.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Puisque 2 tickets sont ouverts et que les mainteneurs ont commencé à répondre dessus, on peut espérer que ce soit corrigé un jour.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;Dans notre cas d&amp;rsquo;usage, nous n&amp;rsquo;avons finalement pas utilisé cette nouvelle fonctionnalité de Cilium. Mais donner la possibilité d&amp;rsquo;ajouter des détails (et permettre de filtrer dessus également) est toujours une feature sympa.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un grand merci à mon collègue Nicolas Nativel, qui a fait la majorité du travail autour des CiliumNetworkPolicies, incluant les dashboards, le travail exploratoire sur cette fonctionnalité, et a pris le temps de créer l&amp;rsquo;issue sur le repo Cilium.&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id="références"&gt;Références
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://isovalent.com/blog/post/cilium-1-18/#hubble-flow-policy-log-field" target="_blank" rel="noopener"
&gt;Blogpost officiel pour la sortie de Cilium 1.18 - Hubble flow policy log field&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.danielstechblog.io/ciliums-new-hubble-flow-policy-log-field/" target="_blank" rel="noopener"
&gt;Daniel&amp;rsquo;s Tech Blog - Cilium&amp;rsquo;s new Hubble flow policy log field&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.cilium.io/en/stable/security/policy/language/#deny-policies" target="_blank" rel="noopener"
&gt;Docs Cilium - Deny Policies&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/cilium/cilium/pull/39902" target="_blank" rel="noopener"
&gt;GitHub PR #39902 - Add policy log field&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/cilium/cilium/issues/42044" target="_blank" rel="noopener"
&gt;GitHub Issue #42044 - Policy log does not work for DROPPED/AUDIT flow&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>SLO, SLI, Error Budget et Critical User Journey expliqués simplement (et pourquoi ce ne sont pas des SLA !) (en plusieurs prompts)</title><link>https://blog.zwindler.fr/2025/06/17/slo-sli-error-budget-critical-user-journey-expliques-simplement/</link><pubDate>Tue, 17 Jun 2025 18:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2025/06/17/slo-sli-error-budget-critical-user-journey-expliques-simplement/</guid><description>&lt;img src="https://blog.zwindler.fr/talks/2022-sre-sre-partout/binaries/sre_sre_partout.webp" alt="Featured image of post SLO, SLI, Error Budget et Critical User Journey expliqués simplement (et pourquoi ce ne sont pas des SLA !) (en plusieurs prompts)" /&gt;&lt;p&gt;&lt;strong&gt;NOTE IMPORTANTE :&lt;/strong&gt; cet article a été généré par un LLM. Ceci va à l&amp;rsquo;encontre de règles que je me suis fixé pour ce blog (cf l&amp;rsquo;&lt;a class="link" href="https://blog.zwindler.fr/ai-manifesto/" target="_blank" rel="noopener"
&gt;AI Manifesto&lt;/a&gt;).&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Je pars du principe que si je ne prends pas la peine d’écrire moi-même le contenu de ce blog, vous ne devriez pas prendre la peine de le lire.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je l&amp;rsquo;ai fait dans le cadre d&amp;rsquo;une expérience qui est décrite dans l&amp;rsquo;article suivant :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://blog.zwindler.fr/2025/06/17/reflexions-blogging-technique-ere-llms/" &gt;Réflexions sur le blogging technique à l&amp;rsquo;ère des LLMs&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cependant, je ne vous interdit pas de lire cet article ci (les informations qu&amp;rsquo;il contient sur les SLOs sont correctes), je veux juste que vous le fassiez en connaissance de cause ;-P.&lt;/p&gt;
&lt;h2 id="introduction--quand-les-devs-découvrent-le-sre"&gt;Introduction : quand les devs découvrent le SRE
&lt;/h2&gt;&lt;p&gt;Suite à plusieurs discussions récentes avec des collègues développeurs, je me suis rendu compte que les concepts SRE comme les SLO, SLI et Error Budget restaient flous pour beaucoup d&amp;rsquo;entre eux. Pourtant, ces notions sont de plus en plus utilisées dans nos équipes, souvent sans qu&amp;rsquo;on prenne le temps de bien les expliquer.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est donc l&amp;rsquo;occasion parfaite pour revenir aux fondamentaux et expliquer ces concepts tels qu&amp;rsquo;ils ont été conçus à l&amp;rsquo;origine par Google. Car oui, il faut le rappeler : le SRE (Site Reliability Engineering) et tous les concepts associés ont été inventés par Google, plus précisément par Ben Treynor Sloss en 2003, bien avant que DevOps ne devienne populaire !&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;idée de Google était simple : et si on demandait à des ingénieurs logiciel de concevoir une équipe d&amp;rsquo;exploitation ? De cette approche sont nés des concepts révolutionnaires pour mesurer et gérer la fiabilité des services.&lt;/p&gt;
&lt;p&gt;Fun fact : j&amp;rsquo;avais déjà abordé ces sujets dans &lt;a class="link" href="https://blog.zwindler.fr/talks/2022-sre-sre-partout/index.html" &gt;mon talk sur le SRE en 2022&lt;/a&gt;, mais je me dis qu&amp;rsquo;un article dédié ne fait pas de mal pour clarifier les choses :-).&lt;/p&gt;
&lt;h2 id="sla-vs-slo--ne-mélangeons-pas-tout-"&gt;SLA vs SLO : ne mélangeons pas tout !
&lt;/h2&gt;&lt;p&gt;Avant de rentrer dans le vif du sujet, petit aparté important : &lt;strong&gt;ne confondez pas SLA et SLO&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;Le SLA (Service Level Agreement), c&amp;rsquo;est un contrat, souvent avec des pénalités financières si pas respecté. Genre &amp;ldquo;si le service est en panne plus de X heures dans le mois, on vous rembourse Y€&amp;rdquo;. Le SLO (Service Level Objective), c&amp;rsquo;est un objectif &lt;strong&gt;interne&lt;/strong&gt; que vous vous fixez pour la fiabilité de votre service.&lt;/p&gt;
&lt;p&gt;La différence est importante : les SLA sont souvent moins stricts que les SLO pour avoir une marge de manœuvre. Si votre SLA c&amp;rsquo;est 99,9% de disponibilité, votre SLO interne sera peut-être à 99,95%.&lt;/p&gt;
&lt;p&gt;Bon, maintenant qu&amp;rsquo;on a éclairci ça, rentrons dans le détail !&lt;/p&gt;
&lt;h2 id="critical-user-journey--commencer-par-ce-qui-compte-vraiment"&gt;Critical User Journey : commencer par ce qui compte vraiment
&lt;/h2&gt;&lt;blockquote&gt;
&lt;p&gt;Est-ce que le &lt;strong&gt;client&lt;/strong&gt; est content d&amp;rsquo;utiliser le service ?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C&amp;rsquo;est LA question fondamentale. Et pour y répondre, il faut d&amp;rsquo;abord identifier les &lt;strong&gt;Critical User Journey&lt;/strong&gt; (CUJ), autrement dit les parcours utilisateurs critiques.&lt;/p&gt;
&lt;p&gt;Mais attention, quand on parle d&amp;rsquo;&lt;strong&gt;utilisateur&lt;/strong&gt; dans le contexte SRE, ce n&amp;rsquo;est pas forcément l&amp;rsquo;utilisateur final ! Pour un service backend, l&amp;rsquo;utilisateur peut être le frontend qui fait les appels API. Pour une plateforme de CI/CD, ce sont les développeurs qui veulent livrer une nouvelle version. Pour une base de données, ce sont les applications qui l&amp;rsquo;interrogent.&lt;/p&gt;
&lt;p&gt;Concrètement, ça veut dire quoi ? Prenons l&amp;rsquo;exemple d&amp;rsquo;une plateforme e-commerce. Les CUJ pourraient être : un utilisateur peut rechercher et consulter un produit, il peut ajouter un produit au panier et passer commande, il peut se connecter à son compte.&lt;/p&gt;
&lt;p&gt;On ne va pas définir des SLO pour toutes les fonctionnalités (la page &amp;ldquo;À propos&amp;rdquo; de votre site, on s&amp;rsquo;en fiche un peu), mais se concentrer sur celles qui, si elles tombent en panne, vont vraiment énerver vos utilisateurs.&lt;/p&gt;
&lt;p&gt;Et c&amp;rsquo;est là que ça devient intéressant : définir les CUJ, c&amp;rsquo;est souvent un exercice qui doit impliquer le business, pas seulement les équipes techniques. C&amp;rsquo;est eux qui savent ce qui rapporte de l&amp;rsquo;argent !&lt;/p&gt;
&lt;h2 id="sli--mesurer-ce-qui-compte"&gt;SLI : mesurer ce qui compte
&lt;/h2&gt;&lt;p&gt;Une fois qu&amp;rsquo;on a identifié nos CUJ, il faut les &lt;strong&gt;mesurer&lt;/strong&gt;. C&amp;rsquo;est là qu&amp;rsquo;interviennent les &lt;strong&gt;SLI (Service Level Indicators)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Un SLI, c&amp;rsquo;est simplement une métrique qui indique si votre service fonctionne bien du point de vue de l&amp;rsquo;utilisateur. Les plus classiques sont la disponibilité (pourcentage de requêtes qui réussissent), la latence (temps de réponse du service), le débit (nombre de requêtes traitées par seconde) et la qualité (pourcentage de réponses correctes, sans erreurs de données).&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;idée clé ici, c&amp;rsquo;est de mesurer depuis le point de vue de l&amp;rsquo;utilisateur, pas depuis vos serveurs. Peu importe que votre CPU soit à 10% si l&amp;rsquo;utilisateur voit des erreurs 500 !&lt;/p&gt;
&lt;h3 id="quelques-conseils-pour-choisir-vos-sli"&gt;Quelques conseils pour choisir vos SLI
&lt;/h3&gt;&lt;p&gt;Pour vous aider à concevoir des SLI fiables, vous pouvez vous inspirer des méthodes &lt;strong&gt;USE&lt;/strong&gt; et &lt;strong&gt;RED&lt;/strong&gt;. USE (Utilization, Saturation, Errors) se concentre sur les ressources systèmes, tandis que RED (Rate, Errors, Duration) se concentre sur les requêtes. Ces frameworks vous donnent un bon point de départ pour identifier les métriques qui comptent vraiment.&lt;/p&gt;
&lt;p&gt;Mais attention, un microservice ne doit pas avoir trop de SLI ! Trois ou quatre SLI bien choisies et qui ont un sens métier valent mieux qu&amp;rsquo;une dizaine de métriques que personne ne regarde. D&amp;rsquo;ailleurs, seuls les membres de l&amp;rsquo;équipe qui fournissent le service peuvent vraiment savoir quelles sont les métriques pertinentes. On ne peut pas imposer des SLI génériques à toute une entreprise !&lt;/p&gt;
&lt;p&gt;Exemple concret pour notre CUJ &amp;ldquo;recherche de produit&amp;rdquo; : SLI disponibilité pourrait être &lt;code&gt;(requêtes HTTP 200 sur /search) / (total requêtes sur /search) * 100&lt;/code&gt;, et SLI latence &lt;code&gt;95% des requêtes sur /search répondent en moins de X ms&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="slo--se-fixer-des-objectifs-réalistes"&gt;SLO : se fixer des objectifs réalistes
&lt;/h2&gt;&lt;p&gt;Maintenant qu&amp;rsquo;on sait &lt;strong&gt;quoi&lt;/strong&gt; mesurer, il faut se fixer des &lt;strong&gt;objectifs&lt;/strong&gt;. C&amp;rsquo;est le rôle des &lt;strong&gt;SLO (Service Level Objectives)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Un SLO, c&amp;rsquo;est tout simplement une valeur cible pour vos SLI sur une période donnée. Par exemple : &amp;ldquo;99,9% des requêtes de recherche doivent réussir sur une période de 30 jours&amp;rdquo; ou &amp;ldquo;95% des pages de recherche doivent s&amp;rsquo;afficher en moins de 500ms sur une période de 7 jours&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="quelques-conseils-pour-bien-définir-vos-slo"&gt;Quelques conseils pour bien définir vos SLO
&lt;/h3&gt;&lt;p&gt;Commencez par mesurer l&amp;rsquo;existant. Inutile de viser 99,99% si votre service actuel est à 98%. Regardez vos métriques historiques et fixez-vous des objectifs atteignables mais ambitieux.&lt;/p&gt;
&lt;p&gt;Pensez S.M.A.R.T. : vos SLO doivent être Spécifiques, Mesurables, Atteignables, Réalistes et Temporellement définis. Comme tout bon objectif !&lt;/p&gt;
&lt;p&gt;Et n&amp;rsquo;oubliez pas que 100% c&amp;rsquo;est mal ! Comme le dit si bien Ben Treynor Sloss (le papa du SRE chez Google) :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;100% is the &lt;strong&gt;wrong&lt;/strong&gt; reliability target for basically everything&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Plus on veut de &amp;ldquo;9&amp;rdquo;, plus ça coûte cher exponentiellement. Et au-delà d&amp;rsquo;un certain seuil, les utilisateurs ne voient même plus la différence ! Prenez l&amp;rsquo;exemple d&amp;rsquo;un site web qui ne charge pas sur un smartphone : au-delà d&amp;rsquo;un certain niveau de disponibilité, l&amp;rsquo;utilisateur ne saura pas dire si c&amp;rsquo;est son smartphone qui a un problème, son navigateur, le réseau 5G ou bien le site web qui rencontre un incident. Si recharger la page une fois de temps en temps suffit et que les utilisateurs ne sont pas plus impactés que ça, inutile d&amp;rsquo;investir dans plus de fiabilité.&lt;/p&gt;
&lt;p&gt;Pour vous aider à calculer ces pourcentages et temps d&amp;rsquo;indisponibilité, vous pouvez utiliser &lt;a class="link" href="https://uptime.is/" target="_blank" rel="noopener"
&gt;uptime.is&lt;/a&gt; qui fait les conversions pour vous.&lt;/p&gt;
&lt;h2 id="error-budget--retourner-le-problème"&gt;Error Budget : retourner le problème
&lt;/h2&gt;&lt;p&gt;Et là, c&amp;rsquo;est le moment où ça devient vraiment malin. Au lieu de raisonner en &amp;ldquo;disponibilité&amp;rdquo;, les équipes SRE raisonnent en &lt;strong&gt;Error Budget&lt;/strong&gt; (budget d&amp;rsquo;erreur).&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est un simple changement de perspective : service accessible 99,9% = service &lt;strong&gt;inaccessible&lt;/strong&gt; 0,1% du temps. Sur 30 jours, ça fait environ 43 minutes d&amp;rsquo;indisponibilité &amp;ldquo;autorisée&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Cette approche change complètement la donne ! Au lieu de voir les pannes comme des échecs, on les voit comme un &lt;strong&gt;budget à dépenser intelligemment&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="comment-utiliser-son-error-budget-"&gt;Comment utiliser son Error Budget ?
&lt;/h3&gt;&lt;p&gt;Contre-intuitivement&amp;hellip; &lt;strong&gt;IL FAUT L&amp;rsquo;UTILISER&lt;/strong&gt; !&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/talks/2022-sre-sre-partout/binaries/simpsons.png"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Si votre SLO est respecté (utilisateurs contents), vous pouvez &amp;ldquo;dépenser&amp;rdquo; votre error budget pour faire des déploiements plus risqués, tester des nouvelles fonctionnalités en prod, faire du chaos engineering, ou réaliser des maintenances disruptives.&lt;/p&gt;
&lt;p&gt;À l&amp;rsquo;inverse, si vous &amp;ldquo;cramez&amp;rdquo; votre error budget (SLO pas atteint), alors là, stop : on arrête tout ce qui n&amp;rsquo;améliore pas la fiabilité du service !&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;est un formidable outil de priorisation entre les équipes produit (qui veulent des nouvelles features) et les équipes ops (qui veulent de la stabilité). Le fameux mur de la confusion :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/talks/2022-sre-sre-partout/binaries/mur_de_la_confusion.png"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="exemple-concret--une-api-de-recommendation"&gt;Exemple concret : une API de recommendation
&lt;/h2&gt;&lt;p&gt;Bon, assez de théorie, prenons un exemple concret. Imaginons qu&amp;rsquo;on ait une API de recommandation de produits.&lt;/p&gt;
&lt;p&gt;D&amp;rsquo;abord, on définit le CUJ : &amp;ldquo;Un utilisateur doit pouvoir récupérer des recommandations personnalisées en moins de 1 seconde&amp;rdquo;. Ensuite, on choisit les SLI : disponibilité &lt;code&gt;(réponses HTTP 200) / (total requêtes) * 100&lt;/code&gt; et latence &lt;code&gt;P95 du temps de réponse&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Pour les SLO, on pourrait avoir : &amp;ldquo;99,5% des requêtes sur l&amp;rsquo;API de recommandation doivent réussir sur 30 jours&amp;rdquo; et &amp;ldquo;95% des requêtes doivent répondre en moins de 800ms sur 7 jours&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Enfin, on calcule l&amp;rsquo;Error Budget : 99,5% de disponibilité = 0,5% d&amp;rsquo;indisponibilité autorisée, soit environ 3,6 heures d&amp;rsquo;indisponibilité &amp;ldquo;budgetées&amp;rdquo; sur 30 jours.&lt;/p&gt;
&lt;p&gt;Simple, non ?&lt;/p&gt;
&lt;h2 id="les-pièges-à-éviter"&gt;Les pièges à éviter
&lt;/h2&gt;&lt;p&gt;Le premier piège, c&amp;rsquo;est de vouloir mettre des SLO partout. N&amp;rsquo;essayez pas ! Commencez par 2-3 SLO sur vos CUJ les plus critiques. Vous pourrez étendre ensuite.&lt;/p&gt;
&lt;p&gt;Le deuxième piège, c&amp;rsquo;est de fixer des SLO trop stricts. Si vous mettez la barre trop haut, vous allez passer votre temps en &amp;ldquo;SLO violation&amp;rdquo; et personne ne prendra plus ça au sérieux.&lt;/p&gt;
&lt;p&gt;Enfin, le troisième piège, c&amp;rsquo;est d&amp;rsquo;oublier l&amp;rsquo;aspect organisationnel. Les Error Budgets ne marchent que si toute l&amp;rsquo;organisation (business inclus) adhère au principe. Sinon, vous aurez beau être en SLO violation, on vous demandera quand même de déployer la nouvelle feature&amp;hellip;&lt;/p&gt;
&lt;h2 id="comment-commencer-"&gt;Comment commencer ?
&lt;/h2&gt;&lt;p&gt;Si vous n&amp;rsquo;avez jamais fait de SLO, voici un plan d&amp;rsquo;action simple.&lt;/p&gt;
&lt;p&gt;Identifiez d&amp;rsquo;abord 1-2 CUJ critiques (avec le business !). Regardez ensuite vos métriques actuelles sur ces parcours. Définissez alors des SLO réalistes mais un peu ambitieux. Mettez en place l&amp;rsquo;alerting quand vous êtes en train de consommer votre error budget. Et enfin, itérez ! Les SLO ne sont pas gravés dans le marbre.&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;espère que cet article vous aura donné envie de creuser ces concepts ! Les SLO/SLI/Error Budget ne sont pas juste des buzzwords, c&amp;rsquo;est vraiment un changement de paradigme dans la façon d&amp;rsquo;appréhender la fiabilité.&lt;/p&gt;
&lt;p&gt;Et le plus beau, c&amp;rsquo;est que ça marche autant pour une startup avec 3 développeurs que pour une GAFAM avec 10000 ingénieurs. L&amp;rsquo;important, c&amp;rsquo;est de commencer simple et d&amp;rsquo;itérer.&lt;/p&gt;
&lt;p&gt;Pour aller plus loin, je vous recommande chaudement le &lt;a class="link" href="https://sre.google/sre-book/service-level-objectives/" target="_blank" rel="noopener"
&gt;SRE Book de Google&lt;/a&gt; (gratuit !) et leur &lt;a class="link" href="https://cloud.google.com/blog/products/management-tools/practical-guide-to-setting-slos" target="_blank" rel="noopener"
&gt;guide pratique pour définir des SLO&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Et si vous voulez approfondir le sujet SRE en général, n&amp;rsquo;hésitez pas à jeter un œil aux &lt;a class="link" href="https://blog.zwindler.fr/talks/2022-sre-sre-partout/index.html" &gt;slides de mon talk de 2022&lt;/a&gt; ;-).&lt;/p&gt;
&lt;p&gt;Bon monitoring !&lt;/p&gt;</description></item><item><title>Récap FOSDEM 2025</title><link>https://blog.zwindler.fr/2025/02/01/recap-fosdem-2025/</link><pubDate>Sat, 01 Feb 2025 12:00:00 +0200</pubDate><guid>https://blog.zwindler.fr/2025/02/01/recap-fosdem-2025/</guid><description>&lt;img src="https://blog.zwindler.fr/2025/02/place.webp" alt="Featured image of post Récap FOSDEM 2025" /&gt;&lt;h2 id="introduction"&gt;Introduction
&lt;/h2&gt;&lt;p&gt;Si vous me suivez sur les réseaux sociaux, vous avez peut-être vu que j’étais pour la troisième fois au &lt;a class="link" href="https://fosdem.org/2025/" target="_blank" rel="noopener"
&gt;FOSDEM (Free and Open Source Software Developers’ European Meeting)&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Contrairement aux années précédentes, cette fois-ci, le trajet et l&amp;rsquo;hôtel n&amp;rsquo;étaient pas payés par mon employeur. J&amp;rsquo;ai décidé d&amp;rsquo;y aller sur mes fonds propres. Pas de pression (Belgique, pression, bières, vous l&amp;rsquo;avez ? ok ok j&amp;rsquo;arrête, pas taper) donc pour faire de la veille techno intense et faire un récap&amp;rsquo; professionnel.&lt;/p&gt;
&lt;p&gt;Enfin ça, c&amp;rsquo;était le plan.&lt;/p&gt;
&lt;p&gt;Mais je devrais mieux me connaitre que ça pour savoir que finalement, j&amp;rsquo;ai passé deux jours aussi intenses que les années précédentes (voire plus ?).&lt;/p&gt;
&lt;p&gt;Je sirote donc ce qu&amp;rsquo;il me reste de club maté pour vous écrire ces quelques lignes (ahahah ~13000 signes).&lt;/p&gt;
&lt;h2 id="vendredi-soir-fosdem-before-fosdem"&gt;Vendredi soir, FOSDEM before FOSDEM
&lt;/h2&gt;&lt;p&gt;Preuve qu&amp;rsquo;on finit toujours par apprendre de ses erreurs, je suis arrivé &amp;ldquo;tôt&amp;rdquo; cette année. J&amp;rsquo;étais au centre de Bruxelles à 18h, ce qui m&amp;rsquo;a permis de prendre quelques bières avec deux groupes d&amp;rsquo;amis différents sans pour autant me coucher trop tard.&lt;/p&gt;
&lt;p&gt;Car c&amp;rsquo;est beaucoup ça en fait le FOSDEM, des discussions autour d&amp;rsquo;une boisson froide (alcoolisée ou pas)&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/chouffe.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(mais souvent alcoolisée, et d&amp;rsquo;ailleurs ça me fait beaucoup réfléchir depuis quelques mois)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="samedi"&gt;Samedi
&lt;/h2&gt;&lt;p&gt;Malgré une heure de coucher raisonnable (minuit et quelques), je n&amp;rsquo;ai pas réussi à aller voir le premier talk que je souhaitais voir (problématique dont je vais avoir besoin, pour le travail 🫣).&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cache me if you can: P2P Image Sharing in Kubernetes with Spegel&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;En réalité, j&amp;rsquo;étais absorbé dans une intense discussion sur l&amp;rsquo;optimisation de clusters Ceph pendant le petit déjeuner de l&amp;rsquo;hôtel (vraiment, aller au FOSDEM dans l&amp;rsquo;idée de ne pas bosser, c&amp;rsquo;est raté sur toute la ligne xD).&lt;/p&gt;
&lt;p&gt;Mais j&amp;rsquo;irai voir le replay, car j&amp;rsquo;en ai eu de bons échos.&lt;/p&gt;
&lt;h2 id="a-new-cgroup-cpumaxconcurrency-controller-interface-file"&gt;A new cgroup cpu.max.concurrency controller interface file
&lt;/h2&gt;&lt;p&gt;En revanche, j&amp;rsquo;étais à l&amp;rsquo;heure pour le talk suivant, qui était un lightning talk de Mathieu Desnoyers pour promouvoir une initiative visant à ajouter un nouveau type de cgroup.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/cgroups.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;idée principale est qu&amp;rsquo;aujourd&amp;rsquo;hui, surtout sur des machines bare metal pouvant avoir des centaines de cores, restreindre un container à une quantité donnée de cores par seconde n&amp;rsquo;a plus vraiment de sens, car cela peut correspondre à plein de cores pendant un très court instant ou alors un seul core pendant 1 seconde.&lt;/p&gt;
&lt;p&gt;Un peu rude de commencer sur ça, mais le problème et la proposition de résolution était plutôt bien présentée. À suivre !&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://fosdem.org/2025/events/attachments/fosdem-2025-6283-a-new-cgroup-cpu-max-concurrency-controller-interface-file/slides/235584/presentat_a93u5uX.pdf" target="_blank" rel="noopener"
&gt;Slides&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="bringing-application-containers-to-incus"&gt;Bringing application containers to Incus
&lt;/h2&gt;&lt;p&gt;Ceux qui me connaissent savent que je suis un fan inconditionnel de LXC (&lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=lxc" &gt;j&amp;rsquo;ai écrit beaucoup d&amp;rsquo;articles sur ce sujet&lt;/a&gt;). Et même si j&amp;rsquo;ai peu creusé LXD (&lt;a class="link" href="https://linuxcontainers.org/incus/" target="_blank" rel="noopener"
&gt;forké par la communauté en &amp;ldquo;Incus&amp;rdquo; après une décision controversée de Canonical&lt;/a&gt;), je suis les évolutions avec attention (&lt;a class="link" href="https://blog.zwindler.fr/2024/02/04/recap-fosdem-2024/#incus" &gt;j&amp;rsquo;avais d&amp;rsquo;ailleurs vu un talk à ce sujet au FOSDEM l&amp;rsquo;an dernier&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;Cette année encore, j&amp;rsquo;ai aimé ce talk de Stéphane Graber. Il nous a parlé d&amp;rsquo;ajouter des containers applicatifs (au format OCI) dans Incus.&lt;/p&gt;
&lt;p&gt;En effet, un des avantages d&amp;rsquo;Incus est de pouvoir gérer plusieurs types de workloads, containers LXC ou machines virtuelles plus classiques, mais il n&amp;rsquo;y avait pas de support explicite des containers au format OCI (&amp;ldquo;Docker&amp;rdquo; par abus de langage). L&amp;rsquo;idée principale derrière cet ajout réside dans le constat qu&amp;rsquo;aujourd&amp;rsquo;hui beaucoup d&amp;rsquo;applications sont livrées dans ce format et que les repackager pour Incus est un travail fastidieux (et inutile), et que faire du nested-Docker n&amp;rsquo;a pas vraiment de sens.&lt;/p&gt;
&lt;p&gt;En soi, il ne devait pas manquer grand-chose puisque LXC supporte déjà les images au format OCI depuis un moment. C&amp;rsquo;est d&amp;rsquo;ailleurs le hack que j&amp;rsquo;utilise dans mon article phare (comment je me la pète ?!) :&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/" &gt;Lancer des containers Docker avec Proxmox VE (et LXC)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;À tester :)&lt;/p&gt;
&lt;p&gt;Tags pour moi-même : &lt;code&gt;umami&lt;/code&gt; et &lt;code&gt;skopeo&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="writing-a-kubernetes-controller-but-in-rust"&gt;Writing a kubernetes controller… But in Rust
&lt;/h2&gt;&lt;p&gt;Pour le troll (mes collègues comprendront) et un peu par curiosité, je suis resté pour le talk d&amp;rsquo;après vantant les mérites de Rust pour écrire un controller dans Kubernetes plutôt que Golang (ou autre, d&amp;rsquo;ailleurs).&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai trouvé le discours de Danil un peu confus et j&amp;rsquo;ai eu du mal à suivre, car j&amp;rsquo;étais très loin et les exemples de codes étaient en darkmode&amp;hellip; L&amp;rsquo;exemple ci-dessous n&amp;rsquo;est même pas le pire, certains bouts de code dans les slides suivantes, en rouge sur noir, étaient illisibles, même en zoomant :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/kubers.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Note aux aspirants/aspirantes speakers, dans un amphi éclairé, le dark mode, c&amp;rsquo;est illisible.&lt;/p&gt;
&lt;h2 id="state-of-checkpointrestore-in-kubernetes"&gt;State of Checkpoint/Restore in Kubernetes
&lt;/h2&gt;&lt;p&gt;Un des talks que je VOULAIS voir, et au final, j&amp;rsquo;ai été un peu déçu (pas par le speaker, vous allez comprendre). Là encore, c&amp;rsquo;était la suite d&amp;rsquo;un sujet de talk que j&amp;rsquo;avais vu ailleurs.&lt;/p&gt;
&lt;p&gt;Pour celles et ceux qui ne voient pas trop de quoi on parle, il s&amp;rsquo;agit de mettre en place le tooling nécessaire pour être capable de migrer des containers à chaud d&amp;rsquo;une machine à une autre.&lt;/p&gt;
&lt;p&gt;Ça nécessite d&amp;rsquo;abord de pouvoir prendre une &amp;ldquo;photo&amp;rdquo; de l&amp;rsquo;état du container (le checkpoint) avant migration (aussi bien les metadatas que les données du container), puis de savoir restaurer cet état à l&amp;rsquo;identique sur une autre machine (restore).&lt;/p&gt;
&lt;p&gt;Ça peut aussi servir à sauvegarder des containers, ou à faire du forensic dessus en cas d&amp;rsquo;attaque par exemple.&lt;/p&gt;
&lt;p&gt;TL;DR : ça n&amp;rsquo;a quasiment pas avancé.&lt;/p&gt;
&lt;p&gt;Et Adrian Reber nous a expliqué pourquoi. Une grande partie de la communauté Kubernetes considère (à tort à mon avis) que les containers qui tournent dans Kubernetes sont stateless et si un hôte meurt et qu&amp;rsquo;on doit redémarrer tout ses containers, ce n&amp;rsquo;est pas grave.&lt;/p&gt;
&lt;p&gt;Or, il y a de très nombreux contre-exemples à cette affirmation. C&amp;rsquo;est faux pour les bases de données ou les bus de messages (même si on peut contourner le problème avec du clustering), les containers stateless mais qui ont des longues connexions qui se font trancher en cas de kill, ou même les traitements de machine learning qui peuvent durer des heures.&lt;/p&gt;
&lt;p&gt;Pour tous ces usages, tuer le container pour le redémarrer ailleurs est potentiellement pénible / disruptif pour l&amp;rsquo;utilisateur (pas forcément final). Et je suis un peu chagrin qu&amp;rsquo;on en soit qu&amp;rsquo;à passer en Beta (2024) et qu&amp;rsquo;il n&amp;rsquo;y ait pas encore de support dans &lt;code&gt;kubectl&lt;/code&gt; de cette techno réclamée depuis 2015 !!!&lt;/p&gt;
&lt;h2 id="immutable-all-the-way-down---using-system-extensions-to-ship-kubernetes"&gt;Immutable All the Way Down - using System Extensions to ship Kubernetes
&lt;/h2&gt;&lt;p&gt;Ce talk de Thilo Fromm n&amp;rsquo;était pas du tout ce à quoi je m&amp;rsquo;attendais. À vrai dire, je ne savais pas à quoi m&amp;rsquo;attendre (je n&amp;rsquo;avais pas lu l&amp;rsquo;abstract, je ponçais juste ma chaise d&amp;rsquo;amphi).&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai découvert les SysExt (petit nom des System Extensions), un outil permettant de créer des systèmes d&amp;rsquo;exploitation immutables et composables, compatible avec tous les OS du moment qu&amp;rsquo;on a systemd (le speaker a utilisé Flatcar et Kubernetes).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/flatcar.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;était assez inattendu et intéressant. Et malgré quelques glitchs pendant les diverses démos, le speaker a bien su montrer les intérêts de l&amp;rsquo;outil, à savoir la composabilité du système, la possibilité de décorréler OS sous-jacent et application (separation of concerns), les mises à jour à chaud.&lt;/p&gt;
&lt;p&gt;Je ne suis pas sûr d&amp;rsquo;avoir un use case intéressant en tête, mais c&amp;rsquo;était une bonne découverte.&lt;/p&gt;
&lt;p&gt;Tag pour moi-même : &lt;code&gt;kured&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="14-years-of-systemd"&gt;14 years of systemd
&lt;/h2&gt;&lt;p&gt;La tête bien farcie de talks (certains ont été omis, car je n&amp;rsquo;ai pas grand-chose à dire dessus), grande pause.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/mate.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Puis, probablement LE talk de la journée.&lt;/p&gt;
&lt;p&gt;Dans le plus grand amphi du FOSDEM et une salle comble, Lennart Poettering, le créateur de systemd, a fait un petit retour sur la création et les perspectives pour le futur d&amp;rsquo;un des outils les plus controversés dans Linux.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/jansen.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/systemd.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let&amp;rsquo;s have a look back at the tumultuous beginnings, how we became what we are now, and let&amp;rsquo;s talk a bit the perspective for the future, what systemd is supposed to be in the eyes of its developers – and what it shouldn&amp;rsquo;t be.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C&amp;rsquo;était un talk intéressant même si on n&amp;rsquo;est pas toujours d&amp;rsquo;accord avec cette personnalité clivante. Il permettait de remettre un peu de contexte et d&amp;rsquo;avoir le point de vue de Lennart lui-même, en opposition aux seuls discours pas toujours très objectifs à l&amp;rsquo;encontre de systemd, mais qui sont les seuls qu&amp;rsquo;on entend sur les réseaux sociaux.&lt;/p&gt;
&lt;p&gt;Seul bémol, je n&amp;rsquo;ai pas pu aller voir le talk sur metal-stack.io et je n&amp;rsquo;ai pas eu le courage d&amp;rsquo;aller voir autre chose après ça.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;On prem Kubernetes at scale with metal-stack.io&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fin de journée autour de quelques gaufres et boissons.&lt;/p&gt;
&lt;h2 id="dimanche"&gt;Dimanche
&lt;/h2&gt;&lt;p&gt;Réveil prévu un peu plus tôt dimanche, de manière à arriver à l&amp;rsquo;heure pour les premiers talks en &amp;ldquo;room observability&amp;rdquo; :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Discovering the Magic Behind OpenTelemetry Instrumentation&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Spoiler alert: je n&amp;rsquo;ai quand même pas réussi à arriver à l&amp;rsquo;heure xD, donc j&amp;rsquo;en ai profité pour aller faire un tour de loot stickers/goodies.&lt;/p&gt;
&lt;h2 id="prometheus-version-3"&gt;Prometheus Version 3
&lt;/h2&gt;&lt;p&gt;J&amp;rsquo;ai réellement commencé la journée avec un talk que je n&amp;rsquo;étais pas spécialement pressé de voir, parce que j&amp;rsquo;étais persuadé (vu le changelog) qu&amp;rsquo;il n&amp;rsquo;y avait rien de bien foufou (et donc rien à apprendre) dans cette version majeure de Prometheus.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/prom3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Et finalement, c&amp;rsquo;était plutôt intéressant, mais plus par curiosité que par le niveau technique.&lt;/p&gt;
&lt;p&gt;De ce que je comprends après ce talk, cette v3 (majeure donc) était surtout l&amp;rsquo;occasion de faire passer tous les &amp;ldquo;breaking changes&amp;rdquo; accumulé au fil des ans, ainsi que toutes les améliorations cachées derrière des features flags qui auraient pu être activée par défaut, mais ne l&amp;rsquo;étaient pas par souci de rétro compatibilité. Ca dit quelque chose de la gouvernance du projet.&lt;/p&gt;
&lt;p&gt;À revoir, si vous dans l&amp;rsquo;écosystème Prom.&lt;/p&gt;
&lt;h2 id="the-performance-impact-of-auto-instrumentation"&gt;The performance impact of auto-instrumentation
&lt;/h2&gt;&lt;p&gt;Mon talk préféré de la (courte) journée. A l&amp;rsquo;aide de &amp;ldquo;benchs&amp;rdquo; (même s&amp;rsquo;il refuse de parler de ces tests empiriques de cette façon), James Belchamber nous a montré les ordres de grandeurs qu&amp;rsquo;on peut espérer voir à propos de l&amp;rsquo;impact de l&amp;rsquo;instrumentation manuelle et automatique sur divers types de codes.&lt;/p&gt;
&lt;p&gt;Le talk était vraiment très agréable et le speaker n&amp;rsquo;a malheureusement pas pu finir (trop de contenu).&lt;/p&gt;
&lt;p&gt;Les take aways :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/takeaways.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="zero-code-distributed-traces-for-any-programming-langage"&gt;Zero code distributed traces for any programming langage
&lt;/h2&gt;&lt;p&gt;Le talk au résultat inattendu du jour, pour moi, c&amp;rsquo;était celui-ci. Le titre était prometteur : pourquoi faire de l&amp;rsquo;observabilité auto-instrumentée pour tous les langages sans efforts, je signe tout de suite (au travail&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Ce talk était une présentation de Beyla, un outil de Grafana Labs, dont le but est d&amp;rsquo;auto-instrumenter tout type de code à l&amp;rsquo;aide d&amp;rsquo;eBPF.&lt;/p&gt;
&lt;p&gt;On sent la hype venir et malheureusement, ça n&amp;rsquo;est au final que ça : de la hype.&lt;/p&gt;
&lt;p&gt;J&amp;rsquo;ai aimé le côté candide du talk, les difficultés rencontrées ont été expliquées sans tabous, les limitations (nombreuses) explicitement listées.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/beyla.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Mais clairement, ça ne me donne pas envie de tester l&amp;rsquo;outil, et encore moins d&amp;rsquo;y participer.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;ultime blague étant justement que les speakers ont lourdement insisté sur le fait qu&amp;rsquo;il fallait qu&amp;rsquo;on vienne contribuer, &lt;strong&gt;ET&lt;/strong&gt; qu&amp;rsquo;ils voulaient refiler le bébé à la CNCF.&lt;/p&gt;
&lt;p&gt;Comme un grand singe a dit :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Je ne dirais pas que c&amp;rsquo;est un échec, je dirais que ça n&amp;rsquo;a pas marché.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="this-is-the-end"&gt;This is the end
&lt;/h2&gt;&lt;p&gt;Après ça, j&amp;rsquo;ai décidé d&amp;rsquo;aller manger des frites bien méritées et la pause est passée très vite. Tellement vite qu&amp;rsquo;il était finalement temps de récupérer ma valise et d&amp;rsquo;aller à la gare pour le retour.&lt;/p&gt;
&lt;p&gt;Pas de chance, j&amp;rsquo;aurais aimé voir quelques autres talks, mais pour pouvoir rentrer à une heure raisonnable sur Nantes (car, j&amp;rsquo;enchaine avec un déplacement pro), c&amp;rsquo;était impossible.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Mastering Observability with SigNoz -&amp;gt; Open-Source Alternative for Metrics, Logs, and Traces&lt;/li&gt;
&lt;li&gt;The Art of Fleet-Wide Kubernetes Observability: 3 Core Strategies&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cette édition, j&amp;rsquo;ai l&amp;rsquo;impression d&amp;rsquo;avoir beaucoup plus profité des gens (des amis de longue date, des anciens collègues, des personnes qui connaissent mon blog, des amis/amies speakers, des bénévoles sur les stands, ou même des inconnus qui m&amp;rsquo;ont abordés au hasard des couloirs)&lt;/p&gt;
&lt;p&gt;Notamment parce que :&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;je suis arrivé &amp;ldquo;tôt&amp;rdquo; la veille&lt;/li&gt;
&lt;li&gt;je suis venu &amp;ldquo;de ma poche&amp;rdquo;, et pas pour le travail (mais si ça y ressemble beaucoup)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Je pense que ces deux points sont importants et à retenir. Je réalise que j&amp;rsquo;ai de la chance de pouvoir me payer ce genre de week-end sans trop y penser (tout le monde n&amp;rsquo;a pas cette chance), et que je devrais en profiter.&lt;/p&gt;
&lt;p&gt;Pour finir, je vous laisse sur quelques photos en vrac de ce week-end (une fois de plus) mémorable.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/louise.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/error.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/ulb.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/zoom1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/frens1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/frens2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/misandre.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2025/02/cat.avif"
loading="lazy"
&gt;&lt;/p&gt;</description></item></channel></rss>