stack8s - Cluster Management CLI Docs
stack8s is a control plane for hosting Enterprise Grade Kubernetes — and the AI, data, and HPC
workloads on top of it — across infrastructure you own or operate, from one
place. It delivers a fully managed Kubernetes experience (we run the managed
control planes, the networking, and the multi-region plumbing) on your own
capacity, with nothing for you to build or operate underneath.
stack8s turns your global footprint — across any cloud, colo, or on-prem
sites you operate — into a single, managed global Kubernetes platform: the
layer above a cluster, not another way to hand one out. Its standout
capability is multi-region: one cluster can span many of your
locations at once under a single control plane and a single API, with pods
networked across regions automatically. Instead of a separate cluster per
site, you (or your customers) run one global cluster and place each
workload in the region closest to the users and data it serves.
What that means for you:
- A global product from one footprint. Your regions become a single
Kubernetes platform your customers reach through one API — spanning locations,
scaling and upgrading each independently, with zero cluster-ops on your side. - The managed layer above the metal. Around the cluster, stack8s runs host
lifecycle (provision / drain / decommission), placement, IP & DNS, multi-level
tenancy and metering, and an AI/ML marketplace on top — a managed product, not
just a cluster hand-off. - Substrate-neutral by design. Your primary capacity is the anchor, and the
same control plane can reach capacity across regions and providers — so a
customer's home stays where you put it even when a workload needs to burst
beyond a single site or cloud.
This guide is a hands-on test-drive of the core. From a single API key you'll
provision a real Kubernetes cluster on your capacity — a single-region one
first, then a global multi-region one — drive it with kubectl, run the
day-2 operations (scale, upgrade, roll), and tear it down. A handful of
commands end to end.
1. What you need
-
The
stack8sbinary. Download the build for your platform, verify its
checksum, and put it on yourPATH.Linux (x86-64):
BASE=https://pub-82b8408b380340489ff8d407c6acb832.r2.dev/stack8s-cli/v0.1.0-rc.3 curl -fsSL -O "$BASE/stack8s-linux-amd64" curl -fsSL -O "$BASE/SHA256SUMS" sha256sum --ignore-missing -c SHA256SUMS # expect: stack8s-linux-amd64: OK chmod +x stack8s-linux-amd64 && sudo mv stack8s-linux-amd64 /usr/local/bin/stack8s(Linux ARM64: swap
stack8s-linux-amd64→stack8s-linux-arm64.)macOS (Apple Silicon):
BASE=https://pub-82b8408b380340489ff8d407c6acb832.r2.dev/stack8s-cli/v0.1.0-rc.3 curl -fsSL -O "$BASE/stack8s-darwin-arm64" curl -fsSL -O "$BASE/SHA256SUMS" shasum -a 256 --ignore-missing -c SHA256SUMS # expect: stack8s-darwin-arm64: OK chmod +x stack8s-darwin-arm64 && sudo mv stack8s-darwin-arm64 /usr/local/bin/stack8s(macOS Intel: use
stack8s-darwin-amd64. If Gatekeeper blocks the binary:
xattr -d com.apple.quarantine /usr/local/bin/stack8s.)Verify it runs (should print
v0.1.0-rc.3):stack8s --version -
Your API key. We provisioned one for your account. The key alone
identifies your tenant and your capacity; you never put an account, project,
or fleet on the command line. Treat the key like a password — keep it
private, and rotate with us if it's ever exposed.
Set these two values once and the rest of the guide is copy-paste:
export STACK8S_API_ENDPOINT="api.edge.dev.stack8s.io:8444"
export STACK8S_API_KEY="stk_live_YOUR_API_KEY"
Replace
stk_live_YOUR_API_KEYwith the key we sent you. The endpoint is
TLS-only and requires your API key — there is no unauthenticated access.
2. Verify connectivity
List your clusters. On a new account this returns an empty list — which
confirms your key works and the endpoint is reachable:
stack8s cluster list
[]
If you instead see cannot reach platform-api …, check your network can
reach api.edge.dev.stack8s.io:8444. If you see an authentication error,
re-check STACK8S_API_KEY.
3. Create a cluster
Pick a region — one of the locations where you have capacity (use the
region codes provisioned for your account). Choose a cluster name and create
it:
stack8s cluster create demo --region REGION_A --wait-timeout 25m
stack8s waits until the cluster is READY and prints it:
{
"cluster_id": "…",
"name": "demo",
"region": "REGION_A",
"phase": "READY",
"spec": { "kubernetes_version": "v1.35.0", "tcp_replicas": 1 }
}
Notes:
- Provisioning uses real capacity, so allow several minutes.
--wait-timeout
bounds how long the command blocks; provisioning continues server-side even
if it elapses. - Add
--no-waitto return immediately with the cluster accepted, then poll
withstack8s cluster get demo. - Retries are safe — the command is idempotent per invocation.
4. Use the cluster
Fetch the cluster's admin kubeconfig and point kubectl at it:
stack8s cluster kubeconfig demo > demo.kubeconfig
kubectl --kubeconfig demo.kubeconfig get nodes
NAME STATUS ROLES AGE VERSION
n-… Ready <none> 3m v1.35.5
The kubeconfig file is written with 0600 permissions — it is an admin
credential, so treat it accordingly.
5. Inspect
stack8s cluster list # all your clusters
stack8s cluster get demo # one cluster's status
6. Day-2 operations
Everything below is an async operation: stack8s blocks until it reaches a
terminal state and prints the result. Add --no-wait to any of them to return
immediately with an operation id, then poll stack8s cluster get demo. All are
idempotent per invocation, so retries are safe.
Scale a worker pool
Grow a pool to a target node count (scale-up; the target must exceed the
current count). With no --worker-pool, it targets the single default pool:
stack8s cluster scale demo --nodes 3
Upgrade the control plane
Move the control plane to a newer Kubernetes version. Supported versions are
v1.35.0 and v1.36.2:
stack8s cluster upgrade demo --kubernetes-version v1.36.2
Roll the workers
Drain and reprovision the worker nodes — either in place, or onto a new
Kubernetes version (which must not exceed the control-plane version). Control
the disruption budget with --max-unavailable / --max-surge:
# reprovision the default pool at a new version
stack8s cluster roll demo --kubernetes-version v1.36.2
# or reprovision in place (omit the version), one node at a time, keeping capacity
stack8s cluster roll demo --max-surge 1
Manage worker-pool topology (declarative)
worker-pools reconcile takes the full desired set of pools and adds /
resizes / removes to match. Preview with --dry-run first; removing or
shrinking a live pool needs --allow-destructive:
# preview adding a second pool (same region) alongside the default
stack8s cluster worker-pools reconcile demo \
--worker-pool name=default/region=REGION_A/nodes=1 \
--worker-pool name=batch/region=REGION_A/nodes=2 \
--dry-run
# apply it (drop --dry-run)
stack8s cluster worker-pools reconcile demo \
--worker-pool name=default/region=REGION_A/nodes=1 \
--worker-pool name=batch/region=REGION_A/nodes=2
Multi-region (global) clusters
This is the headline. Span as many regions as you like in a single cluster —
one --worker-pool per region, each with its own node count. The control plane
lives in the cluster's home --region; the workers come up in their own regions
and are networked together automatically. To kubectl, it's one cluster.
Here's a global cluster — control plane in one region, workers across several:
stack8s cluster create global --region REGION_A \
--worker-pool name=pool-a/region=REGION_A/nodes=2 \
--worker-pool name=pool-b/region=REGION_B/nodes=1 \
--worker-pool name=pool-c/region=REGION_C/nodes=1 \
--worker-pool name=pool-d/region=REGION_D/nodes=1 \
--worker-pool name=pool-e/region=REGION_E/nodes=1 \
--wait-timeout 30m
kubectl get nodes on the result shows a worker in every region, all in one
cluster:
NAME STATUS VERSION REGION (topology.kubernetes.io/region)
n-… Ready v1.35.5 REGION_A
n-… Ready v1.35.5 REGION_A
n-… Ready v1.35.5 REGION_B
n-… Ready v1.35.5 REGION_C
n-… Ready v1.35.5 REGION_D
n-… Ready v1.35.5 REGION_E
Regions are the site codes available on your account — use any where you
have capacity. If a region is temporarily out of stock, the create tells you
so — just pick another.
Day-2 works per region too. Grow one pool, or roll just another to a new
version, by naming it:
stack8s cluster scale global --worker-pool pool-c --nodes 3
stack8s cluster roll global --worker-pool pool-e --kubernetes-version v1.36.2
Add a region later with worker-pools reconcile (list the full desired set,
including the pools you already have), or drop one with --allow-destructive.
Run stack8s cluster --help, or --help on any subcommand, for every flag.
7. Tear down
Delete the cluster when you're done — this releases the underlying capacity:
stack8s cluster delete demo
Confirm it's gone:
stack8s cluster list
[]
Troubleshooting
cannot reach platform-api at …— a network/endpoint issue. Confirm you
can reachapi.edge.dev.stack8s.io:8444and thatSTACK8S_API_ENDPOINTis
set correctly.authentication failed …— set or re-checkSTACK8S_API_KEY.not permitted …/not found— the name or region isn't valid for
your account;stack8s cluster listshows what you have.- Add
--verboseto any command to see the underlying error detail.