One Command, One Working Kubernetes Cluster! Building My Daily-Driver Lab on OrbStack. Part 2 of a series documenting the setup of a production-mirror Kubernetes lab on a Mac using OrbStack. The author demonstrates how to create a single-node cluster with a single command, which automatically provides real LoadBalancer IPs and wildcard DNS without needing tools like MetalLB or manual host file edits. The guide then walks through installing Istio, Vault, and Crossplane via Helm in about ten minutes, highlighting how OrbStack simplifies local Kubernetes development. Part 2 of 7 — The Mac Kubernetes Lab: A Production-Mirror Setup from Scratch. Previously in Part 1: I walked through why I replaced Multipass with OrbStack, the dual-cluster architecture I settled on, and a preview of the M1 vs M4 CNI problem that’s coming in Part 4. The cluster I am going to set up in this article is the one I spend most of my working day inside. It’s a single-node Kubernetes cluster, always on, idles at around 512 MB of memory, has real LoadBalancer IPs and wildcard DNS out of the box. No MetalLB, /etc/hosts editing,kubectl port-forward muscle memory. By the time this article is done, it will also have Istio, Vault, and Crossplane running. Total elapsed time, the first time you do it: about ten minutes. If you’ve ever built a local Kubernetes cluster and then spent the next twenty minutes wiring up MetalLB and editing /etc/hosts so you can actually reach a service from a browser, this is going to feel almost suspicious. 💻 Mac orb start k8s Confirm cluster is udr kubectl get nodes NAME STATUS ROLES AGE VERSION orbstack Ready control-plane,master 30s v1.33.x kubectl config current-context orbstack That’s all No kubeadm, no CNI configuration, no certificate management. The cluster is up and reachable in under thirty seconds the first time, and instantly on every subsequent start. This is where OrbStack genuinely earns its keep. On a typical local cluster; kind, minikube, kubeadm, LoadBalancer services stay in pending state until you install MetalLB on OrbStack: ⚠️ The wildcard DNS only resolves on your Mac. Other devices on your network won’t see .k8s.orb.local. If you need a service reachable from another machine, that's what Cluster 2 Parts 3–6 is for. I use Helm rather than istioctl for two reasons. First, it's how I manage Istio on the production EKS clusters at work, so the muscle memory transfers. Second, Helm gives fine-grained control over resource requests, which matters on a laptop. 💻 Mac kubectx orbstack Add helm charts helm repo add istio https://istio-release.storage.googleapis.com/charts helm repo update Step 1 - Base CRDs helm install istio-base istio/base \ --namespace istio-system --create-namespace \ --set defaultRevision=default Step 2 - Control plane The PILOT ENABLE WORKLOAD ENTRY AUTOREGISTRATION flag is required on OrbStack to prevent DNS resolution conflicts with the host network. helm install istiod istio/istiod \ --namespace istio-system \ --set pilot.env.PILOT ENABLE WORKLOAD ENTRY AUTOREGISTRATION=true \ --set global.proxy.resources.requests.cpu=10m \ --set global.proxy.resources.requests.memory=64Mi \ --wait Step 3 - Ingress gateway OrbStack assigns a real LoadBalancer IP automatically - no MetalLB needed. helm install istio-ingress istio/gateway \ --namespace istio-ingress --create-namespace \ --set service.type=LoadBalancer Verify the gateway got an EXTERNAL-IP kubectl get svc -n istio-ingress NAME TYPE CLUSTER-IP EXTERNAL-IP PORT S istio-ingress LoadBalancer 10.x.x.x 198.19.x.x 80:xxx/TCP Enable sidecar injection on the default namespace kubectl label namespace default istio-injection=enabled This is the moment OrbStack feels like cheating. You create a Gateway pointing at .k8s.orb.local , and it just works from your Mac browser. No IP lookups. No /etc/hosts , no 127.0.0.1:8080 proxying. The Gateway resource binds to the istio-ingress LoadBalancer service, OrbStack intercepts traffic to the .k8s.orb.localwildcard domain at the Mac level and routes it to that LoadBalancer IP. The Virtual Service then routes inside the cluster to the right service. 💻 Mac kubectl apply -f - <