GKE Kubernetes provisioner backend
Provision Nora agents into Google Kubernetes Engine using Nora’s generic Kubernetes adapter and Admin cluster registry.GKE 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
- GCP project with the Kubernetes Engine API enabled.
gcloudCLI installed andgcloud auth logincompleted.- An existing GKE cluster (or create one — GCP Console → Kubernetes Engine → Clusters → Create).
kubectlinstalled on the host that runs Nora.

2. Create the kubeconfig
--zone <zone> instead of --region <region> for zonal clusters. You can copy the exact command from the cluster’s Connect dialog.

3. Verify access from the host
4. Configure Nora
Set the generic Kubernetes mount variable in.env:
NORA_KUBECONFIGS_DIR and use Admin paths such as /kubeconfigs/gke-us-central1 and /kubeconfigs/gke-us-east1.
Confirm region / VPC alignment in the Console’s Networking tab before exposing services to the public internet.

5. Start the stack
6. Register this cluster in Admin
Open Admin -> Kubernetes, click Add cluster, and use these values:| Field | Value |
|---|---|
| Cluster id | gke-us-central1 |
| Label | GKE US Central 1 |
| Provider | GKE |
| Actual cluster name | The GKE cluster name from the Console |
| Credential mode | Mounted kubeconfig path |
| Kubeconfig path | /kubeconfigs/gke-us-central1 |
| Fallback namespace | nora-openclaw-agents |
| OpenClaw namespace | nora-openclaw-agents |
| Hermes namespace | nora-hermes-agents |
| Exposure mode | LoadBalancer |
| Service annotations JSON | Leave empty unless your cluster policy requires annotations such as {"cloud.google.com/l4-rbs":"enabled"} |
| Source ranges | Your Nora control-plane egress CIDR when you can restrict access |
| Load balancer class | Leave empty by default, or use networking.gke.io/l4-regional-external when your cluster supports it |
./.secrets/gke-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.
7. Deploy a test agent
Open the dashboard athttp://127.0.0.1:8080, sign in, and create an agent with the GKE cluster label you registered.



GKE Service options
The default GKELoadBalancer Service path works without annotations. To request GKE’s external passthrough Network Load Balancer with RBS on supported cluster versions, set:
Set the Admin Load balancer class field to networking.gke.io/l4-regional-external.
For clusters that use the annotation path instead of loadBalancerClass:
Verification

Automated smoke
Once your GKE kubeconfig is in place, run the shared lifecycle smoke: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 egress CIDR. Combine with cloud.google.com/load-balancer-type: Internal 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 GKE LoadBalancer assigns an external IP.

