docs(adr): oabctl Kubernetes backend#1181
Conversation
Specifies how oabctl gains a K8s backend using the same oab.dev/v1
OABService spec as ECS, and the path to replacing the Helm chart.
- Platform-agnostic core spec + platform.{ecs,k8s} overlays
- Provisioner trait abstraction (EcsProvisioner / K8sProvisioner)
- Client-side render-and-apply first; CRD+operator deferred
- Lifecycle parity with Helm (install/upgrade/uninstall/rollback/history)
- Phased plan K0-K4, risks, and migration from Helm
The first draft was written against a stale feat/unified-binary-workspace copy of manifest.rs (flat oab.dev/v1 spec). main is already oab.dev/v2 with a Runtime enum (Ecs|Kubernetes), an existing KubernetesRuntime stub, and the K8s path explicitly stubbed in apply.rs/create.rs as 'not yet implemented'. Rewrite to reflect that the schema refactor is already done; the real scope is implementing the stubbed Runtime::Kubernetes branch. Fold in review findings: keep runtime enum (target inference, no --target), keep configFrom + HashMap secrets (ARN-prefix inference), generation handled internally per provisioner, hardcode replicas=1, add PVC storage_size, grow Provisioner trait (status/logs), K8s Secret Injection Contract + --set denylist + secret-not-in-ConfigMap guard, ESO preflight, operator CI gate. Correct the false 'Helm uses ExternalSecrets' premise (it uses native Secrets).
|
LGTM ✅ — A correct, well-scoped Proposed ADR for the What This PR DoesAdds a single docs-only ADR ( How It Works
Findings
Finding Details🟢 F1: Claims verified against
|
What problem does this solve?
OpenAB has two parallel deployment paths that do not share tooling or schema: Helm charts for Kubernetes, and
oabctl(+ S3 control plane) for ECS Fargate. We want one tool and one spec to deploy to both runtimes, and foroabctlto eventually replace the Helm chart as the recommended K8s path.This ADR turns the ECS Control Plane ADR's multi-runtime intent (§4 + Phase 3) into a concrete design for an
oabctlKubernetes backend.Discord Discussion URL: discussed in the maintainer Discord thread with @pahud.hsieh (discussion check is skipped for the maintainer bot account; no public URL minted).
At a Glance
Prior Art & Industry Research
Not applicable — this is a docs/ADR-only change (no runtime code). Cross-runtime prior art is captured inline in the ADR's "Alternatives Considered" section (Helm client-render-and-apply model,
kubectl applyserver-side-apply semantics, and the CRD+operator pattern). Deeper OpenClaw/Hermes research will accompany the implementation PR (Phase K0/K1), not this design doc.Proposed Solution
Add a Kubernetes backend to
oabctlconsuming the sameoab.dev/v1OABService manifest as ECS:platform.ecs/platform.k8soverlays, with target-aware validation (today's spec is ECS-coupled —validate()hard-requires subnets/securityGroups — so the schema refactor is Step 1, with a backward-compat shim).Provisionertrait (EcsProvisioner/K8sProvisioner) sharing manifest loading, validation, generation tracking, andrender_config_toml().kubectl apply); in-cluster CRD + operator deferred to a later phase.apply(install+upgrade),delete(uninstall), plus newtemplate/rollback/history/--set.Phased plan K0–K4 with a risk register and Helm migration path is in the doc.
Why this approach?
Client-render-first is the honest 1:1 Helm replacement: Helm is also client-render-and-apply, so this requires zero in-cluster install, reuses existing rendering code, and unblocks Helm deprecation fastest. CRD+operator (GitOps/self-healing) is valuable but a much larger lift and is not required for parity, so it is deferred.
Alternatives Considered
Captured in the ADR (§11): keep Helm+oabctl split (two specs), shell out to
helm/kubectl(loses typed validation), CRD-first (too large, blocks deprecation), static YAML forkubectl apply(no lifecycle — a downgrade from Helm).Validation
Docs-only changes:
PR Discussion URL Checkpasses