Skip to content

kind

Recipe card from the charly-kubernetes plugin (Kinds — schema authoring).

kind – Kubernetes-in-Docker local clusters

Section titled “kind – Kubernetes-in-Docker local clusters”
Property Value
Install files charly.yml (binary fetch + engine-prepare script)
Pinned version v0.33.0 (edit KIND_VERSION in var: to cut over)
Binaries /usr/local/bin/kind, plus kubectl/helm from the required client candy
Depends on /charly-coder:kubernetes-layer (kubectl + helm)

Installs the pinned, sha256-verified kind release binary (from the Arch kind package on Arch, the upstream release asset elsewhere) plus a kind-engine-prepare script that makes the resolved container engine ready for kind’s node containers.

kind is host tooling. It provisions local Kubernetes clusters as node containers on the operator’s container engine, so it is composed by a target: local deploy on the host (or a box that runs kind inside).

Engine selection — KIND_EXPERIMENTAL_PROVIDER

Section titled “Engine selection — KIND_EXPERIMENTAL_PROVIDER”

The engine is charly’s own engine word (podman/docker/nerdctl), which maps 1:1 to kind’s KIND_EXPERIMENTAL_PROVIDER. The kindcluster: deploy’s engine: field (or the resolved engine.run) drives it; there is no separate selector.

Per-engine preconditions (all handled by kind-engine-prepare)

Section titled “Per-engine preconditions (all handled by kind-engine-prepare)”
Engine Precondition
docker A reachable daemon (rootless or rootful). Nothing else.
rootless podman cgroup v2 + a log driver kind can tail (k8s-file); raised pids/inotify limits.
rootless nerdctl Rootless containerd running (containerd-rootless-setuptool.sh install).

kindnet is kind’s CNI; there is no Traefik and no ServiceLB, so the kube: addons check verb (which waits on the k3s addon stack) does NOT apply to a kind cluster — use nodes/wait-nodes/pods/wait-ready/ storageclass/raw instead. The StorageClass is standard (rancher local-path, in the local-path-storage namespace).

The candy is the host-tooling leg of the kindcluster substrate. A kindcluster: template provisions the cluster (engine / node_image / nodes); a from: deploy runs an optional workload applied with kubectl apply -k. The word is kindcluster, NOT kind — the bare word collides with the schema’s own source: {kind: …} discriminator and with kind’s own kind: Cluster config field.

kind nodes have their own image store, separate from the host engine’s. A locally-built image must be loaded in — and kind load docker-image is BROKEN on podman (measured: “image not present locally” despite the image existing). The provider uses the engine-agnostic kind load image-archive path, so it works on docker, podman, and nerdctl.

kind delete cluster --name <cluster> — engine-scoped (the provider sets KIND_EXPERIMENTAL_PROVIDER, since kind get/delete cluster is engine-scoped: names are unique only WITHIN an engine), and idempotent on a missing cluster.

# charly.yml -- the host tooling profile
kind-host:
local:
candy:
- kind
# a kindcluster template + deploy (see [/charly-kubernetes:kubernetes](/recipes/kubernetes/kubernetes/))
kind-lab-cluster:
kindcluster:
engine: podman
node_image: kindest/node:v1.37.0@sha256:a1ed56cfb0e7b93589bdf97c8cd566405a265939e3620fc4f5de89adff580ae5
nodes:
- role: control-plane
extra_port_mappings:
- container_port: 30080
host_port: 30080
- role: worker
kind-lab:
kindcluster:
from: kind-lab-cluster
image: my-app # optional workload, applied via `kubectl apply -k`
disposable: true # if it is a check bed
Terminal window
charly deploy add kind-host --target local # install kind on the host
charly deploy add kind-lab --target kindcluster
kubectl --context kind-lab get nodes

Build-scope: kind version matches the pin; /usr/local/bin/kind is mode 0755; the node-image pin file content; the engine-prepare script is executable and sh -n clean; kubectl version --client exits 0.