Skip to content

feat(clusters): runcrate clusters, bought by the machine, on the live clusters API (RUN-642) - #12

Merged
heydryft merged 3 commits into
mainfrom
feat/clusters
Oct 26, 2026
Merged

heydryft merged 3 commits into
mainfrom
feat/clusters

Conversation

@heydryft

Copy link
Copy Markdown
Member

runcrate clusters (RUN-635 / RUN-642). It creates, uses, tests and deletes multi-machine GPU clusters through /api/v1/clusters, which is now open to every workspace in Production. The app's docs, OpenAPI and MCP tools are aeonmindai/runcrate_app#390.

Commands

clusters offers | create | list | get | ssh [--node N] | kubeconfig | tunnel | test | delete

This update (on top of the two earlier commits)

  • Bought by the machine:
    • columns and lines say GPUs per machine, $/hr per machine and $/hr for the cluster;
    • --gpu H100:3 (or --gpu-count 3) is refused before any call, since machines have 1, 2, 4 or 8 GPUs;
    • leave the count out to see every size.
  • Offers:
    • show allowed_node_counts when an offer only takes some sizes;
    • print each interconnect note once under the table (Ethernet: what it suits);
    • --with-volume sends volume=true, for create --volume.
  • Kubernetes tunnel fix: it forwards 6443 to the head's private address, where k3s listens (--bind-address on the overlay), not its loopback. Before this, runcrate clusters tunnel on a Kubernetes cluster could not reach the API.
  • NCCL results: they show the API's note when a slow link stopped the test early.
  • API types: gain allowed_node_counts, country_code, interconnect.note, result.note, resize and the event id.
  • README: the Clusters section is updated, including the honest Ethernet line and "fast InfiniBand or RoCE clusters are coming; ask us".

Tests

  • go test ./...: ok (api, auth, commands, config).
  • New tests: the k8s forward targets the head's address, the head address is picked over a worker's, and the GPU count check covers 1/2/4/8 accepted and 3/6/16 refused. The offer table test now covers allowed counts and the note shown once.
  • Against Production, read only, on the QA workspace a7059fb5 with a temp key that is now revoked:
    • clusters/config returned self_serve: true;
    • clusters offers --nodes 2 listed 61 real offers;
    • --gpu H100 --nodes 4 priced 4 machines;
    • --gpu H100:3 was refused locally;
    • clusters list showed "No clusters".
    • Nothing was created.

Release (after the app PR merges; not done here)

Tag v0.9.0 on main. .github/workflows/release.yml then tests, cross-compiles the five binaries, publishes the GitHub Release with checksums.txt, and dispatches the Homebrew tap update. install.sh, install.ps1 and runcrate update read the release. There is no npm package.

… clusters (RUN-635)

runcrate clusters list, offers, create, get, delete, ssh, kubeconfig,
tunnel and test, on the /api/v1/clusters routes.

- offers shows where a cluster can start, with the price per node and for
  the whole cluster as the API returns them; community hosts only with
  --include-community.
- create sends an Idempotency-Key; a gone offer prints the current offers
  and creates nothing; no capacity says nothing was created or billed.
- ssh and tunnel sign an ephemeral certificate per node instance id, the
  same flow as runcrate ssh (now execSSH, shared by both). tunnel forwards
  the Kubernetes API (6443) or the Ray dashboard (8265) from the head.
- kubeconfig -o writes the file mode 600; test waits for the NCCL result
  unless -d.

Refs: RUN-635
…, tunnel k8s to the head

Prices read per machine and for the cluster, GPUs per machine are 1, 2, 4 or 8 (refused before the call), offers show allowed node counts and the interconnect note once, test results show why a slow link stopped early, and offers take --with-volume (volume=true) for create --volume. The Kubernetes tunnel forwards 6443 to the head's private address, where k3s listens, instead of its loopback. API types gain allowed_node_counts, country_code, interconnect.note, result.note, resize and event id.
@heydryft
heydryft merged commit aa2df4a into main Oct 26, 2026
1 check passed
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