k3sm licensed apache-2.0 (DCO)

Tutorials

A ladder from your first native Pod to the things k3sm will not do, with any unfinished step marked in progress or planned.


Twelve short walk-throughs, in order. The first six cover the single-node basics: install a node, run a Pod, front it with a Service, give it storage, probe it, and give it stable identity. The next five cover paths that ship with known limits (a second Mac, Linux images in a VM, building and loading images, MLX serving), and each one says where it stops. The last one runs a Linux-only binary on the native path, which fails, and then explains the reason and the workaround.

Every command on these pages works unless it is marked otherwise. A capability that is not finished carries a status badge, in progress or planned, and is written in the future tense.

Before You Start#

  • k3sm needs Apple Silicon and macOS 26 or newer. It runs Pods as native arm64 Darwin processes. There is no x86_64 Mac path and no VM in the default path.
  • Releases are published, and the install script installs the newest one. They are pre-release builds, ad-hoc signed and not notarized. The first tutorial installs a node, and the rest of each tutorial assumes one.
  • Read limitations early. It is the inventory of what diverges and why.

Ladder#

tutorialwhat you end up with
1first poda node, a Pod, and that Pod visible in ps as a real process
2deployments and servicesa Deployment behind a ClusterIP you can curl
3nodeportthat Service reachable from the Mac itself
4storagea PVC bound to a local-path PV that survives the Pod
5probesliveness and readiness driving restarts and endpoints
6statefulsetstable per-replica identity and a headless Service
7two macsa second Mac joined over the wireguard mesh, on an experimental path
8linux workloads and the vm runtimeclassa linux/arm64 image booted in its own micro-VM, and where the path still stops
9building an imagean OCI image built from a COPY-only Dockerfile
10loading an imagethat image recorded in the node’s image store
11serving a model with mlxhow MLX serving works, and what your own Mac needs to try it
12what will not worka Linux binary failing, explained, with the documented way out

Manifests#

Each tutorial shows its manifest inline. The same manifests ship in the k3sm repository under examples/, with longer commentary in the comments:

hello-native.yaml, deployment-native.yaml, service-clusterip.yaml, service-nodeport.yaml, probes.yaml, statefulset-local-path.yaml.

Two Fields Every Pod Needs#

They appear in every manifest on every page, and a Pod without them does not run:

  • nodeSelector: kubernetes.io/os: darwin. A validating admission policy rejects any Pod that does not declare it, so kubectl apply fails and nothing is created.
  • a toleration for the k3sm.io/provider:NoSchedule taint. Every k3sm node carries it. Without a matching toleration the Pod is admitted and then sits Pending forever. Only DaemonSet-owned Pods get it injected, so a Deployment, StatefulSet, or Job template has to carry it itself.

Keep the toleration keyed on k3sm.io/provider rather than a blanket operator: Exists. A blanket toleration also tolerates node.kubernetes.io/not-ready, which keeps a Pod bound to a node that has stopped working.