Lightweight Kubernetes in 2026: revisit k3s, k0s and Talos Linux before you stand up another small cluster
Picture a software company in Visakhapatnam that builds gate and yard software for container freight stations around the Visakhapatnam and Gangavaram ports, with two more customers at Kakinada and one inland depot near Vizianagaram (an invented example, not a real client). Every yard has number-plate and container-number OCR cameras at the gates, a weighbridge feed and a small service that sends gate events to the customer’s terminal system. Each yard gets a little rack: two or three mini PCs with 8 GB of RAM, a 4G router and an inverter that does not always last through a long power cut.
Today each yard runs Docker Compose on one box, updated over SSH when someone remembers; last quarter one yard was found running a seven-month-old image of the gate service. A terminal customer then added two clauses to the renewal: critical security fixes must be on site within 14 days, with evidence, and a failed yard box must be rebuilt within 4 hours. The team of one platform engineer and five developers decides to move the yards to Kubernetes. Three proposals arrive. A developer who runs it on a Raspberry Pi at home wants k3s. The platform engineer, who used k0sctl at a previous job, wants k0s. The lead, who has read too many incident reports about SSH keys left on edge boxes, wants Talos Linux, with no SSH and no shell at all.
Below, the three are set against each other as of 19 October 2026: where cluster state lives, what a backup must contain, how restores and upgrades behave, how quickly each ships upstream Kubernetes patches, who patches the operating system, footprint, licences and governance, and security advisories. MicroK8s and RKE2 get a short section, because both come up in the same conversations. Managed services and Rancher, Omni or other management planes are left aside unless they help explain the free product. The question is narrow: what does each distribution actually promise the person who has to keep a small cluster alive?
Facts come from GitHub release and advisory APIs, LICENSE and maintainer files, official documentation, the Kubernetes changelog and release schedule, the CNCF conformance repository and CVE records, plus a drill that ran k3s v1.36.5 and v1.37.1, k0s v1.36.4+k0s.1 and Talos Linux 1.14.4 on one shared box. Treat the drill as a sanity check on one machine, not a benchmark, and read the licence notes as a summary, not legal advice.
The short version
- A distribution is an operations contract. All three give you conformant Kubernetes. They differ in four promises: where state lives and what a restore needs, how fast an upstream patch reaches your node, how upgrades are done and checked, and who patches the operating system underneath.
- A k3s SQLite backup without its WAL file is a silent failure. In the drill, restoring only
state.db(withoutstate.db-wal) gave a server that reported Ready but had lost the application’s ConfigMap, Secret and Deployment: 233 rows instead of 331. Copy the wholeserver/dbdirectory, with the server stopped. - The token and the keys are part of the backup. k3s refused to start from a copied database without the original server token (“bootstrap data already found and encrypted with different token”), and refused an etcd snapshot restore on a new data directory until I passed
--token. The k0s backup archive held the cluster CA private key, the etcd CA key and the service account key, and was written world-readable under the default umask. - Patch lag is real and it varies. For the 34 upstream Kubernetes patch and minor releases of 2026 so far, the first k3s build arrived after a median of 7.8 days. k0s matched 28 of them with a median of 17.1 days, and on 19 October it had no build of Kubernetes 1.36.5 or of any stable 1.37 release, about 26 days after upstream shipped them. Talos ships Kubernetes separately from the OS; Talos 1.14.2 made 1.37.1 its default about 6 days after upstream.
- Upgrades surface old mistakes. Kubernetes 1.37 now validates the API server’s advertise address. A k3s v1.36.5 server started with
--advertise-address 127.0.0.1logged an error and kept serving; v1.37.1 on the same data directory refused to start. - Footprint is closer than the marketing suggests, and the OS matters more. On this box, a k3s control plane used about 370 to 460 MiB in one process, and a k0s controller about 730 MiB across seven processes. Talos documents 2 GiB and 2 cores as the control plane minimum, but replaces the whole host OS, so there is no separate Linux to patch.
Where things stand on 19 October 2026
All release dates below are the published_at value in each project’s GitHub API, shown in IST (UTC+5:30). Licence names come from each repository’s LICENSE file.
k3s
- Latest: v1.37.1+k3s1, v1.36.5+k3s1, v1.35.9+k3s1 and v1.34.12+k3s1, all on 30 September 2026 at about 9:40 PM.
- Channels: the
stablechannel points at v1.36.5+k3s1 andlatestat v1.37.1+k3s1 (channel service, checked 19 October). - What is inside v1.37.1+k3s1: Kubernetes v1.37.1, Kine v0.17.1, SQLite 3.53.4, etcd v3.7.1-k3s3, containerd v2.3.4-k3s1, Flannel v0.28.4, Traefik v3.7.13 and CoreDNS v1.14.7, per the release notes. The amd64 binary is 81,543,330 bytes.
- Licence and governance: Apache 2.0. A CNCF Sandbox project since 19 August 2020. The MAINTAINERS file lists 16 maintainers, all with suse.com addresses, plus two community managers.
- Attention: about 34,223 GitHub stars.
k0s
- Latest: v1.36.4+k0s.1 (20 September 2026, 2:53 AM), v1.35.8+k0s.1 and v1.34.11+k0s.1 (19 September), out-of-band releases for a high-severity advisory about kubelet serving certificates.
- Not yet shipped: no k0s build of Kubernetes 1.36.5, 1.35.9 or 1.34.12, and no stable 1.37 release. The only 1.37 tag is v1.37.0-alpha.1+k0s.0 (30 June 2026).
- Release model: the releases page says k0s follows the upstream cycle, maintains each minor for about 14 months, and that its first release of a minor is “always a few weeks behind” upstream. Mirantis offers commercial support.
- Licence and governance: Apache 2.0 for code, with the
docs/directory under CC BY-SA 4.0 (which is why GitHub shows the licence as unrecognised). A CNCF Sandbox project since 19 January 2025. The maintainer roster lists eight maintainers. The amd64 binary is 263,332,384 bytes, because it embeds the Kubernetes binaries, etcd and containerd. - Attention: about 6,537 GitHub stars.
Talos Linux
- Latest: 1.14.4 (16 October 2026, 8:55 PM; Linux 6.18.57), a day after 1.14.3 (containerd 2.3.7, etcd 3.7.2). The previous line’s latest is 1.13.11 (1 October). 1.14.0 shipped on 3 September 2026, and 1.15.0-alpha.1 on 13 October.
- Kubernetes: 1.14.4 defaults to Kubernetes v1.37.1, and the support matrix lists Kubernetes 1.33 to 1.37 for the 1.14 line.
- Support: community support for 1.14 ends with the 1.15.0 release, listed as 27 December 2026 (to be confirmed). Enterprise support is offered by Sidero Labs, Inc.
- Licence and governance: MPL 2.0 for Talos. Sidero Labs’ Omni management plane uses the BSL 1.1 (Business Source License), with a change date of 9 September 2030 to MPL 2.0, and production use needs a commercial licence. I found no CNCF project page for Talos; it is a Sidero Labs project.
- Attention: about 11,376 GitHub stars.
Upstream Kubernetes
- Latest: 1.37.1, 1.36.5, 1.35.9 and 1.34.12 (24 September 2026). 1.37.0 shipped on 26 August 2026.
- October patches: 1.37.2, 1.36.6 and 1.35.10 were scheduled for 13 October, but were not tagged when I checked on the evening of 19 October.
- End of life: 1.34 on 27 October 2026, 1.35 on 28 February 2027, 1.36 on 28 June 2027, 1.37 on 28 October 2027 (release schedule data).
- Conformance: the CNCF conformance repository’s v1.37 directory lists 28 products, including k3s, RKE2 and Talos. The v1.36 directory lists 89, including all five distributions in this post.
Also on the list: MicroK8s and RKE2
- MicroK8s (Canonical, Apache 2.0) is Kubernetes as a single snap, with a Dqlite-based datastore (
k8s-dqlite). Its latest GitHub release is v1.36 (25 May 2026), and it is not yet in the v1.37 conformance directory. It suits teams already on Ubuntu and snaps. - RKE2 (SUSE, Apache 2.0) takes k3s’s deployment model to the datacentre: control plane as static pods, containerd, defaults aimed at the CIS benchmark and FIPS 140-2. v1.37.1+rke2r1 shipped on 30 September 2026. It asks for 4 GB of RAM at minimum and recommends 8 GB, which is more than these yard boxes want to give.
Timeline
- November 2017: the
siderolabs/talosrepository is created. - May 2018: the
k3s-io/k3srepository is created. - 19 August 2020: k3s is accepted into the CNCF Sandbox.
- 18 November 2020: Mirantis announces k0s as a new, pure upstream Kubernetes distribution.
- 1 December 2020: SUSE completes its acquisition of Rancher Labs, the original home of k3s.
- 19 January 2025: k0s is accepted into the CNCF Sandbox.
- 22 April 2026: Kubernetes 1.36.0. The same day, CVE-2026-31431 (“copy.fail”, a Linux kernel bug in
algif_aead) is published. - 7 May 2026: k3s v1.36.0+k3s1, about 14 days after upstream.
- 3 June 2026: k3s advisory for path traversal in compressed etcd snapshot restores (CVE-2026-54250).
- 14 June 2026: k0s v1.36.1+k0s.0, the first stable k0s 1.36 release, 53 days after upstream 1.36.0.
- 26 August 2026: Kubernetes 1.37.0.
- 3 September 2026: Talos 1.14.0, with Kubernetes 1.37.0 as default.
- 14 September 2026: k3s v1.37.0+k3s1 and RKE2 v1.37.0+rke2r1.
- 18 September 2026: critical Talos advisory (CVSS 9.9): role-less API certificates could claim any role.
- 20 September 2026: k0s out-of-band releases for its kubelet serving certificate advisory.
- 24 September 2026: Kubernetes 1.37.1, 1.36.5, 1.35.9 and 1.34.12.
- 30 September 2026: k3s and RKE2 ship those four; Talos 1.14.2 makes 1.37.1 its default.
- 19 October 2026: three new Talos advisories published at 2:07 PM.
- 27 October 2026: upstream end of life for Kubernetes 1.34.
First question: what is the distribution promising you?
“We need lightweight Kubernetes” usually means “we need fewer moving parts on a small box”. That is a fair wish, but the parts do not vanish; the distribution decides who owns them. Four promises matter more than the install command:
- State. Where does cluster state live (SQLite through Kine, embedded etcd, an external database), and what exactly must be copied so that a restore works on a new machine? The answer always includes secret material: tokens, CA keys, encryption keys.
- Patches. When upstream Kubernetes fixes a CVE, how many days until a build exists for your minor version, and who patches the kernel, containerd and runc on the node?
- Upgrades. One binary swap, a controller that applies plans, or an API call that writes a new OS image? How does it respect the version skew policy, and how do you roll back?
- Access. How does an operator reach a node at 2 AM: SSH and a shell, or only an authenticated API?
Before anything is installed, agree on one sentence that states the promise:
Every yard cluster runs Kubernetes [minor version], receives upstream security patches within [N days], gets operating system security fixes within [N days], can be rebuilt on [new hardware] from [backup location] within [N hours] with no more than [N hours] of lost state, and is reachable by operators only through [SSH with named keys / the Talos API with role-scoped certificates].
The install takes ten minutes with any of them. The promise is what you live with.
What each distribution actually is
k3s v1.37.1+k3s1
k3s is a single binary that runs the Kubernetes control plane, kubelet, containerd and a set of packaged add-ons (Flannel, CoreDNS, Traefik, a local path provisioner, metrics-server, a service load balancer and a Helm controller) in one process tree. Its unusual feature is the datastore. The datastore docs say that SQLite is the default when nothing else is configured, that SQLite “cannot be used on clusters with multiple servers”, that embedded etcd is selected with --cluster-init or when etcd files already exist, and that external etcd, MySQL, MariaDB or PostgreSQL work through Kine, with listed certified versions.
Backups follow the datastore. For SQLite, “no special commands are required”: copy server/db. For embedded etcd, k3s etcd-snapshot takes on-demand snapshots, and scheduled snapshots run by default at 00:00 and 12:00 with five kept per node, optionally uploaded to S3-compatible storage. In every case the backup docs carry the same warning: back up the server token at /var/lib/rancher/k3s/server/token, because it encrypts confidential data inside the datastore, and without it “the snapshot will be unusable”.
Upgrades are a binary swap and a restart, by script or by hand, or through Rancher’s system-upgrade-controller with plans. The docs remind you that the version skew policy applies and that the controller “will not protect against unsupported changes”, so no skipping minors. Release channels make the choice explicit: stable (v1.36.5+k3s1 today) or latest (v1.37.1+k3s1).
k3s v1.37.1 also fixed restores from compressed etcd snapshots and started rejecting anonymous access to the supervisor’s internal router endpoints.
k0s v1.36.4+k0s.1
k0s is also a single binary, but its design separates roles. Controllers run the control plane as “naked” processes supervised by k0s, with no container runtime or kubelet on controller nodes by default, so workloads cannot land on them. Workers run containerd and kubelet. The default datastore is etcd, managed by k0s (“an elastic etcd cluster within the controller nodes”), and Kine can be selected instead to use SQLite, MySQL or PostgreSQL. The architecture page notes that k0s cannot shrink the etcd cluster by itself: a controller must be removed from etcd by hand before you retire it.
The backup story is tidy. k0s backup writes one archive with the PKI directory, an etcd (or Kine/SQLite) snapshot, k0s.yaml, manifests and Helm configuration. The docs list what is not included: persistent volumes, any other datastore, and manual changes outside the manifests directory. k0s restore must run on a controller, refuses a data directory that overlaps the archive, and the docs show how to pipe the archive through GnuPG so that the CA keys are not left lying around.
Upgrades are a binary swap with k0s stop and k0s start, or k0sctl apply with a new version in its config (controllers one at a time, workers in batches of 10 percent with drains), or the in-cluster Autopilot controller with immutable Plan objects. The weak point today is not the tooling but the calendar: the 1.36 line arrived 53 days after upstream, and 1.37 is still alpha.
Talos Linux 1.14.4
Talos is not a Kubernetes binary that you install on Linux. It is the Linux. The philosophy page puts it plainly: no shell, no SSH, no packages, an immutable root and an API-driven OS managed with talosctl. You hand each machine a configuration document, generated from a secrets bundle, and the machine becomes a control plane or worker node. Kubernetes runs on top with etcd managed by Talos, and Talos enforces Pod Security Admission at the baseline level by default (the drill’s generated config showed enforce: baseline, with restricted for warnings and audit).
Two separate upgrade paths follow. OS upgrades write a new image with an A-B scheme and roll back automatically if the new one fails to boot; the docs recommend going through the latest patch of every intermediate minor. Kubernetes upgrades are separate (talosctl upgrade-k8s), so you can move the OS and Kubernetes on different days. From 1.14, installer images come from the Image Factory rather than a plain ghcr.io installer image, so check your upgrade scripts.
The disaster recovery page is direct about single control plane clusters: losing the node “might render the whole cluster irrecoverable without a backup”. Back up two things: regular talosctl etcd snapshot files, and the machine configuration (or the secrets bundle it came from), so that a replacement node gets the same identity and certificates. Recovery is talosctl bootstrap --recover-from=<snapshot> on a node whose etcd is waiting in the Preparing state.
Side by side
If I could not find a primary source for a point, the bullet says “Not documented” instead of guessing.
Licence, governance and maintainers
- k3s: Apache 2.0. CNCF Sandbox (2020). Maintainers listed with SUSE addresses. SUSE sells support through its Rancher products.
- k0s: Apache 2.0 for code, CC BY-SA 4.0 for docs. CNCF Sandbox (2025). Eight listed maintainers; Mirantis started the project and offers commercial support.
- Talos Linux: MPL 2.0. Steward Sidero Labs, Inc.; no CNCF project page found. Omni, its management plane, is BSL 1.1 and not open source until its change date.
Datastore and control plane state
- k3s: SQLite through Kine by default (single server only), embedded etcd for HA, or external etcd, MySQL, MariaDB or PostgreSQL. The server token encrypts bootstrap data (CA certificates and keys) inside the datastore.
- k0s: k0s-managed etcd by default; Kine with SQLite, MySQL or PostgreSQL as options. PKI lives in the data directory.
- Talos: etcd on control plane nodes, managed by Talos. Node identity and PKI come from the machine configuration and its secrets bundle.
Backup and restore
- k3s with SQLite: stop the server, copy
server/db(including-waland-shm) andserver/token. Restore both. In the drill, this restored every object and the original CA. - k3s with embedded etcd: scheduled and on-demand snapshots, local or S3; restore with
--cluster-reset --cluster-reset-restore-path, and pass--tokenon a new host. - k0s:
k0s backupmakes one archive including CA keys;k0s restoreinto an empty data directory. Encrypt the archive. - Talos:
talosctl etcd snapshotplus the machine configuration or secrets bundle; recover withtalosctl bootstrap --recover-from.
Upgrades and version skew
- k3s: replace the binary and restart, servers first and one at a time, then agents; or system-upgrade-controller plans. Channels pin the minor. You must not skip minors.
- k0s: binary swap,
k0sctl applywith a version, or Autopilot plans. k0s v1.36.4+k0s.1 also “corrected the supported version skew” in its notes. - Talos:
talosctl upgradefor the OS (A-B images, rollback) andtalosctl upgrade-k8sfor Kubernetes. Go through each intermediate minor. - Upstream rule for all (version skew policy): API servers within one minor of each other; kubelets up to three minors older than the API server, never newer.
Patch lag behind upstream in 2026
I matched each upstream Kubernetes release published in 2026 (34 so far, from 1.32.12 to 1.37.1) with the first non-prerelease build of the same version in each project’s GitHub releases.
- k3s: all 34 matched; median 7.8 days, range 2.2 to 19.0 days. New minors took longer: 14.2 days for 1.36.0 and 19.0 days for 1.37.0.
- k0s: 28 of 34 matched; median 17.1 days, range 4.6 to 34.9. Unmatched: 1.36.0 (k0s started the line at 1.36.1), 1.37.0, and all four releases of 24 September, still open after about 26 days.
- Talos: Talos does not repackage Kubernetes; you choose the version, within the support matrix. Its default moved to 1.37.0 in 1.14.0 (7.6 days after upstream) and to 1.37.1 in 1.14.2 (6.1 days after).
- RKE2: v1.37.1+rke2r1 and v1.36.5+rke2r1 on 30 September, the same day as k3s. I did not compute a full-year figure.
These are release dates, not quality scores. A slower project may be testing more; a faster one may be skipping something you need. But if a contract says 14 days, the numbers decide for you.
Footprint, documented and measured
- k3s: documented minimum 2 cores and 2 GB for a server, 1 core and 512 MB for an agent. Drill: one process, about 373 to 392 MiB RSS with SQLite and 392 to 460 MiB with embedded etcd, control plane only, small object count.
- k0s: documented minimum 1 GB and 1 vCPU for a controller, 0.5 GB for a worker, with about 0.5 GB of disk for the controller part. Drill: about 730 MiB RSS across seven processes (k0s twice, etcd, kube-apiserver, konnectivity-server, kube-scheduler, kube-controller-manager), controller only.
- Talos: documented minimum 2 GiB, 2 cores and 10 GiB disk for a control plane node; 4 GiB, 4 cores and 100 GiB recommended. That is the whole machine, OS included. Drill: the node reported 676 MB used out of 2,953 MB, under software emulation.
Security record in 2026
- k3s: one GitHub advisory published in 2026 (CVE-2026-54250, CVSS 5.8). Total advisories in the repository: 3.
- k0s: two advisories published in 2026, neither with a CVE ID: kubelet serving certificates for arbitrary SANs (high, 7.9) and a konnectivity SSRF report (medium, fixed long ago in v1.28.2+k0s.0).
- Talos: 11 advisories published in 2026, one critical (9.9) and several about the Talos API’s role model, plus a kernel bug that a pod could chain into node compromise.
- RKE2: no advisories published in 2026 in its repository.
- As before, a long advisory list says as much about how openly a project reports issues as about its code. Talos also owns the kernel, so kernel issues show up in its list; with k3s or k0s the same kernel bug lives in your Linux vendor’s list.
Who patches the operating system
- k3s and k0s: you do. Ubuntu, Debian, RHEL or whatever you chose brings the kernel, systemd, OpenSSH and everything else, and their patch cadence is a second contract.
- Talos: Sidero Labs does, in the Talos release. Linux moved from 6.18.56 to 6.18.57 between 1.14.3 and 1.14.4. You still have to roll the upgrade out.
Worked example for the Visakhapatnam scenario
The Visakhapatnam team (invented) ran the steps below at one yard before deciding.
Step 1. Write down the four promises with numbers. Patch window 14 days, rebuild 4 hours, at most 12 hours of state lost, operator access through named credentials only. This turned the discussion from taste into arithmetic.
Step 2. Check patch lag against the clause. With a 14-day window and two or three days of their own testing, a distribution that needs 17 days on a typical patch, and has a 26-day gap open today, fails the clause before anyone installs it. That ruled k0s out for this contract, without any judgement on its design.
Step 3. Choose the datastore per yard size. Two-box yards run one k3s server on SQLite plus one agent. Three-box yards run three servers with embedded etcd. They wrote down that SQLite means no second server, ever, without a migration.
Step 4. Build the backup around the token. For SQLite yards, a nightly job stops k3s for a few seconds and archives the whole db directory and the token. For etcd yards, scheduled snapshots go to the head office’s S3-compatible store, and the token goes into the secrets manager, not next to the snapshots. Adapted from the drill (paths are the k3s defaults):
systemctl stop k3s
tar -C /var/lib/rancher/k3s/server -czf /backup/k3s-db-$(date +%F).tgz db token
systemctl start k3s
chmod 600 /backup/k3s-db-*.tgz
Step 5. Restore on a spare box, not on paper. Copy the archive to a clean machine, unpack into server/, start the same k3s version or the next minor, and check object counts, a Secret’s value and the CA certificate against the original.
Step 6. Patch the OS like a second product. Unattended security updates for the base OS, a monthly kernel reboot window per yard, and a dashboard that shows both the k3s version and the kernel version of every node.
Security and hygiene
I read each advisory below on GitHub and looked up every CVE ID in the CVE record API (cveawg.mitre.org). All times are in IST.
k3s
- CVE-2026-54250 (GitHub advisory 3 June 2026, CVE record 25 June 2026, 11:26 PM; CVSS 3.1 5.8): path traversal when an administrator restores a crafted ZIP as a compressed etcd snapshot. Fixed in v1.35.3+k3s1, v1.34.6+k3s1 and v1.33.10+k3s1. The advisory’s mitigation: extract snapshots yourself, or set
GODEBUG=zipinsecurepath=0. - v1.37.1+k3s1 (30 September 2026) rejects anonymous access to the supervisor router and improves CA hash validation; neither is listed with a CVE ID in the notes.
k0s
- GHSA-qjgc-wmg7-3jc3 (20 September 2026, 2:59 AM; high, 7.9; no CVE ID): the
csr-approvercomponent approved kubelet serving certificate requests without checking that the requested names belonged to the node, so any identity allowed to create CSRs could get a CA-signed certificate valid for the API server’s own names. Fixed in v1.36.4+k0s.1, v1.35.8+k0s.1 and v1.34.11+k0s.1.
Talos Linux
- GHSA-rjwj-368c-f82r (18 September 2026, 9:52 PM; critical, 9.9; no CVE ID): a Talos API client certificate with no roles could inject its own role header and act as
os:admin. Fixed in 1.13.10 and 1.12.12. - CVE-2026-31431, “copy.fail” (kernel CVE published 22 April 2026, 1:45 PM, CVSS 7.8; Talos advisory 1 May 2026, high): a page-cache corruption bug in the kernel’s
algif_aeadthat Talos says a pod could chain into root on the node. Fixed from 1.12.7 and 1.13.0. - CVE-2026-77564 (14 October 2026, 9:39 PM; CVSS 3.1 3.3): support bundles did not redact registry credentials. Fixed in 1.12.9 and 1.13.3; 1.14 encrypts bundles by default.
- GHSA-86hr-pw4f-vmcq (19 October 2026, 2:07 PM; medium): KubeSpan and WireGuard private keys were written to a debug log readable by the
os:readerrole. Fixed in 1.12.11, 1.13.8 and 1.14.0.
Habits that matter more than counting advisories:
- Treat every backup as a key store. A k3s token, a k0s backup archive and a Talos secrets bundle each let someone impersonate your cluster. Encrypt them and keep them apart from the snapshot location.
- Subscribe to two feeds per node: the distribution’s advisories and the OS vendor’s (or, on Talos, the Talos release notes, which carry both).
- Scope operator credentials. On Talos, use role-scoped
talosconfigfiles and patch the API layer quickly; on k3s and k0s, keep SSH keys named, few and rotated. - Disable what you do not use. k3s ships add-ons on by default; turn off Traefik or the service load balancer if the yard does not need them.
- Read release notes before changing channel. Security hardening (such as k3s rejecting anonymous supervisor access) can break a monitoring scrape that used to work.
Decision guide
Lean towards k3s if
- You want one binary, a choice of SQLite for tiny sites and embedded etcd for three-node sites, and a fast, steady patch rhythm (median under 8 days in 2026).
- Your team is comfortable owning a general-purpose Linux underneath, including its kernel patches.
- You will actually test token-inclusive restores, because that is where k3s backups fail.
Lean towards k0s if
- You like a clean split between controllers (no kubelet, no workloads) and workers, and declarative cluster upgrades through
k0sctlor Autopilot. - Your patch clause allows three to five weeks, or you can wait for a minor to settle.
- You want backup and restore as built-in commands with a documented scope.
Lean towards Talos Linux if
- You want no SSH, no shell and an immutable OS with A-B upgrades, and you accept that every operation goes through an API.
- You want one vendor to ship the kernel, container runtime and Kubernetes support together, and you can move to a new Talos minor every few months: the support matrix ends community support for each line at the next minor’s release (1.14 at 1.15.0), although 1.12 and 1.13 still got patch releases in September and October 2026.
- Your hardware and drivers are covered by Talos and its system extensions.
Look at MicroK8s or RKE2 if
- You are an Ubuntu shop that likes snaps (MicroK8s), or you need CIS and FIPS-oriented defaults and have 8 GB to spare per server (RKE2).
Be careful whichever you pick
- Single-server clusters: the backup is the high availability. Test it.
- Edge power cuts: an etcd quorum of three on boxes that lose power together is not three failure domains.
- “Lightweight” in a procurement note: describe the four promises, not the binary size.
Visakhapatnam (invented) pick. The team chose k3s on the stable channel (v1.36.5+k3s1 today): SQLite with one agent at two-box yards, three servers with embedded etcd at the larger ones. Reasons: the 14-day patch clause (k3s shipped every 2026 patch release within 13 days, with a median under 8), a restore that the drill proved works when the token travels with the data, and a base OS the team already patches. Backups follow Step 4, and a spare mini PC sits at head office for monthly restore tests. k0s was ruled out only on patch lag for this contract. Talos was the lead’s favourite and stayed in the plan as a pilot at the largest yard after the next hardware refresh, once they confirm that the weighbridge serial adapter and the 4G router management work without host tools. They will move to 1.37 when the stable channel does, not before.
Checklist
- Write the one-sentence promise: Kubernetes minor, patch window, OS patch window, rebuild time, access method.
- Check the last six months of patch lag for your chosen distribution and minor.
- Pick the datastore per site size, and write down what each choice forbids.
- Back up the datastore, the token or keys, and the config together; store the keys apart from the snapshots.
- Encrypt backup archives that contain CA keys.
- Restore to a clean machine, and compare object counts, a Secret’s value and the CA certificate.
- Upgrade one minor at a time, on one site first, reading the upstream changelog for new validation.
- Patch the base OS and kernel on a schedule, or choose an OS that ships them with the distribution.
- Turn off packaged add-ons you do not use.
- Follow the security feeds of both the distribution and the OS vendor, and fix a monthly patch day.
Common mistakes
- Copying
state.dbwithoutstate.db-waland calling it a backup. - Backing up snapshots but not the server token.
- Leaving a k0s backup archive, with the CA key inside, readable by everyone on the backup host.
- Starting a single-server SQLite cluster and planning to “add HA later”.
- Skipping a Kubernetes minor during an upgrade.
- Taking the
latestchannel into production on release day. - Ignoring the kernel because “Kubernetes is patched”.
- Leaving an advertise address of 127.0.0.1 because the cluster seemed to work.
- Losing the Talos secrets bundle and machine configs, so a replacement node cannot rejoin.
- Counting three etcd members on one power strip as high availability.
Drill on this box, 19 October 2026
The box is a shared Debian 13 VM on kernel 6.12 with 8 vCPUs and 15 GiB RAM (about 8 GiB free when I started, with other work running) and no Docker. k3s and k0s runs were between about 10:36 PM and 10:42 PM IST, and the Talos run between about 10:49 PM and 11:00 PM IST. All binaries and the Talos image matched their published SHA-256 checksums. Every cluster was a single control plane node without workloads actually running (k3s with --disable-agent, k0s controller only, Talos with no worker), seeded with the same invented yard-gate namespace: a ConfigMap (site: gangavaram-cfs-1), a Secret holding an invented weighbridge key, and a two-replica Deployment. One box, single runs, nothing here is a speed claim.
k3s on SQLite, upgrade from v1.36.5 to v1.37.1. v1.36.5+k3s1 started with SQLite, bound to 127.0.0.1 and with packaged add-ons disabled, and was Ready in 3.4 s. It used about 373 MiB RSS. I had passed --advertise-address 127.0.0.1; v1.36.5 logged Endpoints "kubernetes" is invalid ... may not be in the loopback range and carried on. I stopped it and took a cold copy of server/db (a 528 KB state.db, a 4.1 MB state.db-wal and the -shm file) and server/token. v1.37.1+k3s1 on the same data directory with the same flags exited after 3.7 s: cannot use public IP 127.0.0.1 with endpoint reconciler. The Kubernetes 1.37.0 changelog lists the change: kube-apiserver now validates --advertise-address for the endpoint reconciler (PR 138102). With the box’s private address instead, v1.37.1 was Ready in 2.9 s with every object and the Secret’s value intact.
k3s SQLite restores. Three restores into fresh data directories, all with v1.37.1 from the v1.36.5 copy:
- Database without the token: exited after 1.1 s with
bootstrap data already found and encrypted with different token. - Database plus token, no TLS directory: Ready in 2.9 s, all objects and the Secret’s value present, and the CA certificate identical to the original (k3s rebuilt it from the datastore).
state.dbplus token, without-waland-shm: Ready in 2.9 s, but theyard-gateConfigMap, Secret and Deployment were missing. Reading copies with Python’ssqlite3showed 331 Kine rows with the WAL and 233 without. Nothing in the startup said that data was missing.
k3s with embedded etcd, snapshot and reset. v1.37.1 with --cluster-init was Ready in 7.3 s and used 392 to 460 MiB RSS; the etcd directory took 123 MB on disk. My first two snapshot attempts failed because of my flags (the command defaults to port 6443, and the flag is --etcd-server, not --server). The third saved a 716,832-byte snapshot in 0.2 s. I then created a new ConfigMap and deleted the Secret, stopped the server and ran:
k3s server --data-dir /srv/k3s-etcd --cluster-reset \
--cluster-reset-restore-path=/srv/k3s-etcd/server/db/snapshots/drill50-<node>-<timestamp>
The reset took 6.0 s, moved the old database to etcd-old-<timestamp> and printed Managed etcd cluster membership has been reset, restart without --cluster-reset flag now. After a normal start (Ready in 7.2 s) the Secret was back and the newer ConfigMap was gone, as expected. The same snapshot on a new, empty data directory was refused immediately (server/token does not exist, please pass --token to complete the restoration); with --token it restored and came up Ready in 4.8 s with every object.
k0s backup and restore. A v1.36.4+k0s.1 controller (default etcd, API on the private address with onlyBindToAddress, non-default ports) was Ready in 4.6 s. About 25 s after seeding it used about 730 MiB across seven processes, the largest being kube-apiserver (277 MiB), k0s itself (116 and 84 MiB) and kube-controller-manager (106 MiB). k0s backup took 0.1 s and wrote a 150,050-byte archive with 53 entries: etcd-snapshot.db, the PKI directory including ca.key, etcd/ca.key and sa.key, the manifests and k0s.yaml. It was owned by root with mode 0644. After I changed objects, k0s restore into the same data directory refused (data-dir ... /etcd not empty). Into a fresh directory it took 0.1 s, and the restored controller was Ready in 3.9 s with the Secret back, the newer ConfigMap gone and the same CA certificate.
Talos Linux 1.14.4. QEMU 10.0.13 with KVM hung on this nested VM, so I ran Talos under software emulation (TCG), with 2 vCPU, 3 GiB RAM, a 12 GiB disk and user-mode networking. Times below are therefore not meaningful for real hardware. The metal image reached the maintenance API in about 2 minutes. I generated a secrets bundle and machine configs with talosctl gen; my first apply-config was rejected because of a config patch I wrote, and the regenerated config applied cleanly. etcd, kubelet and trustd then waited for time sync, because NTP could not get out of QEMU’s user networking here, so I disabled time sync for the drill only. Bootstrap at 10:55 PM, etcd Running 41 s later, and the Kubernetes API (v1.37.1) ready at 10:59 PM. Applying the seed printed a Pod Security warning for the restricted level, as the default config intends. talosctl etcd snapshot saved 438,304 bytes (revision 311, 257 keys) in 1.7 s. The node reported 676 MB used of 2,953 MB, with etcd at about 51 MB and kubelet at about 90 MB resident. /var was the EPHEMERAL partition (XFS on vda5); the root filesystem is the read-only image, as the docs describe.
What this box could not test: multi-node clusters, worker nodes and real pods (no workload ran anywhere), Talos on KVM or real hardware, the Talos recovery itself (wiping EPHEMERAL or booting a replacement VM was stopped by an automatic safety review on this shared box, so bootstrap --recover-from was not run), Talos and k0s upgrades, k3s agents and system-upgrade-controller, MicroK8s, RKE2, external datastores, S3 snapshot upload, power-cut behaviour and load. All k3s and k0s processes were stopped by about 10:42 PM IST and the Talos VM by about 11:00 PM IST. I kept the scripts and raw logs from each run with my notes.
Unlearn
- Unlearn that a lightweight distribution means less to operate.
- Unlearn that a SQLite file is the whole database.
- Unlearn that a snapshot alone is a backup.
- Unlearn that “conformant” says anything about patch speed.
- Unlearn that a cluster that starts after an upgrade was configured correctly before it.
Re-learn
- Re-learn the four promises: state, patches, upgrades, access.
- Re-learn the version skew policy and your distribution’s channel rules.
- Re-learn what your backup contains, including keys and tokens.
- Re-learn who patches the kernel under your nodes.
- Re-learn your restore on a clean machine, every month.
Closing
Lightweight Kubernetes in 2026 is less about megabytes and more about who owns which promise. k3s 1.37.1 gives you one binary, SQLite or etcd, and the fastest patch rhythm of the three, with a backup that only works if the token travels with it. k0s 1.36.4 gives you clean controller and worker roles and tidy backup commands, but is behind upstream today. Talos Linux 1.14.4 gives you an OS with no SSH and no shell that ships its own kernel fixes, in exchange for an API-only way of working and a short documented support window per line. In the posts on Kubernetes autoscaling and admission policy, the cluster was a given. Here it is the thing you have to rebuild at a yard gate during a power cut. Learn the four promises. Unlearn “it is just one binary”. Re-learn your restore. Practise it. Apply it before you stand up another small cluster.
Sources
k3s
- k3s-io/k3s on GitHub
- k3s v1.37.1+k3s1 release notes
- k3s v1.36.5+k3s1 release
- k3s release channels
- k3s cluster datastore
- k3s backup and restore
- k3s etcd-snapshot
- k3s manual upgrades
- k3s automated upgrades
- k3s requirements
- k3s LICENSE (Apache 2.0)
- k3s MAINTAINERS
- k3s at CNCF
k0s
- k0sproject/k0s on GitHub
- k0s v1.36.4+k0s.1 release
- k0s releases and support model
- k0s architecture
- k0s configuration (storage)
- k0s backup and restore
- k0s upgrade
- k0s Autopilot
- k0s system requirements
- k0s LICENSE
- k0s maintainer roster
- k0s at CNCF
- Mirantis announces k0s (2020)
Talos Linux
- siderolabs/talos on GitHub
- Talos 1.14.4 release
- Talos 1.14.3 release
- Talos support matrix
- Talos system requirements
- Talos philosophy
- Talos disaster recovery
- Upgrading Talos Linux
- Upgrading Kubernetes on Talos
- Pod Security on Talos
- Talos LICENSE (MPL 2.0)
- Omni LICENSE (BSL 1.1)
Upstream Kubernetes and CNCF
- Kubernetes releases
- Kubernetes version skew policy
- Kubernetes release schedule data
- Kubernetes 1.37 changelog
- kube-apiserver advertise address validation (PR 138102)
- CNCF conformance results for v1.37
MicroK8s and RKE2
- MicroK8s release notes
- canonical/microk8s on GitHub
- RKE2 introduction
- RKE2 requirements
- RKE2 v1.37.1+rke2r1 release
- SUSE completes acquisition of Rancher Labs (2020)
Security records
- k3s security advisories
- k3s GHSA-jxr7-mqhw-9p98
- CVE-2026-54250 on cve.org
- k0s GHSA-qjgc-wmg7-3jc3
- Talos security advisories
- Talos GHSA-rjwj-368c-f82r
- Talos GHSA-m38g-vww2-mvgx (copy.fail)
- CVE-2026-31431 on cve.org
- CVE-2026-77564 on cve.org
- Talos GHSA-86hr-pw4f-vmcq
Internal
Releted Posts
Kubernetes secrets delivery in 2026: revisit External Secrets Operator, Sealed Secrets and SOPS before you commit another Secret YAML
Picture a platform team in Jaipur that runs a multi-tenant SaaS product on Kubernetes across Rajasthan and Delhi NCR (an invented example, not a real client).
Read moreContainer registries in 2026: revisit Harbor, Zot and CNCF Distribution before you push another image
Picture a product engineering team in Bengaluru that runs about forty microservices on Kubernetes for a B2B payments product used by NBFCs across Karnataka and Maharashtra (an invented example, not a real client).
Read moreSelf-hosted Git forges in 2026: revisit Gitea, Forgejo and GitLab CE before you move another repository
Picture a software company in Kochi that builds billing and export-documentation software for seafood exporters in Aroor, Alappuzha, Kollam and Thoothukudi (an invented example, not a real client).
Read more