Skip to content

docs: ADR 0010 — node → controller inventory channel - #20

Merged
kfeofantov merged 1 commit into
mainfrom
docs/adr-0010-node-controller-channel
Aug 10, 2026
Merged

kfeofantov merged 1 commit into
mainfrom
docs/adr-0010-node-controller-channel

Conversation

@kfeofantov

Copy link
Copy Markdown
Contributor

What

Slice 1 of delivering the node role's Go-binary inventory to the controller and turning it into a payload. This PR is docs only: ADR 0010, the architecture checkpoint for the channel.

The decision

  • Node initiates; controller receives. Node POSTs already-filtered scan facts to the controller's in-cluster HTTP receiver. The response is ack/error only — no control channel back (ADR 0001 applied one level down).
  • Auth = projected controller-audience SA token. Kubelet-issued, rotated, tmpfs, nothing persisted on the node (realizes ADR 0008 §4). It is not an API credential: the node still cannot reach the API server (wrong audience) and keeps zero RBAC (ADR 0009 intact).
  • Local JWKS validation, no TokenReview. The controller verifies the token itself against the cluster JWKS — no create tokenreviews, so no new RBAC verb.
  • Plain HTTP, with the confidentiality tradeoff stated honestly and the blast radius bounded to one-cluster data-poisoning (one-way, no monetary fields).
  • In-memory join against PodWatcher → per-(namespace, workload, container) inventory; loss-harmless (ADR 0003).

Follow-up slices (plan approved)

  1. internal/nodeauth token-verify library + unit tests
    3a. node client + controller receiver + node manifest token volume + security.md
    3b. join + go_inventory payload + golden + coverage counters
  2. full-path e2e in kind (assert on controller spool)

security.md is updated in the slices that land the behavior (3a/3b), per the same-PR rule.

🤖 Generated with Claude Code

… auth, local JWKS)

Records the decision for delivering the node role's Go-binary findings to the
controller: node-initiated HTTP push of already-filtered facts, authenticated
with a projected controller-audience ServiceAccount token and validated locally
against the cluster JWKS (no TokenReview, so no new RBAC verb). The node keeps
zero RBAC and cannot reach the API server (wrong audience and no grant); nothing
is persisted on the node. Plain HTTP is chosen with the confidentiality tradeoff
stated and the blast radius bounded (ADR 0008). The controller joins facts
against PodWatcher into a per-(namespace, workload, container) inventory in
memory, preserving the loss-harmless property (ADR 0003).

Realizes the promise in ADR 0008 §4 and extends ADR 0009's log-only scope.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@kfeofantov
kfeofantov merged commit 94e74f7 into main Aug 10, 2026
3 checks passed
@kfeofantov
kfeofantov deleted the docs/adr-0010-node-controller-channel branch August 10, 2026 16:34
Sign up for free to 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