Device and far edge
Industrial gateways, sensor aggregators, remote monitoring. Connectivity is intermittent and RAM is measured in megabytes.
Anywhere you run Docker or Podman, run Kubernetes instead. KubeSolo strips out everything that only exists for multi-node clusters and keeps the full Kubernetes API.
$curl -sfL https://get.kubesolo.io | sudo sh -
$ pstree kubesolo kubesolo─┬─kube-apiserver ├─controller-manager ├─kubelet ├─kube-proxy ├─nodesetter # replaces scheduler ├─kine──sqlite # replaces etcd ├─containerd──crun └─coredns # removed, not disabledetcdkube-schedulerleader-electionoverlay-networkingcontrol-plane-ha$ kubectl get nodes NAME STATUS VERSION rpi-gate Ready v1.35.7+kubesolo-v1.2.1
Anywhere one node is the whole deployment, and a cluster would be overhead you never use.
Industrial gateways, sensor aggregators, remote monitoring. Connectivity is intermittent and RAM is measured in megabytes.
Air-gapped ISA-95 workloads. The offline build embeds KubeSolo's system images, so it installs and runs with no cloud connection.
Raspberry Pis, ARM SBCs and embedded Linux boxes that ran Docker Compose. Upgrade the runtime, not the hardware.
Native on Linux with no VM. On macOS and Windows (WSL2), kubesoloctl runs it in a container on Docker.
Small offices, retail, field deployments. One node per site, run the same way as the rest of the fleet.
Terminals, digital signage, point-of-sale. Managed containers on locked-down hardware.
The same image runs unchanged. What you gain is the Kubernetes API around it.
$ docker run -d --name web \ --restart unless-stopped \ -p 8080:80 \ nginx:1.27
apiVersion: apps/v1 kind: Deployment metadata: name: web spec: selector: matchLabels: {app: web} template: metadata: labels: {app: web} spec: containers: - name: web image: nginx:1.27 # same image ports: [{containerPort: 80}] livenessProbe: httpGet: {path: /, port: 80} resources: limits: {memory: 128Mi} --- apiVersion: v1 kind: Service metadata: name: web spec: type: LoadBalancer # node IP, like -p selector: {app: web} ports: [{port: 8080, targetPort: 80}]
K3s and MicroK8s slim down a multi-node design. KubeSolo starts from one node.
| Capability | KubeSolo | K3s | MicroK8s | Docker / Podman |
|---|---|---|---|---|
| Full Kubernetes API | yes | yes | yes | no |
| RAM footprint <200 MB | yes | partly | no | yes |
| Single-node design | yes | partly | partly | yes |
| x86_64, ARM64, ARMv7, RISC-V 64 | yes | yes | yes | yes |
| Flash / constrained storage | yes | partly | no | partly |
| Helm & CRDs | yes | yes | yes | no |
| No etcd, no quorum | yes | yes | no | yes |
| Air-gapped install | yes | yes | partly | yes |
| OCI images | yes | yes | yes | yes |
One command on Linux. kubesoloctl on macOS and Windows (WSL2).
Installs the binary, writes /etc/kubesolo/config.yaml and starts KubeSolo under your init system (systemd, OpenRC, SysV, s6, runit or upstart). The installer stops if Docker is present.
$ curl -sfL https://get.kubesolo.io | sudo sh -On macOS or Windows (WSL2), download kubesoloctl from the releases page and run KubeSolo in a container. This needs Docker Desktop or Docker Engine.
$ kubesoloctl install --run-mode=containerThe installer merges the admin kubeconfig into ~/.kube/config if kubectl is on the node. From another machine, copy /var/lib/kubesolo/.
$ kubectl config use-context kubernetes-admin@kubesolo $ kubectl get nodes # one node, Ready
The Mosquitto example from the repo:
$ kubectl apply -f https://raw.githubusercontent.com/portainer/kubesolo/develop/examples/mosquitto.yaml $ kubectl get all -n mosquitto
Running many nodes? Portainer's Edge Agent connects a KubeSolo fleet to one control plane for GitOps deployments, RBAC and remote lifecycle management.
portainer.io →