5.2 KiB
Kubernetes Flavor Decision
Decision: k3s (confirmed)
k3s is the best fit for Lab. OpenShift and most other flavors conflict with the puppet-managed, multi-arch, lightweight approach.
Evaluation
| Flavor | Puppet-Friendly | ARM | Multi-arch | Enterprise | License | Verdict |
|---|---|---|---|---|---|---|
| k3s | ✓ binary + config files | ✓ | ✓ | Rancher/SUSE | Apache 2.0 | CHOSEN |
| k0s | ✓ single binary, config-driven | ✓ | ✓ | Mirantis | Apache 2.0 | Good alternative |
| kubeadm | ✓ well-understood bootstrap | ✓ | ✓ | Upstream K8s | Apache 2.0 | Viable but heavier |
| RKE2 | ✓ config files | ✓ | ✓ | Rancher/SUSE | Apache 2.0 | Heavier k3s |
| OpenShift | ✗ operator-driven, fights puppet | ✗ limited | ✗ limited | Red Hat | Proprietary | REJECTED |
| MicroK8s | ⚠ snap-based, puppet+snaps awkward | ✓ | ✓ | Canonical | Apache 2.0 | Not great |
| Talos | ✗ immutable OS, no SSH, no puppet | ✓ | ✓ | Sidero Labs | MPL 2.0 | Incompatible |
Why NOT OpenShift — Deep Analysis
OpenShift Does Overlap With Lab
OpenShift is the closest existing thing to what Lab does. The overlap is real:
| Capability | OpenShift | Lab |
|---|---|---|
| Manages nodes end-to-end | Yes (RHCOS + MCO) | Yes (OpenVox + labels) |
| Immutable infrastructure | Yes (rpm-ostree, operator-driven) | Yes (puppet convergence) |
| Fights config drift | Yes (operators reconcile) | Yes (puppet + sync pillar) |
| Built-in monitoring | Yes (Prometheus + Alertmanager bundled) | Yes (health aggregator) |
| Built-in secrets | Yes (etcd-encrypted secrets) | Yes (secret store + local cache) |
| Certificate management | Yes (internal CA, auto-rotation) | Yes (identity layer) |
| Node lifecycle | Yes (MachineSet, MachinePools) | Yes (onboard, labels, providers) |
| Self-managing | Yes (operators update themselves) | Yes (lab manages itself) |
Why OpenShift Still Doesn't Fit
1. Single OS — OpenShift control plane = RHCOS only. Can't run on Apple Silicon, Asahi Linux, or any non-RHCOS system. Lab needs Ubuntu, Debian, Fedora, AlmaLinux, XCP-ng, VyOS across x86 and ARM.
2. K8s only — OpenShift manages k8s nodes. Lab manages everything: k8s nodes, standalone VMs, bare metal hypervisors, network appliances, physical servers that will never run k8s. Not everything is a container.
3. Single cluster scope — OpenShift manages one cluster. Lab manages homelab k3s + enterprise AWS EKS + XCP-ng hypervisors + bare metal + OVH vRack. Cross-provider, cross-cluster.
4. Fights puppet — OpenShift has ~30+ operators that each own a piece of the system. If puppet changes kubelet config, the Machine Config Operator detects "drift" and reverts it. Two reconciliation loops fighting each other, possibly rebooting nodes in a loop. You're supposed to change everything via CRDs, not external tools.
5. No XCP-ng/hypervisor management — Can't provision VMs on XCP-ng, manage Xen hosts, or understand hypervisors that aren't VMware/OpenStack.
6. Throws away puppet modules — Company has existing puppet modules. OpenShift's model is operators, not puppet. Complete rewrite of config management.
7. Heavyweight — Minimum 6 nodes, 88GB RAM just for the platform. k3s uses 512MB. Our entire homelab is 5 nodes, 320GB RAM.
8. ARM limited — RHCOS on Apple Silicon doesn't exist. ARM support is limited to AWS Graviton and some server ARM platforms.
The Scope Difference
OpenShift: "I am your platform. Everything runs in me. I control the OS."
Scope: Kubernetes cluster + its nodes
Lab: "I manage your infrastructure. K8s is one thing I deploy."
Scope: Everything — VMs, bare metal, hypervisors, k8s,
network gear, containers, across any provider
Lab is closer to what OpenShift + Satellite + RHCOS + ACM (Advanced Cluster Management) do together — but unified, lighter, open source, and not locked to Red Hat's ecosystem.
Why k3s
- Puppet-friendly — it's just a binary and config files in
/etc/rancher/k3s/ - Ultra-light — runs on Mac Studio, ARM boxes, small VMs
- Multi-arch — native x86 and ARM
- Same K8s API as EKS/GKE — portable to cloud
- Single binary — trivial to manage with puppet
- Proven — CNCF certified, widely used in edge/IoT/homelab
k3s via Puppet (OpenVox)
# Label: k8s-server → puppet class
class kubernetes::server {
class { 'k3s::server':
token => lab::secret('k8s/cluster-token'),
cluster_init => true,
tls_san => [$facts['fqdn'], 'k8s.lab.internal'],
}
}
# Label: k8s-worker → puppet class
class kubernetes::worker {
class { 'k3s::worker':
server_url => 'https://k8s.lab.internal:6443',
token => lab::secret('k8s/cluster-token'),
}
}
Same puppet classes work on bare metal, XCP-ng VM, EC2 instance, any architecture.
k0s as Backup Option
If k3s ever becomes problematic, k0s is the closest alternative:
- Also single binary, config-driven, multi-arch
k0sctladds cluster management (bootstrap, upgrade, reset)- Mirantis backing (Lens, Docker EE)
- Worth monitoring but no reason to switch from k3s today