Skip to content

docs(adr): ADR-0002 — SourceOS as the sovereign Kubernetes substrate (Guix builds, OSTree delivers) - #12

Closed
mdheller wants to merge 1 commit into
mainfrom
docs/adr-0002-sovereign-k8s-substrate
Closed

docs(adr): ADR-0002 — SourceOS as the sovereign Kubernetes substrate (Guix builds, OSTree delivers)#12
mdheller wants to merge 1 commit into
mainfrom
docs/adr-0002-sovereign-k8s-substrate

Conversation

@mdheller

Copy link
Copy Markdown
Member

Decision

Rather than adopting OKD or Talos, blend both into SourceOS over the existing OSTree/cosa base, split into tiers so the two atomic-update mechanisms don't collide:

TierMechanismOwns
0 — base / deliveryOSTree + cosa (this repo)kernel, containerd/CRI, kubelet, pinned crypto module
1 — services / definitionGuix generations (SourceOS-Linux/source-os)managed OS services; declarative, reproducible, rollback
2 — platformArgoCD · OLM · Tekton · zot · gitea · Kyvernothe cluster

Guix builds; OSTree delivers. Katello continues to gate promotion (Library → dev → qa → prod) exactly as cosa/WIRING.md already documents.

From OKD: OLM + the Butane/MachineConfig lineage already in socios-ignition (butane/openshift/{master,worker}-minimal.bu).
From Talos: the posture — no SSH, no shell, day-2 config via API with signed receipts.
Kept: OSTree base, caps/ + guard-DSL + nft/ egress, PXE/live-USB installers, channels, and the Foreman/Katello + Tekton rollout lane.

Why not the off-the-shelf options

  • OKD runs on Fedora CoreOS, not RHCOS — the validated crypto module is precisely what the OpenShift subscription buys, so OKD-for-free gives OpenShift's shape without its FIPS posture.
  • Talos would discard the OSTree/cosa/Butane/Katello substrate already built here.
  • We already own the platform layer either would supply (ArgoCD, zot, Tekton, Kyverno, gitea). What's missing is operator lifecycle, cluster lifecycle, and node flavors — not a platform.

Honest limits recorded in the ADR

  • FIPS-compliant by construction (validated modules in approved mode) — not FIPS validated. A CMVP certificate cannot be self-issued.
  • The Tier-0 crypto pin is declared, not enforced, until the FCOS config in cosa/manifests/sourceos-workstation.yaml is vendored and its crypto packages overridden (that file's existing TODO).
  • cosa build needs /dev/kvm. The current GKE cluster is Autopilot (confirmed via warden-* webhooks) and cannot provide it — an independent argument for moving the build tier off Autopilot.
  • gitea Actions has never executed a job (action_runner / action_task both empty), so ordering is runner → image build → node flavor → CAPI.
  • Guix is MPL/GPL-family, outside the estate's MIT/Apache-only default — a deliberate, recorded exception for the OS tier.

Open questions (flagged, not decided)

  • Node flavor derives from FCOS (inherits hardening and crypto) or from a fully vendored manifest? FIPS pin argues the latter; maintenance cost the former.
  • CAPI provider purpose-built, or generic bootstrap over Ignition?
  • Which tier owns kubelet configuration? Recommendation in the ADR: binary in Tier 0, config via day-2.

Status is proposed — this is the decision record to argue with before implementation re-points the existing IaC.

Blend OKD's platform layer and Talos's immutable/API-driven posture over the
existing OSTree/cosa base, organised into tiers so the two atomic-update
mechanisms do not collide:
Tier 0 base/delivery = OSTree + cosa (kernel, CRI, kubelet, pinned crypto)
Tier 1 services/defn = Guix generations (declarative, reproducible, rollback)
Tier 2 platform = ArgoCD, OLM, Tekton, zot, gitea, Kyverno
Guix builds; OSTree delivers. Katello continues to gate promotion exactly as
cosa/WIRING.md already describes.
Records the honest limits rather than the aspiration:
- FIPS-compliant *by construction* (validated modules in approved mode), NOT
FIPS validated — a CMVP certificate cannot be self-issued.
- The Tier-0 crypto pin stays DECLARED, not enforced, until the FCOS config in
cosa/manifests/sourceos-workstation.yaml is vendored and its crypto packages
overridden (the file's existing TODO).
- cosa build requires /dev/kvm; the current GKE cluster is Autopilot and cannot
provide it, so the build tier must move off Autopilot.
- gitea Actions has never run a job, so ordering is runner -> image build ->
node flavor -> CAPI.
@mdheller

Copy link
Copy Markdown
MemberAuthor

Moving this to the sovereign SCM — landed as gitea PR #1 (code.socioprophet.ai/SociOS-Linux/SourceOS/pulls/1). Substrate decision records belong in gitea, not GitHub.

@mdhellermdheller closed this Aug 5, 2026
@mdheller
mdheller deleted the docs/adr-0002-sovereign-k8s-substrate branch August 5, 2026 02:05
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@mdheller