Overview
One binary, one payload
The release artifact is a single executable with a ZIP payload appended to it:
stratum = ELF (supervisor + operator)
└── payload
├── bin/ component binaries (kubelet, containerd, …)
└── images/ OCI archive: control-plane + add-on images
stratum stage unpacks the payload to /var/lib/stratum. Nothing is fetched. The
images are imported into containerd on first start, which is why a cluster reaches
Ready with no registry reachable.
Static pods for the control plane, a supervisor for the rest
The control plane — etcd, kube-apiserver, kube-controller-manager,
kube-scheduler, and kube-vip when a VIP is configured — runs as
kubelet-managed static pods, rendered by stratum into
/var/lib/stratum/config/manifests/. It is visible as mirror pods in
kubectl get pods -n kube-system and supervised by the same kubelet machinery
as every workload.
What has to be a host process — containerd, kubelet, and the operator — runs as
a child process of the running stratum command, restarted with backoff and
driven through a root-only control socket at /run/stratum/stratum.sock
speaking restart/stop/start/status.
Systemd has one job: starting stratum up again after a reboot. stratum up
installs and enables a single unit, /etc/systemd/system/stratum.service. From
there the chain restarts itself: systemd starts the supervisor, the supervisor
starts kubelet, and kubelet starts the static pods. There is no unit per
component, because the supervisor already restarts them.
That split has consequences worth knowing:
- Manifests are rendered on every start. stratum is the sole writer of the manifest directory: the flags a component runs with are generated from config each time, hand-edits are overwritten, and nothing drifts between what is configured and what is running.
stratum hardening checkaudits those rendered manifests — it reads what kubelet actually runs, not a template of what it should have been.- Cert rotation, snapshot restore and node upgrades bounce control-plane components by re-rendering their manifests (kubelet recreates the pod on content change), and host processes through the socket — one component at a time, without restarting the node's control plane.
One node model
stratum up runs the hyperconverged default: the node runs the control
plane as kubelet-managed static pods and schedules workloads. Every node runs
kubelet and containerd; the control plane is visible as mirror pods in
kubectl get pods -n kube-system.
stratum up --worker runs a workload-only node that joins an existing
cluster and carries no control plane.
Operators who want a dedicated (non-schedulable) control-plane node taint it themselves:
kubectl taint nodes <node> node-role.kubernetes.io/control-plane:NoSchedule
Configuration and state
Two files, with different jobs:
| Path | What it is |
|---|---|
/etc/stratum/config.yaml | the declarative ClusterConfig — network CIDRs, VIP, storage, CIS profile, snapshots, operator toggle. Strictly parsed: a misspelled key fails rather than silently doing nothing. |
/var/lib/stratum/config/node.yaml | the persisted NodeState — role, addresses, etcd membership. Written at bring-up, patched by rejoin and restore. |
Component flags are generated from these two.
Cluster formation
# the first control-plane node
stratum up [--config /etc/stratum/config.yaml]
# mint a join token on that controller
stratum token create
# a workload-only node
stratum up --worker --server https://<vip-or-controller>:6443 \
--token <token> --discovery-token-ca-cert-hash sha256:<pin>
# an additional control-plane node, for HA
stratum token create --control-plane # writes the certificate key to a 0600 file, prints its path
stratum up --join https://<vip>:6443 \
--token <token> --discovery-token-ca-cert-hash sha256:<pin> \
--certificate-key-file <path> # copy the key file from the first controller
Workers TLS-bootstrap their certificates; the operator approves a join only for a node name not already registered, and serving certificates only for addresses the node owns. Joining controllers download the shared CA material over an encrypted channel and join etcd live.
Both join paths authenticate the cluster before trusting it: the CA a joining node receives is verified against a signature over the discovery document and against the hash printed in the join command. A join that cannot verify both fails rather than proceeding.
What is deliberately not here
- An SSH fleet-provisioning CLI.
stratum upgrade --clusterperforms rolling upgrades over the Kubernetes API with the skew rules encoded; provisioning machines from zero over SSH is left to the tools that already do it. - A second CNI, kube-proxy, or a SQL datastore. One dataplane, one datastore.
- A fleet manager. The dashboard shows one cluster — the one serving it — and the binary deploys it with the cluster, from an image in the payload. Managing many clusters from one pane is not part of the engine; it is what Stratum PRO adds, on top of this same engine rather than instead of it.