<?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>Articles on n8r | Clément</title>
    <link>https://clement.n8r.ch/en/articles/</link>
    <description>Recent content in Articles on n8r | Clément</description>
    <generator>Hugo -- 0.147.7</generator>
    <language>en-US</language>
    <lastBuildDate>Fri, 01 May 2026 10:00:00 +0200</lastBuildDate>
    <atom:link href="https://clement.n8r.ch/en/articles/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Copy Fail: From Unprivileged Pod to Kubernetes Node Root</title>
      <link>https://clement.n8r.ch/en/articles/copyfail-cve-2026-31431-kubernetes-escape/</link>
      <pubDate>Fri, 01 May 2026 10:00:00 +0200</pubDate>
      <guid>https://clement.n8r.ch/en/articles/copyfail-cve-2026-31431-kubernetes-escape/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This article covers two complementary paths: the CNI wrapper staging chain, and the fully autonomous operator-SA compromise that eliminates the external trigger dependency. Both are proven on Talos Linux v1.12.4, Cilium v1.18.x, kernel 6.18.9.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Update (May 5th):&lt;/strong&gt; code and building blocks on GitHub: &lt;a href=&#34;https://github.com/clementnuss/copyfail-cve-exploits&#34;&gt;https://github.com/clementnuss/copyfail-cve-exploits&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;context&#34;&gt;Context&lt;/h2&gt;
&lt;p&gt;I work at &lt;a href=&#34;https://www.postfinance.ch&#34;&gt;PostFinance&lt;/a&gt;, where we run a
Kubernetes platform supporting banking workloads. Our production clusters run
Debian 12 with kernel 6.1.158+, which happens to be &lt;strong&gt;not vulnerable&lt;/strong&gt; to
CVE-2026-31431 (more on that at the end).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Banking on Reliability: Cloud Native SRE Practices in Financial Services</title>
      <link>https://clement.n8r.ch/en/articles/banking-on-reliability-kubecon-eu-2026/</link>
      <pubDate>Thu, 26 Mar 2026 10:00:00 +0100</pubDate>
      <guid>https://clement.n8r.ch/en/articles/banking-on-reliability-kubecon-eu-2026/</guid>
      <description>&lt;p&gt;This article is a written companion to my &lt;a href=&#34;https://events.linuxfoundation.org/kubecon-cloudnativecon-europe/&#34;&gt;KubeCon EU 2026&lt;/a&gt; talk of the same name.
It covers four stories from five years of running a Kubernetes platform at
&lt;a href=&#34;https://www.postfinance.ch&#34;&gt;PostFinance&lt;/a&gt;, a systemic Swiss financial institution:
SLOs as a reliability driver, open-source monitoring tools, continuous end-to-end
testing, and an interactive debugging session tracking down rare 502 errors.&lt;/p&gt;
&lt;p&gt;The interactive visualizations below (hash ring, race condition sequence diagram)
are ported from the Slidev presentation so you can explore them at your own pace.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adding PrometheusHistograms support to VictoriaMetrics/metrics</title>
      <link>https://clement.n8r.ch/en/articles/victoriametrics-metrics-prometheus-histogram-support/</link>
      <pubDate>Sat, 12 Jul 2025 06:50:54 +0200</pubDate>
      <guid>https://clement.n8r.ch/en/articles/victoriametrics-metrics-prometheus-histogram-support/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: I added support for PrometheusHistograms (those with &lt;code&gt;le&lt;/code&gt; buckets) to
