Local Kubernetes Development with KSail and Kind
Getting started with Kubernetes development shouldn’t require cloud infrastructure or complex setup procedures. With Kind (Kubernetes in Docker) and KSail, you can have a local cluster running in under a minute. This post shows you how.
Why Kind + KSail?
Section titled “Why Kind + KSail?”Kind (Kubernetes in Docker) runs Kubernetes clusters using Docker containers as nodes. It’s fast, lightweight, and provides a vanilla Kubernetes experience that closely matches production environments.
KSail wraps Kind and other tools into a single binary, giving you one consistent interface for cluster provisioning, GitOps setup, and workload management. Instead of learning multiple CLIs, you use ksail cluster and ksail workload commands.
Together, they provide:
- Fast iteration — Clusters start in under 60 seconds
- Zero cost — Everything runs locally on your machine
- Vanilla Kubernetes — No distribution-specific quirks to learn
- Declarative configuration — Everything as code in
ksail.yaml
Prerequisites
Section titled “Prerequisites”You need Docker installed and running. Verify with:
docker psIf this command works, you’re ready to go.
Step 1: Install KSail
Section titled “Step 1: Install KSail”KSail is distributed as a single binary. Install via Homebrew:
brew install --cask devantler-tech/tap/ksailOr with Go:
go install github.com/devantler-tech/ksail/v5@latestVerify the installation:
ksail --versionStep 2: Scaffold Your Cluster Project
Section titled “Step 2: Scaffold Your Cluster Project”KSail’s init command scaffolds a complete project structure:
mkdir my-cluster && cd my-clusterksail cluster init --distribution VanillaThis creates ksail.yaml (cluster configuration), kind.yaml (Kind config), and k8s/ (your Kubernetes manifests).
For all available flags and configuration options, see the KSail documentation:
- CLI flags reference — All
cluster initoptions - ksail.yaml reference — Configuration file schema
- Features overview — CNI, CSI, GitOps, and more
Step 3: Create the Cluster
Section titled “Step 3: Create the Cluster”Create and start your cluster:
ksail cluster createThis command:
- Creates Docker containers as Kubernetes nodes
- Bootstraps the Kubernetes control plane
- Installs your selected CNI, CSI, and other components
- Configures your local kubeconfig
The process takes under 60 seconds for a single-node cluster.
Step 4: Working with Your Cluster
Section titled “Step 4: Working with Your Cluster”Once your cluster is running, KSail provides commands for common operations:
ksail cluster info # Show cluster statusksail cluster list # List all KSail-managed clustersksail cluster connect # Open K9s for interactive managementksail cluster stop # Stop the clusterksail cluster start # Start a stopped clusterYour kubeconfig is automatically configured, so standard kubectl commands work too.
For the full command reference, see Cluster Commands.
Step 5: Deploying Workloads
Section titled “Step 5: Deploying Workloads”KSail wraps kubectl and GitOps operations under the workload command:
ksail workload apply -k ./k8s # Apply manifests (kubectl workflow)ksail workload push # Push to GitOps sourceksail workload reconcile # Trigger GitOps reconciliationFor the full workload command reference, see Workload Commands.
Cleaning Up
Section titled “Cleaning Up”When you’re done:
ksail cluster deleteThis removes the Docker containers and cleans up kubeconfig entries.
What’s Next
Section titled “What’s Next”Explore the KSail documentation for advanced topics including:
- Adding Cilium or Calico as your CNI
- Enabling GitOps with Flux or ArgoCD
- Secret management with SOPS
- Mirror registries to avoid Docker Hub rate limits
If Kind’s vanilla Kubernetes feels too basic, check out the posts on K3s with KSail for a more batteries-included experience, or Talos with KSail for an immutable, security-focused distribution.
Feedback Welcome
Section titled “Feedback Welcome”KSail is under active development. If you encounter bugs or find missing features, please open an issue on GitHub. Your feedback helps improve the tool for everyone.
This blog post was written with the assistance of GitHub Copilot and Claude Opus 4.5.