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âCreate your first Vanilla cluster in under 60 seconds.
Prerequisites
Section titled âPrerequisitesâ- Docker Desktop or Docker Engine installed and running
docker pscommand works
Step 1: Initialize Project
Section titled âStep 1: Initialize Projectâksail cluster init \ --name my-cluster \ --distribution Vanilla \ --control-planes 1 \ --workers 2This creates:
ksail.yamlâ KSail configurationkind.yamlâ Kind-specific cluster configuration
Step 2: Create Cluster
Section titled âStep 2: Create Clusterâksail cluster createStep 3: Verify Cluster
Section titled âStep 3: Verify Clusterâksail cluster infokubectl get nodesStep 4: Cleanup
Section titled âStep 4: Cleanupâ# Delete cluster and all resourcesksail cluster deleteConfiguration
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: worker
# Containerd configurationcontainerdConfigPatches: - |- [plugins."io.containerd.grpc.v1.cri".registry.mirrors."localhost:5000"] endpoint = ["http://localhost:5000"]LoadBalancer 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âConfigure registry mirrors to avoid rate limits. KSail enables docker.io, ghcr.io, quay.io, and registry.k8s.io mirrors by default. Override with --mirror-registry flags:
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'KSail injects containerd registry configuration into all Kind nodes.
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.
kubectl get pods -A | grep cloud-provider-kindcat ksail.yaml | grep -A2 loadBalancerksail cluster update4. Port Already in Use
Section titled â4. Port Already in UseâSymptom: address already in use error during cluster creation.
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âKind determines the Kubernetes version via the node image tag. To use a specific version, configure the node image in your kind.yaml:
kind: ClusterapiVersion: kind.x-k8s.io/v1alpha4nodes: - role: control-plane image: kindest/node:v1.31.0 - role: worker image: kindest/node:v1.31.0Supported versions: Check Kind release notes for image availability.
Custom CNI
Section titled âCustom CNIâOverride default CNI:
ksail cluster init --name my-cluster --distribution Vanilla --cni CalicoAvailable CNI options: Default, Cilium, Calico.
Port Mappings
Section titled âPort MappingsâExpose services on host ports:
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âKSail generates a standard kind.yaml in your project directory (created by ksail cluster init). You can use the Kind CLI directly with that fileâconfigurations are portable and there is no vendor lock-in. KSail can also interact with any Kind cluster accessible via your kubeconfig.
# Run from the directory containing the generated kind.yamlkind create cluster --config kind.yamlkind export kubeconfig --name my-cluster