space RuntimeClass. On a Kubernetes Node, containerd is a runtime that runs the Node’s containers. On each worker Node, containerd hands the sandbox Pods to SPACE’s containerd shim, containerd-shim-space-v2. The shim boots a Firecracker microVM instead of a container. Kubernetes schedules and places sandboxes, and SPACE’s node services manage the microVM lifecycle.
SPACE’s local-development deployment runs on Kind, a tool that runs Kubernetes clusters in containers. This guide reuses several of its scripts and Helm charts, so their paths contain kind.
This guide is for cluster operators who want to evaluate SPACE on CoreWeave Kubernetes Service (CKS). It uses SPACE’s own charts and scripts, and covers the following:
- Prepare Node Pools and worker Nodes.
- Build the SPACE images.
- Install SPACE’s dependencies, its Secrets, and SPACE itself.
- Create a first sandbox.
Prerequisites
Before you start, you need the following:- A CKS cluster that uses Cilium as its network plugin.
- The CKS Admin role, and Kubernetes permissions to create privileged Pods and cluster-scoped resources. See CKS authentication and access.
- On your workstation:
kubectlconfigured for your cluster, Helm, Bash 4 or later, OpenSSL 3, Python 3.8 or later,git,jq, andcurl. macOS includes Bash 3.2, so install a later version, for example with Homebrew. - An
amd64Linux build host with Docker. - A container registry that your cluster’s Nodes can pull from.
Prepare the cluster
Before you install SPACE, prepare the cluster it runs on. The following sections describe how to create the Node Pools, add a default StorageClass, create the namespaces and RuntimeClass, allow sandbox network traffic, and set up each worker Node.Create Node Pools
SPACE uses two Node Pools. Set these labels in each pool’snodeLabels:
For a small evaluation, one Node Pool can carry all three labels and run both roles.
CoreWeave tested this deployment on one General Purpose AMD Turin (High Storage) Node,
turin-gp-l, that runs both roles.
Every sandbox is a Pod, so the kubelet’s maxPods limit caps sandboxes per Node. The default of 110 allows about 100 sandboxes on a worker of any size. To run more, raise maxPods in the cluster’s kubelet configuration before you prepare the workers. The change applies to every Node in the cluster and takes effect after a Node reboot, which clears the worker preparation.
Install a default StorageClass
SPACE’s PostgreSQL chart requests a PersistentVolumeClaim from the cluster’s default StorageClass. Check whether the cluster has one:(default), skip to the next section. Otherwise, install local-path-provisioner with its data on each Node’s local NVMe disk, and make its local-path StorageClass the default:
Create namespaces and the RuntimeClass
SPACE runs in thespace namespace and places sandbox Pods in the sandboxes namespace. Create both namespaces and the RuntimeClass that sandbox Pods reference:
Allow sandbox Pods to reach their node services
Each sandbox Pod forwards control traffic to SPACE’s node API on its Node, on port9800. SPACE’s sandbox NetworkPolicy blocks traffic from sandbox Pods to Node addresses, and CKS’s network plugin, Cilium, enforces it. Allow that one port with a CiliumNetworkPolicy:
sandbox-node-api.yaml
timed out waiting for sandbox pod proxy to become reachable. The policy also lets code that runs in a sandbox connect to that port on its Node.
Prepare worker Nodes
SPACE’s production node image sets up each worker before any SPACE Pod starts. CKS Nodes don’t run that image, so on each worker you run the same setup that SPACE’s Kind node image runs.-
Open a root shell on the worker. Replace
[NODE-NAME]with the worker’s name: -
In the root shell, clone SPACE onto the Node’s local disk at the same commit, and install the Firecracker binaries and guest kernel:
-
Install SPACE’s node setup units and start them. They create SPACE’s host accounts, the
/spacedirectory layout, thespacecgroup, and a btrfs cache filesystem backed by an image file on the local disk. To change the cache image’s 40 GiB size, first setSPACE_CACHE_SIZE_MBin/etc/space/kind-node.env.The cache image is a sparse file. The cache unit logs a size warning that reads the link instead of the image. You can ignore this warning. -
Build the shim with a Go toolchain on the local disk, and install it:
-
Register the
spaceruntime with containerd, and restart it:This is the runtime section thatinstall-shim.shprints when containerd doesn’t have one yet. -
Exit the shell, and delete the debug Pod that
kubectl debugprinted when it started.
/mnt/local when the Node reboots. Repeat these steps after a worker reboots. Until you do, SPACE’s node services on that worker fail to start.
Build and publish the images
On the build host, clone SPACE at the same commit and build its images with its Kind build script. Then tag and push them. Replace[REGISTRY] with your registry and namespace, such as registry.example.com/space, and [TAG] with an image tag:
~/.space-devbox/kind/ssh/ on the build host. Copy sandbox_ed25519 and sandbox_ed25519.pub from there into the SPACE checkout on your workstation. You need them to create the sandbox SSH Secret.
SPACE’s charts don’t set image pull Secrets, so the worker and infra Nodes must be able to pull from [REGISTRY] without one.
Install the dependencies
SPACE needs PostgreSQL, S3-compatible object storage, and a key broker for volume encryption keys. SPACE’s install path for existing clusters doesn’t install them. For evaluation, install SPACE’s own Kind charts for each one. They run on the infra Nodes.-
Install PostgreSQL. The chart creates the
space-postgresSecret that SPACE reads: -
Install the object store, with its data on the local disk. The chart creates the
templatesandsnapshotsbuckets and thespace-object-storeSecret: -
Install SPACE’s test key broker under the names the install path accepts:
-
SPACE reaches its key broker only over HTTPS with HTTP/2, and the test broker serves plain gRPC. Create a certificate for a TLS proxy in front of it:
-
Run NGINX as the TLS proxy:
key-broker-tls.yaml
Create the Secrets
SPACE’s install path checks that every Secret it references exists in thespace namespace. The install path README lists each Secret and its keys. The dependency charts created some of them. Create the rest:
-
Create the internal tokens and the database role passwords:
-
Create the key that signs sandbox route tokens, and its verification bundle:
-
Create the sandbox SSH Secret from the key pair that the build created:
-
Issue the internal RPC TLS certificates with SPACE’s Kind script. The script targets a kubeconfig context named
kind-[NAME], so create one that points at your cluster:The script creates the internal certificate authority and the service certificates in thespacenamespace.
Install SPACE
With the dependencies and Secrets in place, install SPACE and publish its seed template:-
Create a values file from SPACE’s example. Replace
[SPACE-CLUSTER-NAME]with a stable name for this SPACE cluster:The changes point SPACE at your images, the in-cluster object store, and the key broker proxy. SPACE scopes Node identities to the cluster name, so don’t change it after you install.dataPlanePublicUrlis the data-plane address that clients use. This guide reaches the data plane through a port forward. -
Install both SPACE releases:
The script checks the namespaces, Secrets, and RuntimeClass, and runs the database migrations. It then installs two Helm releases. The
spacerelease contains the API services and the worker node services. Thespace-builderrelease contains the template builder services, which you need only to build custom templates. This guide doesn’t cover custom templates, so it creates no Nodes labeledspace.pplx.net/node-pool: builder, and thespace-builderrelease runs no Pods. -
Publish the seed template. The internal API accepts template publishing only from the
space-template-publishServiceAccount, so render the chart with the release namespace:
Verify the deployment
Check that every Pod in thespace namespace is Running and ready, or Completed:
Example output
SLOTS column is empty, the worker isn’t ready for sandboxes. Check its space-node-manager Pod.
Create a first sandbox
To confirm that SPACE works end to end, sign in to its API from your workstation and run SPACE’s first-sandbox example:-
Set the password of SPACE’s
root@localadmin user with SPACE’s Kind script, through thekind-ckscontext: -
Forward the API and data-plane ports to your workstation:
-
Sign in and save a session token:
-
Run SPACE’s first-sandbox example:
The example uses only the Python standard library. It creates a sandbox from
seed:latest, runs a command, and asks whether to delete the sandbox. The output includesHello from SPACEandCommand completed successfully.
Limitations
This deployment has the following limitations:- Evaluation only. The test key broker isn’t designed to secure encryption keys, and the dependencies run as single replicas.
amd64workers only.- No state across Node reboots. CKS clears Node local disks on reboot. After a worker reboots, prepare it again. After an infra Node reboots, the object store loses its data, and so does PostgreSQL on a local-path volume, so uninstall and reinstall SPACE.
- In-cluster object storage. SPACE can’t use CoreWeave AI Object Storage, so this deployment uses SPACE’s in-cluster object store.
- No template builds or web console. This guide publishes only the
seedtemplate, and SPACE’s install path doesn’t include its UI.
Troubleshoot
For SPACE API errors, see Troubleshooting in the SPACE documentation.
Uninstall SPACE
Delete the SPACE resources:/mnt/local, and the processes, cgroups, and network namespaces that SPACE leaves on the Node. Without a reboot, a reinstall fails until you remove them manually.
On your workstation, stop the port forwards and remove the kubeconfig context that the SPACE scripts used: