1- # kube-bind v2 Extended: Backend API, CLI, UI
1+ # kbind v2 Extended: Backend API, CLI, UI
22
33* Status: ** DRAFT — for iteration**
44* Authors: @mjudeikis
88## Summary
99
1010The v2 core contract is up for discussion: a binding is one ` kubectl apply ` of a Secret +
11- ` Connection ` + bindings, consumed by the konnector, with zero kube-bind components on
11+ ` Connection ` + bindings, consumed by the konnector, with zero kbind components on
1212the provider. This proposal designs everything * around* that contract — the optional
1313service layer that answers the questions the core deliberately doesn't:
1414
@@ -64,11 +64,11 @@ Raw discovery already exists in core (`Connection.status.exportedAPIs` from labe
6464CRDs / the workspace boundary). The catalog adds ** curation** : human-facing metadata
6565and sensible defaults that turn "a list of CRD names" into "a service you'd choose".
6666
67- Group: ` catalog.kube-bind.io ` . Two kinds, successors of v1's
67+ Group: ` catalog.kbind.dev ` . Two kinds, successors of v1's
6868` APIServiceExportTemplate ` and ` Collection ` :
6969
7070``` yaml
71- apiVersion : catalog.kube-bind.io /v1alpha1
71+ apiVersion : catalog.kbind.dev /v1alpha1
7272kind : Export # one offering
7373metadata :
7474 name : mangodb
9393` ` `
9494
9595` ` ` yaml
96- apiVersion : catalog.kube-bind.io /v1alpha1
96+ apiVersion : catalog.kbind.dev /v1alpha1
9797kind : Collection # grouping for UI/CLI browsing
9898metadata :
9999 name : databases
@@ -135,7 +135,7 @@ distribution, which wires its own implementation against the same interface.
135135 revisitable without API change (the bundle's Secret is replaceable; a bounded-token +
136136 reissue mode can be added later behind the same interface). Revocation = delete the
137137 ` Grant` → issuer deletes the SA/token.
138- * Records issuance in **`Grant`** (`iam.kube-bind.io ` — an issuance/identity record, not
138+ * Records issuance in **`Grant`** (`iam.kbind.dev ` — an issuance/identity record, not
139139 catalog presentation) : " identity X was issued credentials Y for export Z" . The anchor
140140 for revocation, audit, and the reaper.
141141
@@ -195,7 +195,7 @@ equivalent), so the reaper ships only once the konnector actually maintains the
195195until then dead-consumer GC is manual.
196196
197197* Lease expired beyond TTL → mark the issuance stale → (configurably) revoke
198- credentials, then delete kube-bind -created namespaces and synced objects.
198+ credentials, then delete kbind -created namespaces and synced objects.
199199* TTLs and the destructive step are opt-in and conservative by default (revoke ≠
200200 delete; deletion requires explicit enablement).
201201
@@ -206,12 +206,15 @@ Thin client over the gateway; everything it does is reproducible by hand:
206206` ` ` sh
207207kubectl bind login https://mangodb.example.com # auth, cache token
208208kubectl bind catalog # list Exports/Collections
209- kubectl bind mangodb # bind an Export:
209+ kubectl bind export mangodb # bind an Export:
210210 # POST /api/bind → bundle
211211 # → kubectl apply (or -o yaml)
212- kubectl bind mangodb -o yaml > binding.yaml # GitOps mode: print, don't apply
212+ kubectl bind export mangodb -o yaml > binding.yaml # GitOps mode: print, don't apply
213213` ` `
214214
215+ * Every CLI action is an explicit subcommand (`login`, `catalog`, `export`); export
216+ names never occupy the subcommand slot — `kubectl bind export mangodb`, not
217+ ` kubectl bind mangodb` — so command names and export names cannot collide.
215218* `--install-konnector` (default on for interactive use) installs/upgrades the v2
216219 konnector, as v1 did.
217220* The CLI never creates bespoke objects — it applies the gateway's bundle verbatim.
@@ -223,8 +226,8 @@ kubectl bind mangodb -o yaml > binding.yaml # GitOps mode: print, don'
223226
224227Browse catalog → authenticate → bind → then either :
225228
226- * **download the bundle** (via the one-time pickup URL) / copy a `kubectl bind`
227- one-liner, or
229+ * **download the bundle** (via the one-time pickup URL) / copy a
230+ ` kubectl bind export ` one-liner, or
228231* **browser-apply** (v1's UI-only flow, roadmap # 406, kept): the user supplies a
229232 consumer-cluster kubeconfig (or the UI runs in-platform where one is already held),
230233 and the gateway's `/api/apply` applies the bundle and installs the konnector into the
@@ -253,11 +256,11 @@ remains separate, providing its own issuer implementation behind the same interf
253256
254257# # Decided
255258
256- * **Packaging**: one `kube-bind -backend` binary; gateway/issuer/reaper/apply are module
259+ * **Packaging**: one `kbind -backend` binary; gateway/issuer/reaper/apply are module
257260 flags, boundaries kept as Go packages.
258- * **Issuance anchor**: `Grant` in `iam.kube-bind.io ` — the typed record of
261+ * **Issuance anchor**: `Grant` in `iam.kbind.dev ` — the typed record of
259262 " identity X was issued credentials Y for export Z" ; anchor for revocation, audit,
260- reaper. Kept out of `catalog.kube-bind.io ` so that group stays purely presentation+defaults.
263+ reaper. Kept out of `catalog.kbind.dev ` so that group stays purely presentation+defaults.
261264* **Credentials**: long-lived secret-based SA token (v1 behavior) — zero rotation
262265 friction accepted over security posture; revocation via `Grant` deletion; bounded
263266 tokens addable later behind the same issuer interface without API change.
@@ -273,6 +276,9 @@ remains separate, providing its own issuer implementation behind the same interf
273276 is an explicitly accepted trade-off when enabled.
274277* **Federation**: one gateway = one provider; cross-provider aggregation is a future
275278 layer above the bundle protocol.
279+ * **CLI verb structure**: every action is an explicit subcommand; binding an export is
280+ ` kubectl bind export <name>` , never a bare `kubectl bind <name>` — export names and
281+ command names must not share a namespace (review feedback, @sttts).
276282
277283# # Open questions
278284
0 commit comments