Idempotent Bash script for managing Kind clusters with local container registry support.
Inspired by StrimKKhaos.
- Idempotent - Safe to run multiple times
- Docker & Podman support
- IPv4/IPv6/dual-stack networking
- Local container registry for development
- Cloud-provider-kind for LoadBalancer support
Download from the latest GitHub release:
curl -sSLO https://github.com/see-quick/kind-script/releases/latest/download/kind-cluster.sh
chmod +x kind-cluster.shOr pin to a specific version:
curl -sSLO https://github.com/see-quick/kind-script/releases/download/v1.0.0/kind-cluster.sh
chmod +x kind-cluster.shClone the repo and run the build script to produce a single-file distribution:
git clone https://github.com/see-quick/kind-script.git
cd kind-script
./build.sh
# Output: dist/kind-cluster.sh./kind-cluster.sh create # Create cluster
./kind-cluster.sh status # Check status
./kind-cluster.sh delete # Cleanup| Command | Description |
|---|---|
create |
Create cluster with all components |
delete |
Delete cluster and cleanup |
status |
Show status |
install-deps |
Install kind and kubectl |
version |
Show version information |
help |
Show help |
--name NAME Cluster name (default: kind-cluster)
--control-planes N Control plane nodes (default: 1)
--workers N Worker nodes (default: 3)
--image IMAGE Node image: latest, oldest, or full image
--ip-family FAMILY ipv4, ipv6, dual (default: ipv4)
--docker-cmd CMD docker or podman
--registry-port PORT Registry port (default: 5001)
--no-registry Disable local registry
--no-cloud-provider Disable LoadBalancer support
--zones N Number of zones to simulate
--nodes-per-zone N Worker nodes per zone (default: 1)
--force Force recreate existing cluster
--debug Enable debug output
Simulate Kubernetes availability zones by distributing nodes across zones with standard topology labels.
# 3 zones, 1 worker per zone (3 CPs + 3 workers = 6 nodes)
./kind-cluster.sh create --zones 3
# 2 zones, 3 workers per zone (2 CPs + 6 workers = 8 nodes)
./kind-cluster.sh create --zones 2 --nodes-per-zone 3
# Via environment variables
ZONES=3 NODES_PER_ZONE=2 ./kind-cluster.sh createWhen --zones is specified:
- One control-plane node is created per zone
- Worker nodes are distributed round-robin across zones
--workersand--control-planesflags are ignored with a warning- Each node gets labels:
topology.kubernetes.io/zone=zoneNandrack-key=zoneN
Check zone distribution with status:
./kind-cluster.sh status
# Zones:
# zone0: kind-control-plane, kind-worker, kind-worker4
# zone1: kind-control-plane2, kind-worker2, kind-worker5# Custom cluster
./kind-cluster.sh create --name my-cluster --workers 5 --control-planes 3
# IPv6 cluster
./kind-cluster.sh create --ip-family ipv6
# Use Podman
./kind-cluster.sh create --docker-cmd podman
# Environment variables
CONTROL_NODES=3 WORKER_NODES=5 ./kind-cluster.sh create| Variable | Default | Description |
|---|---|---|
KIND_VERSION |
v0.29.0 | Kind version |
KIND_NODE_IMAGE |
latest | Node image |
KIND_CLUSTER_NAME |
kind-cluster | Cluster name |
CONTROL_NODES |
1 | Control planes |
WORKER_NODES |
3 | Workers |
IP_FAMILY |
ipv4 | IP family |
DOCKER_CMD |
docker | Container runtime |
REGISTRY_PORT |
5001 | Registry port |
ZONES |
0 | Number of zones |
NODES_PER_ZONE |
1 | Workers per zone |
docker tag my-app:latest localhost:5001/my-app:latest
docker push localhost:5001/my-app:latest
kubectl run my-app --image=localhost:5001/my-app:latest- Docker or Podman
- curl, bash 4.0+
Kind and kubectl are installed automatically if missing.