<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Kubernetes on Tom Meurs</title>
    <link>https://tommeurs.nl/en/categories/kubernetes/</link>
    <description>Recent content in Kubernetes on Tom Meurs</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© Tom Meurs</copyright>
    <lastBuildDate>Tue, 28 Apr 2026 19:45:00 +0100</lastBuildDate>
    <atom:link href="https://tommeurs.nl/en/categories/kubernetes/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Chaos Engineering: Breaking Your Cluster to Make It Stronger</title>
      <link>https://tommeurs.nl/en/posts/chaos-engineering-kubernetes/</link>
      <pubDate>Tue, 28 Apr 2026 19:45:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/chaos-engineering-kubernetes/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Chaos engineering is breaking your own cluster on purpose, with the hypothesis written down first and a rollback ready. I run it on the homelab with Litmus: a weekly pod-delete, a monthly node drain, a game day every quarter. So far it has found four things the dashboard would never have shown me.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;My dashboard is a wall of green. Pods running, replicas matched, CPU comfortable, no alerts firing. I look at it and get that small hit of &amp;ldquo;everything&amp;rsquo;s fine.&amp;rdquo; And mostly it is. The cluster&amp;rsquo;s been up for weeks and nothing has fallen over.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Longhorn vs Rook-Ceph: Kubernetes Storage Compared</title>
      <link>https://tommeurs.nl/en/posts/longhorn-vs-rook-ceph/</link>
      <pubDate>Mon, 20 Apr 2026 19:38:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/longhorn-vs-rook-ceph/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Longhorn and Rook-Ceph both give you replicated block storage that survives a node dying. Longhorn is one Helm install and a UI that shows you what a volume is doing. Rook-Ceph is Ceph with a Kubernetes operator around it, so you get block, object and filesystem storage, and the operations that come with them. I run Longhorn on three nodes. Below is why, and when I&amp;rsquo;d switch.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Run your first stateful workload on a self-hosted cluster and you find out fast that nobody hands out PersistentVolumes for free. There&amp;rsquo;s no cloud provider storage class to lean on. You&amp;rsquo;ve got your nodes, their disks, and a Postgres pod that won&amp;rsquo;t schedule. An hour of reading later you&amp;rsquo;re left with two names that keep coming up. &lt;span class=&#34;def&#34; tabindex=&#34;0&#34; data-def=&#34;Block storage for Kubernetes that replicates a volume across nodes. Simple to run and slower than Ceph, which is the trade it makes on purpose.&#34;&gt;Longhorn&lt;/span&gt;&#xA; and Rook-&lt;span class=&#34;def&#34; tabindex=&#34;0&#34; data-def=&#34;A distributed storage system that serves block, file and object from one cluster. Powerful, and heavy enough that running it is a job rather than a setting.&#34;&gt;Ceph&lt;/span&gt;&#xA;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Cilium: eBPF Networking for Kubernetes</title>
      <link>https://tommeurs.nl/en/posts/cilium-ebpf-networking/</link>
      <pubDate>Wed, 08 Apr 2026 20:23:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/cilium-ebpf-networking/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Cilium is the CNI I run in every cluster. It replaces kube-proxy and its iptables chains with eBPF programs in the kernel, enforces network policies on identity and on HTTP paths, and Hubble shows me every flow and every drop. WireGuard between the pods, BGP to the switch, no sidecars. My production values are at the bottom.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The first time a service stopped resolving in one of my clusters, I spent an evening reading iptables chains. Hundreds of rules, generated by kube-proxy, evaluated top to bottom. I never found the problem. I restarted the node and it went away.&lt;/p&gt;</description>
    </item>
    <item>
      <title>NixOS vs Talos for Kubernetes Nodes: Two Flavors of Immutable Infrastructure</title>
      <link>https://tommeurs.nl/en/posts/nixos-vs-talos-kubernetes-nodes/</link>
      <pubDate>Sun, 15 Mar 2026 20:37:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/nixos-vs-talos-kubernetes-nodes/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Talos and NixOS are both declarative and both can be immutable, and that&amp;rsquo;s about where the resemblance stops. Talos runs Kubernetes and nothing else, with no shell to drift in. NixOS is a full Linux where the whole machine is one Nix config. I run Talos on my cluster nodes and NixOS on the machines around them, and this post is how I got to that split.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve written about &lt;a href=&#34;https://tommeurs.nl/en/posts/talos-linux-immutable-kubernetes/&#34;&gt;Talos Linux&lt;/a&gt; as the immutable Kubernetes OS, and I&amp;rsquo;ve compared &lt;a href=&#34;https://tommeurs.nl/en/posts/arch-vs-nixos-workstation/&#34;&gt;Arch vs NixOS for workstations&lt;/a&gt;. After both, the same question kept arriving in my inbox. Why not NixOS on the Kubernetes nodes too?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Talos Linux: The Immutable Kubernetes OS That Changed How I Think About Nodes</title>
      <link>https://tommeurs.nl/en/posts/talos-linux-immutable-kubernetes/</link>
      <pubDate>Wed, 11 Mar 2026 21:15:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/talos-linux-immutable-kubernetes/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Talos Linux is a Linux that runs Kubernetes and nothing else. No SSH, no shell, no package manager. Every change goes through an API and a YAML file in Git. I&amp;rsquo;ve run my nodes on it for three years, and this post is how I stopped missing the shell.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;The first time I tried to SSH into a &lt;span class=&#34;def&#34; tabindex=&#34;0&#34; data-def=&#34;A Linux distribution with no shell, no SSH and no package manager, managed entirely through an API. The node is configuration rather than a machine you log into.&#34;&gt;Talos&lt;/span&gt;&#xA; node, I got nothing. No shell, no connection, not even a login prompt. I sat there for a minute wondering how I was supposed to debug a machine I couldn&amp;rsquo;t get into.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Data-Driven Kubernetes Migration: Why You Need Metrics Before You Move</title>
      <link>https://tommeurs.nl/en/posts/kubernetes-resource-sizing/</link>
      <pubDate>Sun, 08 Feb 2026 14:00:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/kubernetes-resource-sizing/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; An e-commerce client moved a PHP monolith to EKS in October, two weeks before Black Friday, with resource limits guessed from the old server specs. Mid-morning the pods hit their memory limit, died in a loop for four hours, and the estimate was €240,000 in lost revenue. The second half is how to get those numbers from load tests and VPA recommendations instead of guessing them.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;&amp;ldquo;We want to migrate to Kubernetes by November.&amp;rdquo;&lt;/p&gt;</description>
    </item>
    <item>
      <title>K8sGPT with a Local 70B Model on Apple Silicon</title>
      <link>https://tommeurs.nl/en/posts/k8sgpt-local-llm-cluster-management/</link>
      <pubDate>Thu, 05 Feb 2026 14:00:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/k8sgpt-local-llm-cluster-management/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; I pointed K8sGPT at a Llama 3.3 70B model running on a Mac Studio in my own office, so no cluster metadata leaves the network, and fed it three broken workloads. It found all three and wrote fixes I&amp;rsquo;d accept from a colleague, except for the resource numbers, which it made up. Assisted diagnosis works, at 25 seconds a query. Autonomous cluster management is still marketing, and the security section is why I wouldn&amp;rsquo;t let a model change anything on its own.&lt;/p&gt;</description>
    </item>
    <item>
      <title>When not to use Kubernetes</title>
      <link>https://tommeurs.nl/en/posts/when-not-to-use-kubernetes/</link>
      <pubDate>Sat, 17 Jan 2026 10:00:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/when-not-to-use-kubernetes/</guid>
      <description>&lt;p&gt;I write a lot about Kubernetes, and I run it at home every day. I like it.&lt;/p&gt;&#xA;&lt;p&gt;So it might surprise you that I spend a fair amount of my time talking people out of it.&lt;/p&gt;&#xA;&lt;p&gt;The situation I keep walking into goes like this. A small team, one product, a roadmap full of features customers are waiting for, and someone has decided the first milestone is a Kubernetes cluster. Three nodes minimum, etcd, a &lt;span class=&#34;def&#34; tabindex=&#34;0&#34; data-def=&#34;Container Network Interface: the plugin contract Kubernetes uses to give a pod its network. Cilium, Calico and Flannel are implementations of it.&#34;&gt;CNI&lt;/span&gt;&#xA;, an ingress controller, cert-manager, a monitoring stack. Weeks of work before a single customer sees anything. Everyone nods along, because that&amp;rsquo;s what a serious setup is supposed to look like.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Unbreakable - My Fascination.</title>
      <link>https://tommeurs.nl/en/posts/unbreakable/</link>
      <pubDate>Tue, 23 Dec 2025 20:00:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/unbreakable/</guid>
      <description>&lt;p&gt;As a kid I called the things that fascinated me &lt;strong&gt;unbreakable&lt;/strong&gt;. Indestructible never fit, because indestructible means it never breaks. Unbreakable means it keeps working &lt;em&gt;after&lt;/em&gt; it breaks.&lt;/p&gt;&#xA;&lt;p&gt;I know exactly when it started. A photo of an A-10 Thunderbolt II back from a mission with half a wing gone, the tail in tatters and the fuselage full of holes. It still brought its pilot home.&lt;/p&gt;&#xA;&lt;p&gt;Luck had nothing to do with it. Somebody sat at a drawing board years before that mission and decided the plane had to come home looking like that.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Running Kubernetes Offline: Edge Computing Without Internet</title>
      <link>https://tommeurs.nl/en/posts/kubernetes-offline-edge/</link>
      <pubDate>Tue, 04 Mar 2025 20:47:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/kubernetes-offline-edge/</guid>
      <description>&lt;p&gt;What happens when your Kubernetes cluster can&amp;rsquo;t reach the internet? I don&amp;rsquo;t mean a slow connection. I mean no connection at all. Ships at sea. Remote mining sites. Factory floors with air-gapped networks. Military deployments.&lt;/p&gt;&#xA;&lt;p&gt;For a lot of people that sounds exotic, like a problem someone else has. I treat it as a baseline design requirement, and I&amp;rsquo;ll explain why it makes my homelab better even though I almost never actually pull the cable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Graceful Degradation in Kubernetes: What Happens When Components Fail</title>
      <link>https://tommeurs.nl/en/posts/kubernetes-graceful-degradation/</link>
      <pubDate>Thu, 20 Feb 2025 14:22:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/kubernetes-graceful-degradation/</guid>
      <description>&lt;p&gt;Everyone repeats the line that Kubernetes is self-healing. Pods die, they come back. Nodes drop, workloads reschedule. The system reconciles itself toward the state you declared, and most days you never have to think about it.&lt;/p&gt;&#xA;&lt;p&gt;Then one day the thing doing the healing is the thing that broke. The API server is down. etcd won&amp;rsquo;t respond. The scheduler is wedged. Now what?&lt;/p&gt;&#xA;&lt;p&gt;This is the question I actually care about, because &amp;ldquo;self-healing&amp;rdquo; is only useful if I understand its edges. I want to know what degrades gracefully and what takes the whole cluster with it. So I&amp;rsquo;ve run my clusters through a lot of failures on purpose: planned, unplanned, and a few &amp;ldquo;hold my beer&amp;rdquo; experiments on hardware I didn&amp;rsquo;t mind losing. Here is what actually happens when each piece breaks, and why most of it matters less than people fear.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How etcd Actually Works: The Heart of Your Kubernetes Cluster</title>
      <link>https://tommeurs.nl/en/posts/etcd-deep-dive/</link>
      <pubDate>Mon, 27 Jan 2025 21:47:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/etcd-deep-dive/</guid>
      <description>&lt;p&gt;When something goes wrong in Kubernetes, the trail usually leads back to etcd. API server timing out? Check etcd. Pods stuck in pending? Might be etcd. Cluster feels sluggish? Probably etcd.&lt;/p&gt;&#xA;&lt;p&gt;For a long time I treated etcd the way most operators do: as a black box that hums along next to the control plane. &amp;ldquo;The database.&amp;rdquo; You back it up and otherwise leave it alone. But black boxes feel like splinters to me, and the first time an etcd cluster fell over at 2am I realised I had no idea what I was actually looking at. So I learned. And it turns out the whole thing is built on a handful of ideas that, once they click, make most etcd problems diagnosable instead of terrifying.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Kubernetes High Availability: Stacked vs External etcd Explained</title>
      <link>https://tommeurs.nl/en/posts/kubernetes-high-availability-etcd/</link>
      <pubDate>Wed, 15 Jan 2025 20:23:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/kubernetes-high-availability-etcd/</guid>
      <description>&lt;p&gt;The first &amp;ldquo;production&amp;rdquo; Kubernetes cluster I ran had a single control plane node. It hummed along happily for weeks, right up until a disk failed and took the whole thing with it. Every pod, every service, gone. That outage taught me what &amp;ldquo;single point of failure&amp;rdquo; actually feels like, and it pushed me toward a question that I keep seeing trip people up: when you build a cluster that survives node loss, do you run etcd on your control plane nodes, or on dedicated nodes of its own?&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
