Skip to content

Cluster Lifecycle

kinder pause, kinder resume, and kinder status are the three commands that manage a cluster’s runtime state without recreating it. Pause stops every node container in quorum-safe order so the host can reclaim CPU and RAM. Resume brings them back in the reverse order and gates on all-nodes-Ready before returning. Status reports current cluster + per-node container state.

All three commands accept the cluster name as a positional argument or via --name. If neither is given and exactly one cluster exists, that cluster is auto-selected.

kinder pause [cluster-name] [flags]

Gracefully stops every node container. Workers stop first, then control-plane nodes, then the load balancer (HA only). Cluster state — pods, PVCs, services, node identities, etcd data — survives the pause.

FlagDefaultDescription
--timeout30sPer-container graceful stop timeout before SIGKILL is sent. Generous default leaves room for kubelet/etcd flush. Accepts Go duration strings (30s, 2m)
--jsonfalseOutput a JSON object describing per-node stop results
Terminal window
# Pause the default "kind" cluster
kinder pause
# Pause a named cluster
kinder pause my-cluster
# Pause with a longer graceful-stop window
kinder pause my-cluster --timeout 2m
# JSON output for scripted consumers
kinder pause my-cluster --json

On a multi-control-plane cluster, kinder pause captures /kind/pause-snapshot.json containing the etcd leader ID before stopping any container. This lets cluster-resume-readiness (run by kinder resume and kinder doctor) detect quorum risk on resume. The snapshot is best-effort — failures log a warning but do not abort the pause.

Calling kinder pause on an already-paused cluster is a no-op that logs a warning and returns success. The same applies if a pre-existing pause was incomplete; surviving running containers are stopped on re-invocation.


kinder resume [cluster-name] [flags]

Restarts every node container in the reverse order — load balancer first, then control-plane nodes, then workers — and waits for all nodes to report Ready before returning. On HA clusters, the cluster-resume-readiness doctor check runs inline between control-plane start and worker start so you see a quorum warning before workers are wedged into a degraded etcd.

FlagDefaultDescription
--timeout30sPer-container graceful start timeout. Accepts Go duration strings
--wait5mMaximum time to wait for all nodes Ready after start. Set to 0s to skip the readiness gate
--jsonfalseOutput a JSON object describing per-node start results and final cluster status
Terminal window
# Resume the default cluster, wait up to 5 minutes for Ready
kinder resume
# Resume a named cluster with a longer wait window
kinder resume my-cluster --wait 10m
# Resume without waiting (returns as soon as containers are started)
kinder resume my-cluster --wait 0s
# JSON output
kinder resume my-cluster --json

kinder resume polls kubectl get nodes --no-headers until all nodes report Ready or --wait elapses. The gate uses a built-in selector fallback (control-planemaster) so it works with K8s 1.24 clusters that still use the legacy label.

If any container fails to start, the readiness probe is skipped (no point waiting for a known-incomplete cluster) and the aggregated start errors are returned directly.


kinder status [cluster-name] [flags]

Reports the cluster’s overall state plus per-node container state. Useful for confirming what shape a cluster is in after pause / resume cycles or before running snapshot.

FlagDefaultDescription
--output"" (text)Output format. Pass json for machine-readable output
ValueMeaning
RunningAll node containers are running
PausedEvery node container is in exited or paused state (typical post-kinder pause)
MixedSome containers running, some not — usually a partial pause/resume failure
NotFoundNo cluster with this name exists
Terminal window
# Default text output
kinder status my-cluster
# Cluster: my-cluster Status: Running
# my-cluster-control-plane running
# my-cluster-worker running
# JSON output for scripts
kinder status my-cluster --output json

The same Status column also appears on kinder get clusters (one line per cluster) and on kinder get nodes (per-node STATUS column derived from container-runtime state).


kinder pause, kinder resume, and kinder status all read the underlying container-runtime state directly via docker inspect (or the equivalent for podman / nerdctl). The mapping from runtime state to user-visible Status is:

Container stateReported as
runningReady (on get nodes) / Running (on cluster Status)
exited, createdStopped
paused (docker pause, distinct from kinder pause)Paused
anything else, or inspect errorUnknown

Note that kinder pause uses docker stop (graceful SIGTERM → SIGKILL) — not docker pause (cgroup freeze). The reason is that resume time matters more than nanosecond-precise pause time for a local dev cluster, and docker stop lets etcd flush state cleanly.