the &lt;a href=&#34;https://github.com/VictoriaMetrics/metrics&#34;&gt;VictoriaMetrics/metrics&lt;/a&gt;
package (a lightweight alternative to
&lt;a href=&#34;https://github.com/prometheus/client_golang&#34;&gt;prometheus/client_golang&lt;/a&gt;), which
allows me to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Switch to the more lightweight &lt;code&gt;VictoriaMetrics/metrics&lt;/code&gt; library in my
open-source projects, which I find simpler to use&lt;/li&gt;
&lt;li&gt;Make it possible to choose between classical Prometheus histograms or VictoriaMetrics
histograms (much more precise) with a flag&lt;/li&gt;
&lt;li&gt;Maintain compatibility with existing Prometheus-based monitoring setups&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;problem&#34;&gt;Problem&lt;/h2&gt;
&lt;p&gt;While working on &lt;a href=&#34;https://github.com/postfinance/kubenurse&#34;&gt;kubenurse&lt;/a&gt;, I
wanted to switch from the heavier
&lt;a href=&#34;https://github.com/prometheus/client_golang&#34;&gt;prometheus/client_golang&lt;/a&gt; library
to the more lightweight
&lt;a href=&#34;https://github.com/VictoriaMetrics/metrics&#34;&gt;VictoriaMetrics/metrics&lt;/a&gt; package.
However, there was one significant blocker: the VictoriaMetrics library only
supported their own log-based histogram format, not the traditional Prometheus
histograms with static &lt;code&gt;le&lt;/code&gt; buckets.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A connected farm, part 3 - weighbridge automation</title>
      <link>https://clement.n8r.ch/en/articles/connected-farm-the-weighbridge/</link>
      <pubDate>Tue, 25 Feb 2025 18:34:07 +0100</pubDate>
      <guid>https://clement.n8r.ch/en/articles/connected-farm-the-weighbridge/</guid>
      <description>This article covers a topic related to my wife&amp;#39;s family farm, namely the brand
new weighbridge installed on the biogas plant.
</description>
    </item>
    <item>
      <title>HTTP 502 - Upstream errors with nginx</title>
      <link>https://clement.n8r.ch/en/articles/502-upstream-errors/</link>
      <pubDate>Mon, 17 Feb 2025 11:30:51 +0100</pubDate>
      <guid>https://clement.n8r.ch/en/articles/502-upstream-errors/</guid>
      <description>&lt;h2 id=&#34;a-little-context&#34;&gt;A little context&lt;/h2&gt;
&lt;p&gt;I work at PostFinance, taking care of the Linux systems and of the Open-Source
Kubernetes platform we are running to support all sorts of banking workloads.&lt;/p&gt;
&lt;p&gt;Aside from running the platform, we also take in user support issues (where
users are internal developers/colleagues), and this blog article covers an
issue named &amp;ldquo;Ingress gets HTTP 502 errors on high load&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;You can take this article as an SRE exercise: I&amp;rsquo;ll provide the same data I
received in the support issue, in the same order, and you should try to
discover the actual issue as soon as possible. Good luck ;)&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Connected Farm, part 2 - Remote Controlled Fence ⚡️</title>
      <link>https://clement.n8r.ch/en/articles/connected-farm-fence-bot/</link>
      <pubDate>Sat, 11 May 2024 06:17:14 +0200</pubDate>
      <guid>https://clement.n8r.ch/en/articles/connected-farm-fence-bot/</guid>
      <description>&lt;p&gt;This article again covers a topic related to my wife&amp;rsquo;s family farm, but this
time, instead of &lt;a href=&#34;https://clement.n8r.ch/en/articles/connected-farm-milking/&#34;&gt;exporting milking data to Grafana&lt;/a&gt;, I will detail my usage of &lt;a href=&#34;https://michael.stapelberg.ch/&#34;&gt;Michael
Stapelberg&lt;/a&gt;&amp;rsquo;s amazing
&lt;a href=&#34;https://gokrazy.org/&#34;&gt;&lt;code&gt;gokrazy&lt;/code&gt;&lt;/a&gt; project, which made it possible to reliably
develop Go software to control  fences around the farm.&lt;/p&gt;
&lt;h2 id=&#34;fences-and-cows-&#34;&gt;Fences and Cows 🐄&lt;/h2&gt;
&lt;p&gt;The farm is distributed on 2 sites, and on each site there are rather long
electric fences, in which the cows happily pasture during the day (and for the
heifer&amp;rsquo;s fence, also during the night). &lt;br&gt;
To prevent the cows from escaping the fences and e.g. eat our neighbour&amp;rsquo;s grass
(which is always greener, as we all know), the fences are electrified ⚡️ with
high voltage (6000V) impulsions every second.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubenurse: The In-Cluster Doctor Making Network Rounds</title>
      <link>https://clement.n8r.ch/en/articles/kubenurse-k8s-network-monitoring/</link>
      <pubDate>Sun, 07 Apr 2024 12:12:16 +0000</pubDate>
      <guid>https://clement.n8r.ch/en/articles/kubenurse-k8s-network-monitoring/</guid>
      <description>&lt;p&gt;&lt;strong&gt;TLDR&lt;/strong&gt;: &lt;a href=&#34;https://github.com/postfinance/kubenurse&#34;&gt;Kubenurse&lt;/a&gt; is the Swiss army knife for Kubernetes network monitoring.
