Skip to main content

Kubernetes provisioner backend

Run Nora agents as Kubernetes Deployments and Services through the generic k8s execution target.
The Kubernetes backend is provider-neutral. Nora reads a kubeconfig, creates a namespace if needed, schedules one Deployment per agent, and creates one Service per agent. OpenClaw Services expose the runtime and gateway ports; Hermes Services expose the runtime and dashboard ports. During stop/start/restart, Nora patches the existing Kubernetes Deployment for the selected cluster and uses stored namespace hints from the agent host when needed. During delete or redeploy, Nora deletes the previous Deployment, Service, and bootstrap ConfigMap before removing or replacing the control-plane runtime reference. These lifecycle paths run through the same shared adapter for K3s, AKS, GKE, EKS, and generic Kubernetes clusters. Stopping an agent scales its Deployment to 0 replicas. Cloud consoles such as AKS can still show the zero-replica Deployment itself as OK because the object is healthy and matching its desired state; verify stop by checking that desired/ready replicas are 0 and that no pods remain for the agent. Use delete or redeploy when the Deployment and Service objects should be removed. The agent Overview tab shows the live Kubernetes pod replica snapshot in the Details block: desired, current, ready, available, and updated counts from the Deployment.
Kubernetes agent detail

Agent detail — Kubernetes runtime status, replica counts, and Service address

Configuration

Two Kubernetes install models are supported. (1) Nora runs in Docker Compose and provisions agents into one or more registered clusters via mounted kubeconfigs (this page). (2) Run the Nora control plane itself inside Kubernetes with the official Helm chart at infra/helm/nora — see the Kubernetes (Helm) section of Self-hosting. Under Helm the chart sets ENABLED_BACKENDS=k8s and mounts agent kubeconfigs via kubeconfigs.existingSecret.
Register Kubernetes clusters in Admin -> Kubernetes. Nora does not create a Kubernetes execution target from .env; each enabled Admin row with a passing connection test becomes a concrete execution target such as k8s:aks-eastus2. For production, prefer a scoped identity or service account with the permissions below instead of a broad cluster-admin kubeconfig.

Cluster registry

Open Admin -> Kubernetes and register one row per cluster. Enabled rows appear in the operator Deploy page as separate execution targets only after the latest Admin Test result is ok: Agents deployed to a registry entry keep deploy_target=k8s and store the selected cluster in execution_target_id.

Admin registry setup

Use clear labels so the Deploy page can show a named cluster such as AKS East US 2 instead of a generic Kubernetes target.
1

Make sure the kubeconfig is mounted into Nora

With docker-compose.kubernetes.yml, NORA_KUBECONFIGS_DIR is mounted into both backend-api and worker-provisioner as /kubeconfigs. Put one kubeconfig file in that directory for each cluster Nora should control.The value used in the Admin form is the container path, not the host path.
2

Open the Admin Kubernetes page

Sign in as an admin and open Admin -> Kubernetes. Click Add cluster.
3

Fill the cluster identity fields

Use stable values that make the Deploy page obvious to operators:
4

Select the credential mode

For an AKS kubeconfig copied to ./.secrets/kubeconfigs/aks-eastus2, use:Do not enter ./.secrets/aks-kubeconfig in this field unless Nora is running directly on the host without Docker. In Compose, always use the path under /kubeconfigs.
5

Set namespaces and exposure

For AKS LoadBalancer deployments:
6

Save, test, then deploy

Save the cluster, click Test, then open the operator Deploy page. Nora hides failed, untested, and disabled Kubernetes clusters from Deploy for both OpenClaw and Hermes. Once the latest test is ok, the execution target appears as k8s:aks-eastus2 internally and as the label you configured in the UI.
Kubernetes target selected

Nora deploy wizard — Kubernetes execution target selected from the Admin registry

For several Kubernetes clusters at once, use one Admin registry row per cluster. Mounted-path mode uses files under NORA_KUBECONFIGS_DIR, which is mounted at /kubeconfigs in both containers. For simpler multi-cluster setup, use Encrypted kubeconfig mode and paste each kubeconfig into its registry row; that requires a valid ENCRYPTION_KEY.

Provider quick values

Use these starting values when adding named clusters in Admin -> Kubernetes. Adjust labels, actual cluster names, CIDRs, and provider-specific Service options to match the real cluster. If you paste kubeconfig content instead of mounting a file, select Encrypted kubeconfig and leave the path field empty. That mode is often simpler when Nora controls several cloud clusters from the same Compose stack.

Exposure modes

Set these fields on the Admin cluster row: NodePort example: LoadBalancer example:

Service customization

Provider-specific Service annotations are saved in the Admin Service annotations JSON field:
The Admin Source ranges field accepts comma-separated CIDRs. Use it to restrict cloud load balancers to the Nora control-plane egress IP whenever possible. The Admin Load balancer class field is copied to the Service loadBalancerClass field in load-balancer mode.

RBAC expectations

The kubeconfig identity needs permissions in the Admin fallback namespace and in any runtime-specific OpenClaw or Hermes namespaces to:
  • Create and read Namespaces.
  • Create, read, patch, and delete Deployments.
  • Create, read, and delete Services.
  • Create, read, update, and delete ConfigMaps.
  • List Pods for logs and terminal attachment.
  • Read Pod logs.
  • Create Pod exec sessions for runtime env sync and Hermes dashboard recovery.

Provider guides