<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Infrastructure on Tom Meurs</title>
    <link>https://tommeurs.nl/en/tags/infrastructure/</link>
    <description>Recent content in Infrastructure on Tom Meurs</description>
    <generator>Hugo</generator>
    <language>en</language>
    <copyright>© Tom Meurs</copyright>
    <lastBuildDate>Wed, 06 May 2026 19:30:00 +0100</lastBuildDate>
    <atom:link href="https://tommeurs.nl/en/tags/infrastructure/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Building an Internal Developer Platform: Where to Start</title>
      <link>https://tommeurs.nl/en/posts/internal-developer-platform/</link>
      <pubDate>Wed, 06 May 2026 19:30:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/internal-developer-platform/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; An Internal Developer Platform is a thin layer between what a developer wants and what the cluster demands. Mine is a Helm base chart, ArgoCD and a handful of Kyverno policies, about 500 lines of my own code. Start with those three, and add observability and a portal only when the tickets tell you to.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Should you build an Internal Developer Platform? Usually, yes. It&amp;rsquo;s the how that wrecks teams.&lt;/p&gt;</description>
    </item>
    <item>
      <title>K3s Cluster Setup on Refurbished Mini-PCs</title>
      <link>https://tommeurs.nl/en/posts/k3s-cluster-setup/</link>
      <pubDate>Fri, 24 Apr 2026 21:12:00 +0100</pubDate>
      <guid>https://tommeurs.nl/en/posts/k3s-cluster-setup/</guid>
      <description>&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; Three refurbished mini-PCs, K3s with embedded etcd, kube-vip for one API address that survives a dead node, then MetalLB, Traefik and Longhorn on top. About €450 in hardware and an afternoon. Below are the commands, in the order I ran them.&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;Three mini-PCs sit on a shelf in my house. Between them they run my GitLab, my monitoring stack, home automation, file sync, a password manager, and a pile of other things I&amp;rsquo;d rather not hand to someone else&amp;rsquo;s computer. The whole setup cost less than one month of the managed Kubernetes bill for the same thing, and I know what every layer does because I put it there.&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>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>
  </channel>
</rss>