It will help you&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;pinpoint bottlenecks and know the latency in your network&lt;/li&gt;
&lt;li&gt;identify nodes with network issues (packet drops, slow connection, etc.)&lt;/li&gt;
&lt;li&gt;uncover issues like DNS failures, broken sockets, or interrupted TLS
negotiations&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;description&#34;&gt;Description&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/postfinance/kubenurse&#34;&gt;Kubenurse&lt;/a&gt; is a Kubernetes network monitoring tool developed and open-sourced by
PostFinance (a Swiss Banking Institution), which acts like an in-cluster
doctor, continuously checking the health of your pod-to-pod, pod-to-service,
and pod-to-ingress connections.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A Connected Farm, part 1 - Milking 🐄 🥛</title>
      <link>https://clement.n8r.ch/en/articles/connected-farm-milking/</link>
      <pubDate>Sat, 17 Feb 2024 17:00:14 +0200</pubDate>
      <guid>https://clement.n8r.ch/en/articles/connected-farm-milking/</guid>
      <description>&lt;p&gt;Alongside my work as a System Engineer (with a focus on Kubernetes) at
PostFinance, I&amp;rsquo;m married to a farmer in Switzerland, and live with her and her
family on the family farm. &lt;br&gt;
This is quite different from my daily work, and I sometimes have the
opportunity to help by, for example, feeding calves during milking, using my
skills to install surveillance cameras, deploying a long-distance WiFi network
across the farm, or modernizing the milking monitoring. &lt;br&gt;
It&amp;rsquo;s this latter point that I&amp;rsquo;m detailing today (without all the technical
details, which are covered in the
&lt;a href=&#34;https://github.com/clementnuss/alpro-openmetrics-exporter&#34;&gt;README&lt;/a&gt; of the
open-source project I&amp;rsquo;ve created for this purpose).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Backing up MariaDB on Kubernetes</title>
      <link>https://clement.n8r.ch/en/articles/backing-up-mariadb-on-kubernetes/</link>
      <pubDate>Wed, 27 Dec 2023 05:12:16 +0000</pubDate>
      <guid>https://clement.n8r.ch/en/articles/backing-up-mariadb-on-kubernetes/</guid>
      <description>&lt;p&gt;Hosting MariaDB on Kubernetes proved so far a quite good experience: using the &lt;a href=&#34;https://github.com/bitnami/charts/tree/main/bitnami/mariadb&#34;&gt;Bitnami Helm Chart&lt;/a&gt; to host a &amp;ldquo;standalone&amp;rdquo; instance (i.e. without replication, as replication already happens on the storage layer, and because simplicity is more valuable than a complex HA setup like Galera) of MariaDB worked out quite well.&lt;/p&gt;
&lt;p&gt;Being cautious, I had configured a daily backup to S3, using a &lt;a href=&#34;https://github.com/benjamin-maynard/kubernetes-cloud-mysql-backup&#34;&gt;tool found on Github&lt;/a&gt;, but when it came to restoring data dumped with this tool, which uses a pretty old &lt;code&gt;mysqldump&lt;/code&gt; binary, I was stuck and couldn&amp;rsquo;t restore 😅
For some reason, the default config of the tool didn&amp;rsquo;t bother to escape quotes and other sensitive types of chars, and as a result I had to resort to restoring my daily &lt;code&gt;velero&lt;/code&gt; backup of my MariaDB instance in another namespace to make a proper export from there and to finally restore my data.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Advent of Code 🎄 - an eBPF take 🐝</title>
      <link>https://clement.n8r.ch/en/articles/advent-of-code-an-ebpf-take/</link>
      <pubDate>Sat, 09 Dec 2023 15:58:38 +0200</pubDate>
      <guid>https://clement.n8r.ch/en/articles/advent-of-code-an-ebpf-take/</guid>
      <description>&lt;p&gt;It&amp;rsquo;s that period of the year already ! With December comes the &lt;a href=&#34;https://adventofcode.com/2023/about&#34;&gt;Advent of Code&lt;/a&gt; programming challenge, and its daily mental workout.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Advent of Code&lt;/em&gt; is an Advent calendar of small programming puzzles for a variety of skill sets and skill levels that can be solved in &lt;a href=&#34;https://github.com/search?q=advent&amp;#43;of&amp;#43;code&#34;&gt;any&lt;/a&gt; programming language you like.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;The complexity level of the programming challenges increase every day, and tend to be notoriously hard during the last few days. However, as of writing this article, it&amp;rsquo;s only day 9, and there were a few problems that didn&amp;rsquo;t require too much processing cycles, provided you spent enough mathematical effort and didn&amp;rsquo;t come up with only the brute-force solution.&lt;/p&gt;</description>
    </item>
    <item>
      <title>DNS servers monitoring</title>
      <link>https://clement.n8r.ch/en/articles/dns-servers-monitoring/</link>
      <pubDate>Mon, 31 Jul 2023 16:23:32 +0100</pubDate>
      <guid>https://clement.n8r.ch/en/articles/dns-servers-monitoring/</guid>
      <description>&lt;p&gt;A few months ago, I found myself needing to know about the reliability of some internal DNS provider&amp;rsquo;s servers, after getting a series of hardly trackable random network issues, aka &amp;ldquo;It&amp;rsquo;s always DNS&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;&lt;img alt=&#34;Always DNS meme&#34; loading=&#34;lazy&#34; src=&#34;https://i.redd.it/qlbz5kaucva51.jpg&#34;&gt;&lt;/p&gt;
