Documentation menu

Getting started

From an empty Mac to a routable, multi-cluster kind lab in a few commands. By the end you'll curl a LoadBalancer service by its real IP — straight from your shell, no port-forwarding.

Prerequisites

  • macOS 13 Ventura or later — Apple Virtualization.framework (vz) is required.
  • Apple Silicon (arm64). x86_64 is untested.
  • sudo access — prompted once on klimax up to add the host route (and on klimax destroy to remove it). klimax down needs no sudo.

Docker, kind, kubectl, and the Lima guest agent are downloaded and provisioned inside the VM on the first klimax up — you don't install them yourself.

1. Install

The recommended path is the Homebrew cask:

$ brew tap bcollard/klimax
$ brew trust --tap bcollard/klimax
$ brew install --cask klimax

Prefer to build from source? See the README on GitHub.

Already have klimax installed? Upgrading is brew upgrade --cask klimax followed by a VM rebuild — see Upgrading klimax.

Shell completion (optional)

# zsh — add to ~/.zshrc to persist
$ source <(klimax completion zsh)

2. Bring up the VM

This single, idempotent command creates the Lima VM, installs Docker, applies the L3 networking, and starts the registry mirrors:

$ klimax up
🔑

The first run prompts for sudo once — it adds a macOS route for the kind bridge CIDR (172.30.0.0/16 by default) pointing at the VM. After that, host→cluster traffic is pure L3. See Networking & L3 routing.

🔀

Already running another Lima-based tool? No action needed — network.disablePortMirroring defaults to true, so klimax coexists with Rancher Desktop, Colima, or another Lima/kind manager out of the box: its kubeconfigs address the VM's lima0 IP directly instead of racing for 127.0.0.1. Only if you run a single klimax VM and want stable loopback kubeconfigs should you set it to false in ~/.klimax/config.yaml before your first klimax up (it's a VM-level setting; changing it later needs a klimax destroy && klimax up). Details in Networking.

3. Create your first cluster

$ klimax cluster create dev

klimax provisions a kind cluster, installs MetalLB with a dedicated IP pool, wires CoreDNS forwarding, and (by default) merges the new context into ~/.kube/config. Switch to it like any other context:

$ kubectl config use-context dev
# or, if you use kubectx:
$ kubectx dev

4. Prove the routing works

Run the built-in smoke test — it deploys an nginx Deployment and a LoadBalancer Service, then waits for MetalLB to assign a VIP:

$ klimax cluster e2e-test-nginx

Now reach that service by its real IP, from your Mac — no kubectl port-forward:

$ VIP=$(kubectl get svc nginx -o jsonpath='{.status.loadBalancer.ingress[0].ip}')
$ curl http://$VIP/
<!DOCTYPE html> ... Welcome to nginx!

That VIP comes from the cluster's MetalLB pool inside 172.30.0.0/16, which your Mac routes directly to the VM. Pod IPs and Service ClusterIPs are reachable the same way.

5. Go multi-cluster

The whole point of klimax — spin up as many clusters as you need (up to 99). Each gets its own API-server port, subnets, and MetalLB pool:

$ klimax cluster create staging
$ klimax cluster list
$ kubectx staging

6. Stop or tear down

# Stop the VM — keeps clusters and the registry cache
$ klimax down

# Delete everything: VM, clusters, and the host route (sudo)
$ klimax destroy
💾

With the default cacheStorage: "host", pulled images survive even klimax destroy — your next lab rebuilds from the local cache instead of re-pulling. See Registry mirrors.

Two related lifecycle flows have their own pages: Upgrading klimax (pull a release, then rebuild the VM) and Reset & reinstall (wipe to a clean baseline).

Where to next