Both microk8s and k3s are in the lightweight Kubernetes space, trying to simplify the deployment of Kubernetes and able to do so in resource-constrained environments, such as edge and IoT and they support x86 and ARM architectures. Both are CNCF-certified and support a different K8s datastore than the default one (etcd), with MicroK8s supporting dqlite (distributed SQLite) and k3s supporting MySQL, Postgres and SQLite.
MicroK8s’ big differentiator is the fact it’s packaging all upstream K8s binaries in a snap package, providing security patching and upgrades out-of-the-box, while maintaining platform compatibility. K3s is a simple binary that doesn’t benefit from any specific packaging. During its early days, K3s removed some of the upstream alpha features and cloud providers binaries to reduce the footprint, whereas now they try to keep as much of the upstream as possible.
Another big difference is MicroK8s’ minimal-ops UX; everything can be done through a single command (no need to deal with helm and yaml config much) and everything that can be abstracted from the user, is. MicroK8s packages the most popular Kubernetes features for things such as networking, observability, GPU acceleration, etc. These can be enabled/disabled via the
microk8s [enable|disable] <feature> command.
k3s is a CNCF sandbox project, so that gives it some additional visibility. The k3s team did a great job in promoting production readiness from the very beginning (2018), whereas MicroK8s started as a developer-friendly Kubernetes distro, and only recently shifted gears towards a more production story, with self-healing High Availability being supported as of v1.19 (August 2020).