&lt;p&gt;More specifically, I needed to know about the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;number of errors/timeouts&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;capability to query over TCP or UDP&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;capability to monitor multiple DNS servers at once&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;return codes received in the answer (i.e. &lt;code&gt;NOERROR&lt;/code&gt;, &lt;code&gt;SERVFAIL&lt;/code&gt;, &lt;code&gt;NXDOMAIN&lt;/code&gt;, you name it)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Minimal downtime when rebooting etcd nodes</title>
      <link>https://clement.n8r.ch/en/articles/minimal-downtime-when-rebooting-etcd-nodes/</link>
      <pubDate>Fri, 07 Jul 2023 08:17:40 +0100</pubDate>
      <guid>https://clement.n8r.ch/en/articles/minimal-downtime-when-rebooting-etcd-nodes/</guid>
      <description>&lt;h2 id=&#34;graceful-leader-changes&#34;&gt;Graceful leader changes&lt;/h2&gt;
&lt;p&gt;When needing to restart some Kubernetes control-plane nodes on which &lt;code&gt;etcd&lt;/code&gt; also happens to be running, you will prefer a graceful transfer of the leadership of the &lt;code&gt;etcd&lt;/code&gt; cluster, to reduce the transition period that comes with a leader election.&lt;/p&gt;
&lt;p&gt;This can be achieved with the following script, provided you specify the adequate environment variables in &lt;code&gt;/etc/profile.d/etcd-all&lt;/code&gt; file.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; -o pipefail &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt; /etc/profile.d/etcd-all &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;AM_LEADER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;etcdctl endpoint status &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;hostname&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; cut -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;,&amp;#39;&lt;/span&gt; -f &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; tr -d &lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[[&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;$AM_LEADER&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;true&amp;#34;&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nv&#34;&gt;NEW_LEADER&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;etcdctl endpoint status &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -v &lt;span class=&#34;k&#34;&gt;$(&lt;/span&gt;hostname&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; cut -d &lt;span class=&#34;s1&#34;&gt;&amp;#39;,&amp;#39;&lt;/span&gt; -f &lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; tr -d &lt;span class=&#34;s1&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; tail -n &lt;span class=&#34;s1&#34;&gt;&amp;#39;-1&amp;#39;&lt;/span&gt;&lt;span class=&#34;k&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;se&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;se&#34;&gt;&lt;/span&gt;  etcdctl move-leader &lt;span class=&#34;nv&#34;&gt;$NEW_LEADER&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; sleep &lt;span class=&#34;m&#34;&gt;15&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Info: the following environment variables need to be set, for example through a file such as: &lt;code&gt;/etc/profile.d/etcd-all&lt;/code&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes CNI — deconstructed</title>
      <link>https://clement.n8r.ch/en/articles/kubernetes-cni-deconstructed/</link>
      <pubDate>Mon, 29 Mar 2021 05:42:38 +0100</pubDate>
      <guid>https://clement.n8r.ch/en/articles/kubernetes-cni-deconstructed/</guid>
      <description>&lt;p&gt;A few months ago, I had to understand in detail how Container Network Interface (CNI) is implemented to, well, simply get a chaos testing solution working on a bare-metal installation of Kubernetes.&lt;/p&gt;
&lt;p&gt;At that time, I found a few resources that helped me understand how this was implemented, mainly &lt;a href=&#34;https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/network-plugins/&#34;&gt;Kubernetes&amp;rsquo; official documentation on the topic&lt;/a&gt;, and the &lt;a href=&#34;https://github.com/containernetworking/cni/blob/master/SPEC.md&#34;&gt;official CNI specification&lt;/a&gt;. And yes, this specification simply consists of a Markdown document, which I needed to invest a consequent amount of energy to digest and process.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
