Skip to main content

kindctl

Use repo/worktree-scoped kind clusters without touching the global kubeconfig. Trigger when users mention kind cluster, local k8s, local Kubernetes, spin up a cluster, Kubernetes-in-Docker, multi-repo kind, or multi-worktree cluster work.

Source facts

Repository
sozercan/kindctl
Last source activity
July 20, 2026 at 16:10
Detected SKILL.md language
English
Stars
4
Forks
0

Install options

The review-first prompt is selected by default. You can switch to a direct command or download a local copy.

Review the source files

Read SKILL.md and any companion files shown by SkillsMP before deciding whether to install.

Showing SKILL.md

SKILL.md
Source instructions · Read-only preview
name
kindctl
description
Use repo/worktree-scoped kind clusters without touching the global kubeconfig. Trigger when users mention kind cluster, local k8s, local Kubernetes, spin up a cluster, Kubernetes-in-Docker, multi-repo kind, or multi-worktree cluster work.
# kindctl Use this skill whenever work involves a local `kind` cluster, local k8s/Kubernetes, Kubernetes-in-Docker, or repo/worktree-specific test clusters. ## Mental model - `kind` clusters are global to the Docker daemon. - `~/.kube/config` is a shared mutable global and must not be used for kindctl-managed clusters. - `kindctl` derives a cluster name from the current repo/worktree path and stores its kubeconfig in `~/.kube/kind/<name>.kubeconfig`. - The current directory is enough: random repos and git worktrees do not need to know anything special. ## Golden rule for agents Never run bare `kubectl` or `helm` against a kindctl-managed cluster. Prefer: ```sh /Users/sozercan/projects/kindctl/bin/kindctl kubectl get nodes /Users/sozercan/projects/kindctl/bin/kindctl exec -- helm list ``` Do not run: ```sh kubectl get pods kubectl config use-context kind-something kind create cluster ``` ## Installation From the skill repository: ```sh make install-skill # symlink this repo to ~/.claude/skills/kindctl make install-cli # optional: symlink bin/kindctl to ~/.local/bin/kindctl ``` The skill itself should invoke `bin/kindctl` by absolute path or by resolving the skill directory. Do not rely on shell aliases. ## Commands ```sh kindctl create [--config F] [--tag T] [--k8s-version vX.Y.Z] kindctl delete [--tag T] kindctl kubectl [--tag T] <args...> kindctl exec [--tag T] -- <cmd...> kindctl path [--tag T] kindctl ctx [--tag T] kindctl env [--tag T] kindctl load [--tag T] <image> kindctl hibernate [--tag T] kindctl resume [--tag T] kindctl list [--workspace|--all] kindctl doctor kindctl prune --workspace [--yes] kindctl prune --dead [--yes] kindctl nuke [--yes] ``` If `kindctl` is not on `PATH`, use the absolute path: ```sh /Users/sozercan/projects/kindctl/bin/kindctl <command> ``` ## Recipes ### Create and use a repo cluster ```sh kindctl create kindctl kubectl get nodes kindctl kubectl get pods -A ``` ### Use a second cluster for the same repo ```sh kindctl create --tag e2e kindctl kubectl --tag e2e get nodes ``` Use the same `--tag` on every command that targets that cluster. ### Load a local image ```sh docker build -t myapp:dev . kindctl load myapp:dev kindctl kubectl set image deployment/myapp myapp=myapp:dev ``` ### Run helm, k9s, or other tools safely ```sh kindctl exec -- helm list -A kindctl exec -- k9s ``` ### Ingress For ingress, commit `.kind/cluster.yaml` in the target repo with explicit `extraPortMappings`. Example: ```yaml kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane extraPortMappings: - containerPort: 80 hostPort: 8080 protocol: TCP ``` Only one running cluster can bind a given host port. Use `kindctl hibernate` on other clusters or choose distinct host ports. ### Hibernate/resume after a work session or reboot ```sh kindctl hibernate kindctl resume kindctl doctor ``` ### Recover from failed setup If `.kind/setup.sh` fails, the cluster is preserved and registry status is `failed`. ```sh kindctl doctor kindctl exec -- kubectl get pods -A kindctl delete # if you want to recreate cleanly kindctl create ``` ### Delete safely ```sh kindctl delete ``` Bulk cleanup is registry-scoped and asks for confirmation unless `--yes` is passed: ```sh kindctl prune --workspace kindctl prune --dead kindctl nuke ``` ## Repo-specific `.kind/` Optional repo files: ```text .kind/cluster.yaml # native kind config: nodes, Kubernetes version, ports, mounts .kind/setup.sh # post-create setup: CRDs, ingress, namespaces, local images ``` Inside `.kind/setup.sh`, bare `kubectl` is okay because kindctl sets `KUBECONFIG` for that one hook process. Outside that hook, use `kindctl kubectl` or `kindctl exec`. ## Invariant No skill instruction should read, write, merge, or switch `~/.kube/config`. Every operation must use `kindctl` or a scoped kubeconfig path produced by `kindctl`.
View on GitHub