Vanilla (Kind)
Kind (Kubernetes in Docker) runs upstream Kubernetes clusters using Docker containers as nodes. It is fast (30ā60 s), Docker-only, and uses standard kind.yaml files with no vendor lock-in. For common workflows and use cases, see Use Cases.
Quick Start
Section titled āQuick StartāRequires Docker (installation prerequisites).
ksail cluster init --name my-cluster --distribution Vanilla --control-planes 1 --workers 2ksail cluster createksail cluster info && kubectl get nodes # verifyksail cluster delete # cleanupksail cluster init creates ksail.yaml (KSail config) and kind.yaml (Kind cluster config).
Configuration
Section titled āConfigurationāBasic Configuration
Section titled āBasic ConfigurationāThe ksail.yaml file controls your cluster:
# yaml-language-server: $schema=https://raw.githubusercontent.com/devantler-tech/ksail/main/schemas/ksail-config.schema.jsonapiVersion: ksail.io/v1alpha1kind: Clusterspec: cluster: distribution: Vanilla distributionConfig: kind.yamlKind-Specific Configuration
Section titled āKind-Specific ConfigurationāCustomize Kind behavior in kind.yaml:
kind: ClusterapiVersion: kind.x-k8s.io/v1alpha4nodes: - role: control-plane # Port mapping for accessing services extraPortMappings: - containerPort: 80 hostPort: 8080 protocol: TCP - role: worker - role: workerLoadBalancer Support
Section titled āLoadBalancer SupportāEnable LoadBalancer services with Cloud Provider KIND:
apiVersion: ksail.io/v1alpha1kind: Clusterspec: cluster: distribution: Vanilla loadBalancer: EnabledWhen enabled, KSail installs Cloud Provider KIND, which creates cpk-* Docker containers as LoadBalancer proxies and assigns external IPs. See LoadBalancer Configuration for details.
Registry Mirrors
Section titled āRegistry MirrorsāKSail enables docker.io, ghcr.io, quay.io, and registry.k8s.io mirrors by default. The --mirror-registry flag uses replace semantics: any values you provide completely replace the full default list, so omitting a registry removes it. To customize mirrors while keeping the defaults, include all four:
ksail cluster init --name my-cluster --distribution Vanilla \ --mirror-registry 'docker.io=https://registry-1.docker.io' \ --mirror-registry 'ghcr.io=https://ghcr.io' \ --mirror-registry 'quay.io=https://quay.io' \ --mirror-registry 'registry.k8s.io=https://registry.k8s.io'Troubleshooting
Section titled āTroubleshootingā1. Cluster Creation Fails
Section titled ā1. Cluster Creation FailsāSymptom: ksail cluster create fails with Docker errors.
docker ps # Verify Docker is runningdf -h # Check disk spacedocker system prune -fksail cluster create2. Nodes Not Ready
Section titled ā2. Nodes Not ReadyāSymptom: kubectl get nodes shows NotReady status.
kubectl describe node <node-name>kubectl get pods -n kube-system | grep ciliumkubectl rollout restart daemonset/cilium -n kube-system3. LoadBalancer Stuck in Pending
Section titled ā3. LoadBalancer Stuck in PendingāSymptom: LoadBalancer service never gets EXTERNAL-IP. Ensure loadBalancer: Enabled is set in ksail.yaml, then run ksail cluster update. See LoadBalancer Configuration.
4. Port Already in Use
Section titled ā4. Port Already in UseāSymptom: address already in use error during cluster creation. List and delete conflicting Kind clusters:
kind get clusterskind delete cluster --name <conflicting-cluster>5. Out of Memory or Disk Space
Section titled ā5. Out of Memory or Disk SpaceāSymptom: Cluster creation fails with resource errors.
ksail cluster init --name my-cluster --distribution Vanilla --control-planes 1 --workers 0# WARNING: removes ALL unused images and volumes ā can affect other Docker projectsdocker system prune -a --volumesAdvanced Topics
Section titled āAdvanced TopicsāMulti-Node Clusters
Section titled āMulti-Node ClustersāCreate production-like topologies:
ksail cluster init --name multi-node --distribution Vanilla --control-planes 3 --workers 5Kubernetes Version Selection
Section titled āKubernetes Version SelectionāSet the node image in kind.yaml to pin a Kubernetes version. Check Kind release notes for available images. Edit the nodes: section of the generated kind.yaml:
# kind.yaml (partial ā nodes: section)nodes: - role: control-plane image: kindest/node:v1.35.1 - role: worker image: kindest/node:v1.35.1Custom CNI
Section titled āCustom CNIāOverride the default CNI:
ksail cluster init --name my-cluster --distribution Vanilla --cni CalicoPort Mappings
Section titled āPort MappingsāExpose services on host ports. Edit the nodes: section of the generated kind.yaml:
# kind.yaml (partial ā nodes: section)nodes: - role: control-plane extraPortMappings: - containerPort: 30080 # NodePort service hostPort: 8080 protocol: TCPAccess services at http://localhost:8080.
Storage Configuration
Section titled āStorage ConfigurationāEnable persistent storage:
ksail cluster init --name my-cluster --distribution Vanilla --csi EnabledIntegration with Native Kind
Section titled āIntegration with Native KindāThe kind.yaml generated by ksail cluster init is standard Kind config ā use it directly without KSail:
kind create cluster --config kind.yamlkind export kubeconfig