klimax is now marina. Same tool, new name since v0.3. Existing install? Migrate with marina migrate →
macOS Silicon · Apple VZ · Open source

Multi-cluster Kubernetes,
native on macOS.

marina spins up kind clusters on your Mac in about a minute, and makes their Services type LoadBalancer directly accessible from your laptop.

  • Built on Lima + Apple Virtualization framework (VZ) — fast, native, no Hypervisor.framework overhead.
  • Every LoadBalancer Service gets a hostname — nginx.default.dev.demo.internal — and a browser-trusted certificate, with no domain to own.
  • Pull-through registry cache for docker.io, quay.io, gcr.io — no more Hub rate limits.
  • Cohabits with Docker Desktop, OrbStack, Colima, Rancher Desktop.

Why

Everything built in.

Demo

From marina up to a named, trusted Service.

One command brings up the VM, the routing, the registry mirrors, the local DNS zone and its CA. A second creates a cluster in about a minute. Every LoadBalancer Service then has a name — and HTTPS your browser trusts.

~/lab · zsh
$ marina up
✓ Lima VZ VM running               vzNAT · lima0
✓ Docker + kind network            172.30.0.0/16
✓ Registry mirrors                 docker · quay · gcr · pkg.dev
✓ macOS route                      172.30.0.0/16 → lima0
✓ Local DNS                        *.demo.internal
✓ Local CA                         trusted in the System keychain
$ marina cluster create dev
✓ kind cluster dev                   api :7001
✓ MetalLB pool                     172.30.1.x
✓ ExternalDNS                      *.dev.demo.internal
✓ TLS wildcard                     Secret marina-wildcard-tls
$ kubectl expose deploy web --port 80 --type LoadBalancer
service/web exposed
$ marina dns list
NAME                              IP
web.default.dev.demo.internal   172.30.1.1
$ curl http://web.default.dev.demo.internal/
<title>Welcome to nginx!</title>   ← from your Mac, by name
⬆

Upgrading marina? After brew upgrade --cask marina, re-create the VM so the new release re-provisions it: marina destroy && marina up. The host-backed image cache survives, so it rebuilds fast. See the docs.

Under the hood

N kind clusters. Pure L3 routing.

Your Mac, a Lima VZ guest, and a Docker bridge — that's the entire topology. marina adds a host route into the kind bridge CIDR, an iptables nat-exemption inside the VM, and DOCKER-USER forward rules so kind→host traffic exits without SNAT. Source IPs are preserved end to end.

macOS HOST marina CLI single binary curl data plane kubectl control plane LIMA VM · APPLE VZ DOCKER kind · cluster 1 api :7001 svc type LB → 172.30.1.200 svc type LB → 172.30.1.201 kind · cluster 2 api :7002 svc type LB → 172.30.2.200 + N more — own API port, subnet & VIP pool REGISTRIES docker.io mirror quay.io mirror gcr.io mirror us-docker.pkg.dev us-central1.pkg.dev manages VM 172.30.1.200 192.168.64.3:7002
curl 172.30.1.200/ on your Mac → vzNAT → guest lima0 → Docker bridge → MetalLB VIP. No SNAT, no port-forwarding, no VPN.

Get it

Install with a Homebrew cask.

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

$ marina up

Then a typical session looks like this

# Bring up the VM + Docker + routing + registries (idempotent)
$ marina up

# Create clusters
$ marina cluster create dev
$ marina cluster create staging

# List, switch, delete
$ marina cluster list
$ kubectx dev
$ marina cluster delete    # interactive multi-select picker

# End-to-end smoke test
$ marina cluster e2e-test-nginx

# Stop the VM (preserves clusters and registry cache)
$ marina down

The macOS app

A native macOS app, for when the terminal isn't enough.

marina-ui is a SwiftUI companion app: a dashboard for every cluster, registry, and VM resource marina manages — with live charts, kubeconfig copy buttons, and a cluster creator that streams the build log as it runs.

marina-ui home view: clusters grid, registry mirrors, and live VM CPU and memory charts in a native macOS window
The home view — every cluster, every registry mirror, every VM stat at a glance.
✓

Cluster overview. Every kind cluster, its API port, kubeconfig path, age, and quick actions in one place.

✓

Live VM charts. CPU and memory for the Lima guest, sampled every 5 s over the SSH ControlMaster marina already maintains — read straight from /proc.

✓

Registry mirror inspector. Cache size and image count for every pull-through mirror in ~/.marina/registry-cache/.

✓

LoadBalancer probes. Every Service with an external IP gets a TCP reachability check — when it's up, the row turns into a clickable link.

Drill into any cluster

Get marina-ui

$ brew tap bcollard/marina
$ brew trust --tap bcollard/marina
$ brew install --cask marina-ui

$ open -a Marina

FAQ

Common questions.

Wasn't this called klimax?

Yes — until v0.3. The name changed; the tool did not. If you have a klimax installation, marina migrate moves it over in one command: see Coming from klimax.

How is this different from kind, Colima, OrbStack, or Rancher Desktop?

Those each solve one piece of the puzzle. marina is opinionated about the whole stack: a single CLI that owns the VM, the kind clusters, the routing, the registry mirrors, and the kubeconfig wiring. The killer feature is real-IP routing: you reach LoadBalancer VIPs directly from your Mac without port-forwarding — and by name, under demo.internal, without owning a domain. See the detailed comparisons in the repo.

Can I run it alongside Docker Desktop, OrbStack, or Rancher Desktop?

Yes, out of the box. marina runs its own Lima VZ instance with a distinct vzNAT IP, so there is no IP-level conflict with other VMs. The one potential friction point — Lima port mirroring — is disabled by default (network.disablePortMirroring: true), so kubeconfigs use the VM's direct lima0 IP and never race other Lima-based tools for 127.0.0.1. Set it to false only if you run a single marina VM and prefer stable loopback kubeconfigs.

What macOS version do I need?

macOS 13 Ventura or later — Apple Virtualization framework (vmType: vz) is required. Built and tested on Apple Silicon.

Why does it ask for sudo?

Only twice: marina up adds a macOS host route (route add 172.30.0.0/16 …), and marina destroy removes it. Everything else — VM lifecycle, cluster create/delete, registries — runs unprivileged.

Does cluster data survive a reboot?

Yes. marina down stops the VM but preserves every cluster, its data, and the registry cache. marina up brings them all back. marina destroy is the explicit wipe.

Will my CI image pulls hit Docker Hub rate limits?

No — that's exactly what the pull-through mirrors fix. After the first pull, blobs are served from ~/.marina/registry-cache/ on your laptop. The mirrors survive marina destroy.

Can I use a private registry that needs auth?

Yes. Add username / password under any mirror in ~/.marina/config.yaml. For locally built images there's no push registry — build against the VM's Docker (eval "$(marina docker-env)") and load them into a cluster with kind load docker-image.

Is it open source?

Yes — MIT licensed. The CLI and the macOS UI are both on GitHub. Issues and PRs welcome.