Kind provisioner backend
Local-only Kubernetes provisioner for development and CI. Not for production.Kind uses the same generic
k8s backend id as every Kubernetes provider. Nora ships a single Kubernetes adapter (workers/provisioner/backends/k8s.ts) that serves Kind, K3s, AKS, GKE, and EKS — only the kubeconfig and exposure mode change.
When to use Kind
- Local development of Nora itself, or local exercise of the Kubernetes adapter on a laptop.
- CI smoke runs that need a real Kubernetes API without a cloud account.
- Quick regression checks before promoting changes to a K3s or cloud cluster.
- Hosting agents you depend on — Kind clusters live and die with the local Docker daemon.
- Modeling cloud
LoadBalancerbehavior — Kind only supports NodePort routing in this overlay. - Multi-node or multi-host scheduling — the bundled Kind config is single control-plane.
Step-by-step setup
1. Prerequisites
kind itself is auto-installed by e2e/scripts/ensure-kind-tools.sh when the smoke script runs.
2. Run the smoke script
The recommended path is the bundled smoke. It creates or reuses a Kind cluster, exports kubeconfigs for both the host and the in-container view, starts the Nora API and provisioner withdocker-compose.kubernetes.yml plus the Kind network helper, registers the cluster in Admin, deploys an agent, verifies Kubernetes objects, and exercises stop/start/restart lifecycle.
KEEP_ENV=true to leave the cluster and Compose stack running after the script finishes.
3. Inspect the deployed agent in the Nora UI
WithKEEP_ENV=true, open the dashboard at the API base URL the smoke script prints (defaults to http://127.0.0.1:4110) and pick a deployed agent from the fleet view to see its Kubernetes-flavored detail page.



Manual stack (without the smoke script)
| Field | Value |
|---|---|
| Credential mode | Mounted kubeconfig path |
| Kubeconfig path | /kubeconfigs/nora-kind.container.kubeconfig |
| Exposure mode | NodePort |
| Runtime host | host.docker.internal, or the Kind control-plane container name on Linux |
| Runtime node port | 30909 |
| Gateway node port | 31879 |
host.docker.internal support, set it to the Kind control-plane container name (nora-kind-control-plane by default) and join the kind Docker network.
Register local Kind in Admin
Open Admin -> Kubernetes, click Add cluster, and use these values:| Field | Value |
|---|---|
| Cluster id | kind-local |
| Label | Kind Local |
| Provider | Generic Kubernetes |
| Actual cluster name | The Kind cluster name, for example nora-kind |
| Credential mode | Mounted kubeconfig path |
| Kubeconfig path | /kubeconfigs/nora-kind.container.kubeconfig |
| Fallback namespace | openclaw-agents |
| OpenClaw namespace | openclaw-agents |
| Hermes namespace | openclaw-agents |
| Exposure mode | NodePort |
| Runtime host | host.docker.internal, or the Kind control-plane container name on Linux if you joined the kind Docker network |
| Runtime node port | 30909 for the bundled Kind overlay |
| Gateway node port | 31879 for the bundled Kind overlay |
/tmp/nora-kind.container.kubeconfig in the Admin Kubeconfig path when Nora runs in Docker Compose. That is the host-side CONTAINER_KUBECONFIG_PATH; the containers see it under /kubeconfigs.
Verification
{"ok":true,...} on success. Per-agent objects follow the generated naming convention nora-oclaw-<agent-name>-<suffix> in the openclaw-agents namespace.
If the agent reaches running but the gateway is unreachable, confirm the NodePort values match the port mappings in infra/kind/nora-kind.yaml.


