Skip to content
Switch branches/tags

Latest commit


Git stats


Failed to load latest commit information.
Latest commit message
Commit time


Build Status GoDoc

Want to mess around with Kubernetes, but don't want to spend an ocean on hardware?

Maybe you need a ctlptl.

What is ctlptl?

ctlptl (pronounced "coddle poodle") is a CLI for declaratively setting up local Kubernetes clusters.

Inspired by kubectl and ClusterAPI's clusterctl, you declare your local cluster with YAML and use ctlptl to set it up.

How do I install it?

Install your cluster of choice: Docker for Desktop, Kind, or Minikube. Then run:

Homebrew (Mac/Linux)

brew install tilt-dev/tap/ctlptl

Scoop (Windows)

scoop bucket add tilt-dev
scoop install ctlptl

Alternative Options

If automatic installers aren't your cup of tea, check out the installation appendix for more options.

How do I use it?

ctlptl supports 4 major commands:

  • ctlptl get - see all running clusters
  • ctlptl create cluster [product] - create a cluster and make it the current kubectl context
  • ctlptl apply -f cluster.yaml - ensure a cluster exists, or create one
  • ctlptl delete -f cluster.yaml - delete a cluster and its state


Docker for Mac: Enable Kubernetes and set 4 CPU


ctlptl docker-desktop open
ctlptl create cluster docker-desktop --min-cpus=4

or ensure exists:

cat <<EOF | ctlptl apply -f -
kind: Cluster
product: docker-desktop
minCPUs: 4

Docker for Mac: Reset and shutdown Kubernetes

ctlptl delete cluster docker-desktop
ctlptl docker-desktop quit

KIND: with a built-in registry at a random port


ctlptl create cluster kind --registry=ctlptl-registry

or ensure exists:

cat <<EOF | ctlptl apply -f -
kind: Cluster
product: kind
registry: ctlptl-registry

Then fetch the URL to push images to with:

ctlptl get cluster kind-kind -o template --template '{{}}'

KIND: with a built-in registry at a pre-determined port


ctlptl create registry ctlptl-registry --port=5005
ctlptl create cluster kind --registry=ctlptl-registry

or ensure exists:

cat <<EOF | ctlptl apply -f -
kind: Registry
name: ctlptl-registry
port: 5005
kind: Cluster
product: kind
registry: ctlptl-registry

Minikube: with a built-in registry at Kubernetes v1.18.8


ctlptl create cluster minikube --registry=ctlptl-registry --kubernetes-version=v1.18.8

or ensure exists:

cat <<EOF | ctlptl apply -f -
kind: Cluster
product: minikube
registry: ctlptl-registry
kubernetesVersion: v1.18.8


For more details, see:

Why did you make this?

At Tilt, we want to make Kubernetes a nice environment for local dev.

We found ourselves spending too much time helping teams debug misconfigurations in their dev environment.

We wrote docs like Choosing a local dev cluster and example repos like kind-local, minikube-local, and k3d-local to help people get set up.

ctlptl is a culmination of what we've learned.



  • Docker for Mac
  • Docker for Windows
  • KIND and KIND with a registry
  • Minikube and Minikube with a registry
  • Creating a cluster on a Remote Docker Host (useful in CI environments like CircleCI)
  • Allocating CPUs

Future Work

  • K3D
  • Microk8s
  • Allocating Memory
  • Allocating Storage


ctlptl is a work in progress!

We welcome contributions from the Kubernetes community to help make this better.

We expect everyone -- users, contributors, followers, and employees alike -- to abide by our Code of Conduct.


  • To support common local cluster setup operations, like create, delete, and reset

  • To interoperate well with all local Kubernetes solutions, including docker-desktop, kind, minikube, k3d, or microk8s

  • To connect other resources to a local cluster, like image registries, storage, and CPU/memory

  • To help infra engineers manage a consistent dev environment

  • To encourage standards that enable interop between devtools, like KEP 1755


  • ctlptl is NOT a Kubernetes setup approach that competes with kind or minikube, but rather complements these tools.

  • ctlptl is NOT intended to help you setup a remote cluster, or a remote dev sandbox. If you want to declaratively set up prod clusters, check out clusterapi.


ctlptl sends anonymized usage statistics, so we can improve it on every platform. Opt out with ctlptl analytics opt out.


Copyright 2020 Windmill Engineering

Licensed under the Apache License, Version 2.0