Quickstart: evaluate locally with mock-NICo
Preview: NVKE is available as a preview. APIs, configuration and behavior can change between releases, and we do not recommend NVKE for production workloads. See Preview status and known limitations.
This page describes how to run NVIDIA Kubernetes Engine (NVKE) on one Linux machine and create a workload cluster through the NVKE API, with no GPU hardware and no NVIDIA account. In place of NVIDIA Infra Controller (NICo), the machine runs mock-NICo, a simulator that answers the NICo API and starts each workload cluster node as a Docker container.
You need a Linux host, physical or virtual, with at least 6 CPUs, 12 GiB of free memory and 100 GiB of free disk, Docker, and the tools listed in Before you begin. macOS is not covered by this page.
The setup has four parts on your machine:
- A kind cluster named
controller-capithat serves as the management cluster, with Cluster API installed. - The NVKE management plane, deployed into that cluster by Tilt and served on
http://localhost:8080. - CAPNICo, the Cluster API infrastructure provider for NICo, built from source.
- mock-NICo (the
nico-simprocess), which CAPNICo calls as if it were NICo.
The example passwords, the simulated NICo and the Tilt-managed management plane are for local evaluation only. Do not reuse this setup for a real installation.
Before you begin
- A Linux machine on x86-64 (amd64) or arm64. macOS is not covered by this page.
- At least 6 CPUs, 12 GiB of free memory and 100 GiB of free disk. These are the sizes the repository gives its own development VM for this stack.
- The Linux kernel module
tpm_vtpm_proxy, which the simulated nodes use for their TPMs. On Debian and Ubuntu, the setup step below installs it if it is missing. You needsudofor that step. - Docker Engine with BuildKit, usable by your user without
sudo. - These tools on
PATH:git, GNU Make, Go 1.27.3 or later, a C compiler such asgcc,kindv0.32.0,kubectl, Helm 4,tilt,jq,curl,nc,dpkg-debanddpkg-scanpackages. On Debian and Ubuntu,dpkg-scanpackagesis in thedpkg-devpackage. An older Go downloads 1.27.3 automatically unlessGOTOOLCHAIN=localis set. You do not needclusterctl: the setup installs the pinned version into the repository. fs.inotify.max_user_instancesat 1024 or more. Tilt restarts the management plane with a file watcher, and with a lower limit, such as the common default of 128, the management plane restarts in a loop withentr: cannot create kqueue: No file descriptors availablein its log. Prepare the machine checks and raises the limit.- Nothing else listening on ports 179, 5432, 7233, 8080, 8081, 10350, 18080, 30440 or 30443.
- Outbound internet access to GitHub, the Go module proxy and public container registries.
Prepare the machine
-
Clone the repository and change into it.
Run every command on this page from the
nvkedirectory unless a step says otherwise. -
Check the inotify instance limit.
The output is
fs.inotify.max_user_instances = <VALUE>. Write down<VALUE>: Clean up sets it back. If it is less than 1024, raise it until the next reboot: -
Load the virtual TPM module.
The output includes
ensure-vtpm-proxy: /dev/vtpmx ready, orensure-vtpm-proxy: /dev/vtpmx already presentif the module was already loaded. -
Build
nvkectland put it on yourPATH. -
List the sites
nvkectlalready knows.This page adds a site named
local. Ifsitesalready has alocalentry,nvkectl config set-sitereplaces it; use another name in its place in everynvkectl configcommand on this page.
Get the CAPNICo source
CAPNICo is public at dsx-ai-factory/cluster-api-provider-nico. Use the version this repository pins, so that CAPNICo matches the management plane you run.
-
Download the pinned version with Go and print where Go stored it.
The path ends in
cluster-api-provider-nico@followed by the pinned version. -
Copy it next to the
nvkedirectory, into a new directory namednvke-quickstart-capnico, and make the copy writable.If
mkdirreports that the directory exists, stop: Clean up deletes this directory, so it must be one this page created. Move the existing directory out of the way first.The copy contains
chart/Chart.yaml. Tilt checks for that file before it builds CAPNICo.
Start the management cluster
-
Write the Tilt configuration. It selects the NICo provider, runs mock-NICo with container nodes, and builds CAPNICo from the copy you made.
Tilt resolves
capnico_source_dirrelative to thecontrollerdirectory. -
Create the Tilt environment file.
Open
controller/.env.tiltand give each of the five empty values at the top a value. Tilt refuses to start while any of them is empty. Any values work for this local stack:Leave the rest of the file as it is.
-
Create the kind cluster, install Cluster API, and build the node image the simulated nodes run.
The command also downloads
clusterctlintocontroller/.local/binand starts two local registry caches. Near the end, the output includes:The management cluster’s
kubectlcontext iskind-controller-capi, and it is now your current context. -
Start Tilt from the
controllerdirectory and leave it running.Tilt prints the address of its web UI. Open it and wait until every resource is green. If
helm,docker,goorkindis missing, thecheck-management-clusterresource fails and its log names the tool.nico-simis mock-NICo,capnico-providerbuilds and installs CAPNICo, andnvke-controlleris the management plane.
Open a second terminal in the nvke directory for the rest of this page, and run export PATH="$PWD/cli/bin:$PATH" in it.
Create a workload cluster
-
Write the management cluster’s kubeconfig to a file.
The file holds only the
kind-controller-capicontext, with its admin credentials. -
Point
nvkectlat the management plane.The output is
Site "local" configured (url: http://localhost:8080).--kubeconfigis the management cluster’s kubeconfig from step 1, as an absolute path so thatnvkectlfinds it from any directory. Tilt turns on NVKE API authentication, andnvkectluses this kubeconfig to get an API token for each request, so you do not handle tokens yourself. -
Check that CAPNICo is ready.
The
nicorow showsCONFIGURED. Other rows showNOT-INSTALLEDand do not affect this page. IfnicoshowsNOT-CONFIGUREDorDEGRADED, wait for the Tilt resources to finish and run the command again. -
Create the cluster.
The request creates
my-cluster: Kubernetes 1.34.8, the version of the node image thatcapd-upbuilt, one control-plane node and a node pool namedworkerwith one node, on mock-NICo’s seeded site. ItscontrolPlaneVIP,172.31.2.1, is routed on your machine by the local Border Gateway Protocol (BGP) peer that Tilt started. The output is:<CLUSTER_ID>is the ID NVKE assigned to the cluster. -
Check the cluster’s status, and run the command again until
STATUSisProvisioned.The status is
Provisioningwhile mock-NICo starts the node containers and NVKE forms the cluster. If it becomesProvisioningFailed, check thenvke-controllerandnico-simlogs in the Tilt UI, and the CAPNICo logs withkubectl -n capnico-system logs deployment/controller-manager.
Access the workload cluster
-
Write the cluster’s admin kubeconfig to a file.
The output is
kubeconfig written to my-cluster.kubeconfig. The file is an admin credential for the cluster. -
Wait for every node to become ready.
Provisionedmeans the provisioning workflow has finished; node networking can still be starting. Watch the nodes until each one showsReady, then press Ctrl+C. This usually takes a few minutes. -
List the cluster’s nodes.
Two nodes are listed, one with the
control-planerole, both with statusReady.
Clean up
-
Delete the workload cluster.
The output starts with
Cluster "my-cluster" deletion started. Runnvkectl get clustersuntilmy-clusteris no longer listed. Delete the cluster before you stop Tilt, because mock-NICo removes the node containers. -
Stop Tilt with Ctrl+C in the first terminal.
-
Remove the kind cluster, the BGP peer, the registry caches and the
kindDocker network.kind-downends with✅ Kind management cluster deleted. -
Set the inotify instance limit back to the
<VALUE>you wrote down in Prepare the machine. Skip this step if you did not raise it. -
Remove the
localsite from thenvkectlconfiguration.nvkectlhas no command that removes a site, so edit its configuration file,~/.config/nvkectl/config.yaml, or$XDG_CONFIG_HOME/nvkectl/config.yamlifXDG_CONFIG_HOMEis set.- Delete the
localentry undersites, with itsurlandkubeconfiglines. - If
current-siteislocal, set it to the name of another entry undersites, or delete the file iflocalwas the only entry.
Then confirm that
nvkectl config viewno longer listslocal.nvkectlalso cached API tokens forhttp://localhost:8080in~/.cache/nvkectl/tokens.json. Each expires 10 minutes after it was issued and works only against the deleted management cluster, so you can leave them. - Delete the
-
Delete the repository, the CAPNICo copy and the mock-NICo binary.
The
nvkedirectory holds the other files this page created, includinglocal-mgmt.kubeconfig,my-cluster.kubeconfig,controller/.env.tiltand the build output incontroller/.local.
The container images that the setup built or pulled stay in Docker, and docker image ls lists them. If host-up loaded tpm_vtpm_proxy, it also wrote /etc/modules-load.d/99-capi-vtpm.conf, which loads the module at boot. Delete that file with sudo if you do not want the module loaded after a reboot.