Azure Kubernetes Service (AKS) provisioner backend
Provision Nora agents into Azure Kubernetes Service (AKS) using Nora’s generic Kubernetes adapter and Admin cluster registry.AKS uses the same Kubernetes adapter as every Kubernetes provider. Nora stores provider, namespace, exposure, and load-balancer settings on the Admin cluster row;
docker-compose.kubernetes.yml only mounts kubeconfig files into the control-plane containers.
Step-by-step setup
1. Prerequisites
- Azure subscription with permission to create AKS clusters.
- An existing AKS cluster (or create one — Azure Portal → Kubernetes services → Create).

2. Install and log in with Azure CLI
Install the Azure CLI on the host that runs Nora, then authenticate against the Azure subscription that owns the AKS cluster. Azure Cloud Shell already includesaz, but the kubeconfig file still needs to be saved on the Nora host.
3. Install kubectl
Installkubectl on the same host where you will run Nora setup and verification commands. For AKS, the shortest path is Azure CLI’s Kubernetes tool installer:
4. Create the kubeconfig

5. Verify access from the host
6. Configure Nora
Set the generic Kubernetes mount variable in.env:
NORA_KUBECONFIGS_DIR and use Admin paths such as /kubeconfigs/aks-eastus2 and /kubeconfigs/aks-westus2.
7. Start the stack
8. Register this cluster in Admin
Open Admin -> Kubernetes, click Add cluster, and use these values:| Field | Value |
|---|---|
| Cluster id | aks-eastus2 |
| Label | AKS East US 2 |
| Provider | AKS |
| Actual cluster name | The Azure AKS cluster name, for example nora-dns-vjb9kjjz |
| Credential mode | Mounted kubeconfig path |
| Kubeconfig path | /kubeconfigs/aks-eastus2 |
| Fallback namespace | nora-openclaw-agents |
| OpenClaw namespace | nora-openclaw-agents |
| Hermes namespace | nora-hermes-agents |
| Exposure mode | LoadBalancer |
| Service annotations JSON | {} for public load balancers, or {"service.beta.kubernetes.io/azure-load-balancer-internal":"true"} for internal load balancers |
| Source ranges | Your Nora control-plane egress CIDR when you can restrict access |
| Load balancer class | Leave empty for normal AKS Services |
./.secrets/aks-kubeconfig in the Admin Kubeconfig path when Nora runs in Docker Compose. That is the host-side path; the containers see files from NORA_KUBECONFIGS_DIR under /kubeconfigs.
9. Deploy test agents
Open the dashboard athttp://127.0.0.1:8080, sign in, and create an OpenClaw agent with the AKS cluster label you registered. To validate Hermes on AKS, create a second agent with Runtime = Hermes and the same AKS execution target.



AKS Service options
For a public load balancer, leave Service annotations JSON empty and restrict access with Source ranges when possible. For an internal AKS load balancer:
Verification

Automated smoke
Once your AKS kubeconfig is in place, run the shared lifecycle smoke. The AKS script deploys both OpenClaw and Hermes by default:K8S_SMOKE_RUNTIME_FAMILIES=openclaw for a single-runtime check, or KEEP_ENV=true to leave the stack running after the script finishes.
Promote to production
Once the smoke is green, switch from the dev-mode stack to the prod-mode stack. The only changes vs the testing setup are nginx (public config + TLS) and Compose mode (infra/docker-compose.public-tls.yml for prod Dockerfiles, TLS mounts, public ports, and restart policies).
1. Tighten the LoadBalancer source ranges
Replace the smoke-time<nora-control-plane-egress-cidr> placeholder with your production control plane’s actual egress CIDR (e.g. the public IP of the host running Nora). Combine with internal-LB annotations if you’re keeping agents on a private subnet.
2. Switch nginx to public + TLS
In.env:
3. Stop the smoke-mode stack
4. Start the prod-mode stack
5. Confirm
running and the AKS LoadBalancer assigns an external IP.

