Quick Start
Create a Cluster
Section titled “Create a Cluster”kinder create clusterYou should see output like:
Creating cluster "kind" ... ✓ Ensuring node image (kindest/node:v1.35.1) 🖼 ✓ Preparing nodes 📦 ✓ Writing configuration 📜 ✓ Starting control-plane 🕹️ ✓ Installing CNI 🔌 ✓ Installing StorageClass 💾 ✓ Installing MetalLB ✓ Installing Metrics Server ✓ Tuning CoreDNS ✓ Installing Local Path Provisioner ✓ Installing Envoy Gateway ✓ Installing Dashboard ✓ Installing Local Registry ✓ Installing cert-manager
Addons: * MetalLB installed * Metrics Server installed * CoreDNS Tuning installed * Local Path Provisioner installed * Envoy Gateway installed * Dashboard installed * Local Registry installed * cert-manager installedSet kubectl context to "kind-kind"You can now use your cluster with:
kubectl cluster-info --context kind-kindkinder also prints a dashboard token and port-forward command — save these for later.
What You Get
Section titled “What You Get”| Addon | Namespace | Purpose |
|---|---|---|
| MetalLB | metallb-system | LoadBalancer IP assignment |
| Envoy Gateway | envoy-gateway-system | Gateway API ingress |
| Metrics Server | kube-system | kubectl top support |
| CoreDNS tuning | kube-system | Optimised DNS caching |
| Local Path Provisioner | local-path-storage | Automatic dynamic PVC provisioning with local-path as default StorageClass |
| Headlamp | kube-system | Web UI for cluster inspection |
| Local Registry | default (host network) | Private container registry at localhost:5001 |
| cert-manager | cert-manager | Automatic TLS certificates with self-signed ClusterIssuer |
Verify Core Addons
Section titled “Verify Core Addons”MetalLB
Section titled “MetalLB”Deploy a LoadBalancer service and confirm it gets an external IP:
kubectl create deployment nginx --image=nginxkubectl expose deployment nginx --type=LoadBalancer --port=80kubectl get svc nginxYou should see a real IP under EXTERNAL-IP:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEnginx LoadBalancer 10.96.150.34 172.19.255.200 80:30693/TCP 7sClean up:
kubectl delete svc nginx && kubectl delete deployment nginxMetrics Server
Section titled “Metrics Server”Check that kubectl top returns real CPU and memory data:
kubectl top nodesExpected output:
NAME CPU(cores) CPU(%) MEMORY(bytes) MEMORY(%)kind-control-plane 168m 0% 1385Mi 8%CoreDNS Tuning
Section titled “CoreDNS Tuning”Verify that autopath and cache 60 are present in the Corefile:
kubectl get configmap coredns -n kube-system -o jsonpath='{.data.Corefile}'Look for these entries in the output:
autopath @kubernetescache 60 { disable success cluster.local disable denial cluster.local}Verify Optional Addons
Section titled “Verify Optional Addons”Envoy Gateway
Section titled “Envoy Gateway”Confirm the GatewayClass is accepted:
kubectl get gatewayclass egExpected output:
NAME CONTROLLER ACCEPTED AGEeg gateway.envoyproxy.io/gatewayclass-controller True 9mHeadlamp Dashboard
Section titled “Headlamp Dashboard”Port-forward to the dashboard:
kubectl port-forward -n kube-system service/headlamp 8080:80Open http://localhost:8080 and paste the token that was printed during cluster creation.
If you need to retrieve the token later:
kubectl get secret kinder-dashboard-token -n kube-system \ -o jsonpath='{.data.token}' | base64 -dLocal Registry
Section titled “Local Registry”Confirm the registry container is running and accessible:
docker ps --filter name=kind-registryExpected output:
CONTAINER ID IMAGE COMMAND PORTS NAMESabc123def456 registry:2 "/entrypoint.sh /etc…" 0.0.0.0:5001->5000/tcp kind-registryVerify dev tool discovery ConfigMap is present:
kubectl get configmap local-registry-hosting -n kube-publicExpected output:
NAME DATA AGElocal-registry-hosting 1 60scert-manager
Section titled “cert-manager”Check all three cert-manager components are running:
kubectl get pods -n cert-managerExpected output:
NAME READY STATUS RESTARTS AGEcert-manager-... 1/1 Running 0 60scert-manager-cainjector-... 1/1 Running 0 60scert-manager-webhook-... 1/1 Running 0 60sConfirm the self-signed ClusterIssuer is ready:
kubectl get clusterissuer selfsigned-issuerExpected output:
NAME READY AGEselfsigned-issuer True 60sLoading local images
Section titled “Loading local images”To load a locally-built image into every node of the cluster, use kinder load images:
docker build -t myapp:dev .kinder load images myapp:devThis works with all three providers (docker, podman, nerdctl) and skips re-importing if the image is already present on every node. See the Load Images CLI reference for full details.
Something wrong?
Section titled “Something wrong?”Run kinder doctor to check prerequisites and identify issues:
kinder doctorThis checks that Docker (or Podman/nerdctl), kubectl, and other dependencies are installed and reachable.
Delete the Cluster
Section titled “Delete the Cluster”When you are done:
kinder delete cluster