<?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>K0s on rHomelab</title><link>https://rhomelab.com/tags/k0s/</link><description>Recent content in K0s on rHomelab</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Sat, 24 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://rhomelab.com/tags/k0s/index.xml" rel="self" type="application/rss+xml"/><item><title>k3s vs k0s vs MicroK8s: Do You Actually Need Kubernetes in Your Homelab?</title><link>https://rhomelab.com/self-hosted/k3s-vs-k0s-vs-microk8s-homelab-kubernetes/</link><pubDate>Sat, 24 Oct 2026 00:00:00 +0000</pubDate><guid>https://rhomelab.com/self-hosted/k3s-vs-k0s-vs-microk8s-homelab-kubernetes/</guid><description>Docker Compose runs most homelabs fine. Here&amp;#39;s when a lightweight Kubernetes distro like k3s, k0s, or MicroK8s actually earns its complexity, and when it&amp;#39;s just homework you gave yourself.</description><content:encoded><![CDATA[<p>Kubernetes shows up in homelab conversations constantly, usually right after someone says &ldquo;I want to get better at this for work.&rdquo; That&rsquo;s a legitimate reason to run it. What&rsquo;s less legitimate is the assumption that Kubernetes is a natural next step up from Docker Compose the way Compose was a natural next step up from a pile of <code>docker run</code> commands. It isn&rsquo;t. Compose and Kubernetes solve overlapping problems with very different amounts of machinery, and for a huge share of homelab workloads, Compose (or a UI on top of it, like Portainer or Dockge) is simply the correct tool, not a beginner&rsquo;s tool you&rsquo;re supposed to graduate out of. This is about when a lightweight Kubernetes distribution actually pays for itself at home, and when it&rsquo;s complexity you&rsquo;re taking on for its own sake.</p>
<h2 id="what-kubernetes-actually-buys-you-that-compose-doesnt">What Kubernetes actually buys you that Compose doesn&rsquo;t</h2>
<p>Compose runs containers according to a file you wrote, on the host you ran it on. If that host goes down, your containers go down with it, full stop. Kubernetes is built around a different premise: you describe a desired state (how many replicas of this app, what resources it needs, what it should be reachable on) and a control plane continuously works to make the cluster match that description, across however many nodes you give it. If a node dies, workloads that were on it get rescheduled onto surviving nodes automatically. That&rsquo;s the actual feature, self-healing scheduling across a pool of machines, and it&rsquo;s the one Compose fundamentally cannot do because Compose has no concept of &ldquo;a pool of machines&rdquo; at all.</p>
<p>Everything else people associate with Kubernetes, rolling updates, health checks, horizontal scaling, service discovery, is either something Compose can approximate with enough Docker Swarm-lite tooling, or something that only matters once you have more than one node to spread load across. If you&rsquo;re running everything on a single Proxmox host or mini PC, the self-healing-across-nodes feature has nothing to heal onto. You&rsquo;re paying the full operational cost of Kubernetes to use roughly none of what makes it worth that cost.</p>
<h2 id="the-three-distros-that-actually-make-sense-at-home">The three distros that actually make sense at home</h2>
<p>Full upstream Kubernetes (via kubeadm) is not what anyone should run in a homelab. It assumes a team of people maintaining etcd, a cloud provider&rsquo;s load balancer integration, and infrastructure that updates itself through a CI/CD pipeline you don&rsquo;t have. The homelab-sized options strip that down considerably.</p>
<p><strong>k3s</strong> is the one you&rsquo;ll see recommended most often, built by Rancher (now SUSE) specifically for resource-constrained and edge environments. It ships as a single binary, replaces etcd with embedded SQLite by default (or real etcd if you want multi-master HA), and bundles a lightweight ingress controller (Traefik) and local-path storage provisioner so a fresh cluster is actually usable for something within minutes of installing it, not just running. It&rsquo;s genuinely light enough for a Raspberry Pi, and it&rsquo;s the distro with the biggest homelab community, which matters more than it sounds like when something breaks at 11pm and you&rsquo;re searching for the error message.</p>
<p><strong>k0s</strong> takes a similar &ldquo;single binary, batteries included&rdquo; approach but is more deliberately minimal and unopinionated about what runs on top, it doesn&rsquo;t bundle Traefik the way k3s does, leaving ingress and CNI choices more explicitly up to you. It&rsquo;s a reasonable pick if you specifically want to avoid k3s&rsquo;s opinions about what belongs in a base install, but the tradeoff is a smaller community and fewer homelab-specific guides when something doesn&rsquo;t work the way the docs implied.</p>
<p><strong>MicroK8s</strong>, from Canonical, is the most &ldquo;appliance-like&rdquo; of the three, installed via snap, with a plugin system (<code>microk8s enable dns</code>, <code>microk8s enable ingress</code>) that turns optional components on and off without hand-editing manifests. It&rsquo;s a comfortable fit if you&rsquo;re already running Ubuntu everywhere and like snap&rsquo;s model, and a genuine friction point if you&rsquo;re not, since it pulls snapd in as a hard dependency and that doesn&rsquo;t sit well on every distro or inside every container runtime.</p>
<p>For a first homelab Kubernetes cluster, k3s is the default recommendation almost everyone converges on, and for good reason: it has the most documentation, the most Helm charts tested specifically against it, and the smallest number of &ldquo;why doesn&rsquo;t this work like the tutorial said&rdquo; surprises. k0s and MicroK8s both have real niches, but they&rsquo;re niches you reach for once you know specifically why k3s&rsquo;s defaults don&rsquo;t fit, not a first stop.</p>
<h2 id="where-to-actually-run-it">Where to actually run it</h2>
<p>On Proxmox, the practical choice is VMs, not LXCs. Running a container orchestrator inside a container host works, people do it, but it means fighting the same cgroup and nesting friction covered in the LXC-vs-VM decision elsewhere on this site, and a Kubernetes node crashing into unrelated host-level issues is a worse debugging session than a VM crashing cleanly on its own. A handful of small VMs (2-4GB RAM each is plenty for k3s agents) spread across your Proxmox host or hosts gives you the multi-node setup that&rsquo;s the entire point of running Kubernetes in the first place. If you only have one physical host, you can still run several VMs on it for a multi-node cluster, you just lose the &ldquo;survives a hardware failure&rdquo; benefit since one host failure takes all the VMs with it, but you keep the scheduling and self-healing behavior for software-level failures like a crashed pod or a hung node.</p>
<p>Storage is the part that trips people up first. k3s&rsquo;s bundled local-path provisioner only gives you node-local storage, fine for stateless workloads, a real problem for anything with a database that needs to survive its pod moving to a different node. The two realistic options are Longhorn (distributed block storage built for Kubernetes, replicates volumes across nodes, but wants real CPU and network headroom to do it well) or just pointing stateful workloads at an existing NFS share from your NAS and accepting that storage lives outside the cluster&rsquo;s self-healing story entirely. For a homelab-scale cluster, NFS-backed persistent volumes for anything stateful, with Longhorn reserved for the rare case where you specifically need storage that survives a node going away too, is the less painful default.</p>
<p>Networking-wise, MetalLB is the piece that&rsquo;s easy to forget you need. Kubernetes <code>LoadBalancer</code>-type services assume a cloud provider will hand out a real external IP, which obviously doesn&rsquo;t exist at home. MetalLB fills that gap by claiming addresses out of a range you give it on your LAN, so <code>kubectl get svc</code> actually shows you a usable IP instead of sitting at <code>&lt;pending&gt;</code> forever. k3s&rsquo;s bundled Traefik ingress still needs something like MetalLB underneath it to get a real LAN-reachable address in the first place.</p>
<h2 id="what-its-actually-good-for-at-home">What it&rsquo;s actually good for at home</h2>
<p>The honest list of homelab use cases where Kubernetes earns its keep is shorter than the hype suggests, but it&rsquo;s real:</p>
<p><strong>Learning for work</strong>, full stop, legitimate on its own. If your job involves Kubernetes or you&rsquo;re trying to get a job that does, running a real cluster at home where you can break things without a pager going off is worth the complexity by itself, no further justification needed.</p>
<p><strong>Genuinely redundant self-hosting across multiple physical hosts</strong>, where you specifically want a service to keep running if one box dies, not just restart on the box that&rsquo;s still up (that part Docker Compose plus a restart policy already does fine on a single host).</p>
<p><strong>GitOps workflows</strong>, where you want your entire homelab&rsquo;s app state defined declaratively in a git repo and reconciled automatically (ArgoCD or Flux are the common picks on top of k3s), which is a meaningfully different operating model from SSHing in and running <code>docker compose pull &amp;&amp; up -d</code> by hand or through a UI.</p>
<p>What it&rsquo;s not particularly good for: running the handful of apps most people start a homelab with. Pi-hole, Jellyfin, a reverse proxy, Vaultwarden, Nextcloud, these are all single-instance apps that don&rsquo;t benefit from horizontal scaling and whose availability story is &ldquo;restart it if it crashes,&rdquo; which <code>restart: unless-stopped</code> in a compose file already covers. Wrapping them in Kubernetes adds YAML, adds a control plane to keep patched and running, and adds an entirely new category of thing that can break (the cluster itself), in exchange for scheduling flexibility you have no actual use for on one or two hosts.</p>
<h2 id="the-real-cost-nobody-mentions-upfront">The real cost nobody mentions upfront</h2>
<p>Even k3s&rsquo;s &ldquo;lightweight&rdquo; framing undersells the ongoing maintenance. A Kubernetes cluster is a live system with its own upgrade cadence, independent of whatever&rsquo;s running inside it, and version skew between control plane and workloads is a real failure mode if you let a cluster sit unpatched for too long. You&rsquo;re also debugging a different stack when something goes wrong: instead of <code>docker logs</code> and <code>docker inspect</code>, it&rsquo;s <code>kubectl describe pod</code>, <code>kubectl logs</code>, checking whether it&rsquo;s a scheduling problem, a networking problem, or a storage problem, each with its own command and its own learning curve. None of that is a reason to avoid Kubernetes if you want to learn it. It is a reason to be honest that &ldquo;it&rsquo;s just a lightweight distro, how hard can it be&rdquo; undersells what you&rsquo;re actually taking on.</p>
<h2 id="bottom-line">Bottom line</h2>
<p>If you&rsquo;re running a handful of apps on one or two homelab hosts and nothing about your setup needs scheduling across machines, Docker Compose (optionally with Portainer or Dockge on top) is not a lesser choice, it&rsquo;s the correctly-sized one, and adding Kubernetes on top buys you a second system to maintain for capabilities you won&rsquo;t use. If you want to learn Kubernetes for real reasons, work, a genuinely multi-host resilient setup, or a GitOps-driven homelab, k3s is the right place to start: smallest footprint, biggest community, fewest surprises. k0s and MicroK8s are both fine choices once you know specifically why k3s&rsquo;s defaults don&rsquo;t fit what you&rsquo;re building, not a reason to skip k3s on a first attempt.</p>
]]></content:encoded></item></channel></rss>