Get started
Run it on your cluster. About two minutes.
Everything you run is downloaded from this site and small enough to read before you run it. The collector is one Python file — standard library only, GET/LIST only, no secrets, no exec, no writes. It produces a single estate.json that renders entirely in your browser: nothing leaves your machine, and nothing is uploaded anywhere.
What you need
- Local path: python3 (3.9+, standard library only — no pip installs) and kubectl access to the cluster. Any role that can get/list nodes and pods produces a report; the optional sources below add depth.
- In-cluster path: Helm 3 and enough permission to create a namespace and a read-only ClusterRole.
Path A — from your laptop (fastest)
Four steps, copy-pasteable. The collector shells out to kubectl, so it sees exactly what your kubeconfig sees.
Download the collector
curl -fsSLO https://gpu.iversoncloud.com/iverson-collect.py
One file, served from this site. No installer, no dependencies.
Read it (optional, encouraged)
Open the file in your editor. It is the entire collector — read-only by construction: the only API operations in it are GET and LIST. No secrets are read, nothing is executed in your pods, nothing is written to the cluster. If your security review wants to audit it, this step is the audit.
Run it against your cluster
python3 iverson-collect.py --out estate.json
Uses your current kubectl context. Useful flags: --context NAME picks a different context, --name "my-cluster" labels the report, --unit auto|gpu|cpu sets the capacity unit (default auto), and --price N sets your $/unit-hour — until you supply one, every dollar figure is marked as estimated.
Render the report — in your browser
Open gpu.iversoncloud.com/report/live and drop estate.json on the page. The file is parsed and every number computed client-side; it is never uploaded. You can verify that claim in your browser's network tab while the report renders.
Path B — in-cluster Job (Helm)
Same single-file collector, run as a Kubernetes Job under a least-privilege ClusterRole. Use this when laptops don't get cluster credentials.
Install the chart from this site
helm install iverson-collector \ https://gpu.iversoncloud.com/charts/iverson-gpu-collector-0.1.0.tgz \ -n iverson --create-namespace
Optional values: --set-string clusterName=my-cluster (the name shown on the report), --set unit=gpu, --set price=2.10. The chart installs a Job, a ServiceAccount, and a get/list-only ClusterRole — the verbatim YAML is printed on /methodology so your platform team can review it before installing.
Wait for the Job, then collect its output
The chart's post-install notes print this; with the namespace above it is:
kubectl -n iverson wait --for=condition=complete job/iverson-collect --timeout=180s && \ kubectl -n iverson logs job/iverson-collect > estate.json
The Job log is pure JSON — that redirect is your estate.json. From here, step 4 of Path A applies unchanged: drop it on /report/live.
Optional sources
Each of these adds depth to the report. None is required — the table below states exactly what is missing without them, and the report's caveats say so out loud.
Facility map — the chain the cluster API cannot see
A one-page file from your facilities team maps nodes to rack/PDU/cooling and declares the parent chain (PDU → UPS → transformer) with feeds redundancy, ratedKw, and rideThroughMinutes.
python3 iverson-collect.py --topology topology.yaml --out estate.json
The template and full field reference are on /methodology; the fill-in sheet for facilities teams is topology-worksheet.md, and NetBox shops can convert an export directly with netbox_to_topology.py.
GPU telemetry (DCGM)
--dcgm auto (the default) discovers a dcgm-exporter service and reads its metrics through the API-server proxy — it needs services get/list plus services/proxy get, both included in the chart's RBAC.
python3 iverson-collect.py --dcgm auto --out estate.json
Measured economics instead of assumptions
Annotate pods with your measured checkpoint cadence and restart overhead, and label what is business-critical — every dollar figure states which basis it used.
metadata:
labels:
iverson.gpu/critical: "true"
annotations:
iverson.gpu/checkpoint-minutes: "30"
iverson.gpu/restart-minutes: "12"Curtailment power model
--watts-per-unit KW states the electrical draw per capacity unit, so shed planning runs on your figure instead of the report's stated default.
python3 iverson-collect.py --watts-per-unit 1.2 --out estate.json
What to do with estate.json
One file, four destinations. All of them run client-side on the same scoring code.
- /report/live — the full Exposure Report — findings, blast radii, capacity ledger, provenance caveats first.
- /simulator — upload the same file, then fail any domain — transformer, UPS, cooling loop — or plan a curtailment shed.
- /timeline — drop TWO snapshots, collected at different times, and see what changed between them.
- /report/live (several files) — drop multiple estate.json files at once and they merge over their shared facility topology — a cross-cluster view of one building.
What degrades when a source is missing
Defined, not discovered. When a source is absent the report disables the findings that depend on it and says so in the caveats — it never guesses.
| Missing | Effect (stated in the report's caveats) |
|---|---|
| metrics.k8s.io | (cpu-unit clusters) utilization is set conservatively high → idle findings are disabled, never guessed. |
| DCGM exporter | no measured GPU utilization / temperature / ECC / XID; whichever series the exporter doesn't publish stay disabled — named per-family in the caveats. |
| topology labels / file | exposure findings are limited to zone/host domains. |
| checkpoint cadence (iverson.gpu/checkpoint-minutes) | training progress-at-risk is not priced for those workloads (they are counted in the caveats). |
| event history (API TTL) | the control-loop window is limited to what the API retains. |
Uninstall / leave no trace
The exit is as short as the entry.
The local path never installed anything on the cluster — it read through kubectl and wrote one file on your machine. The Helm path removes everything it created (Job, ServiceAccount, ClusterRole, binding) with:
helm uninstall iverson-collector -n iverson
estate.json only ever existed on your side — delete it and no trace remains anywhere.
After the first report
The guided four-week version of this — topology authoring, findings review, one governed PR merged and rolled back — is the pilot. The procurement questions are answered on /trust, and every formula behind every number is defined on /methodology. The collector you downloaded is the entire program; source repository access is available to design partners.