34. Deploying daalu-edge to your own cluster
This is the deepest chapter in this handbook. You’ll run helm install once. Beyond that, the customer-facing experience is
“the cluster row turns green.”
If you don’t operate a Kubernetes cluster yourself, you can skip this entire chapter — federation is opt-in.
Prerequisites
- A Kubernetes cluster you operate (k3s, EKS, GKE, AKS, whatever).
kubectlconfigured to talk to it, with permissions to install Helm charts into a new namespace.helmv3 installed locally.- Outbound HTTPS from the cluster to
hub.daalu.io:443and outbound WireGuard (UDP/51820) to the same. - A Daalu admin account in the tenant where you want this cluster to belong.
The outbound-only nature of the connection means your firewall doesn’t need any inbound holes.
Step 1: Generate a bootstrap invite
In the operator app:
- Managed infra → Clusters & observability → Onboard cluster.
- Pick a friendly name (e.g.,
acme-eu-prod). - Choose the tenant’s WireGuard subnet allocation. Default is fine.
- Click Generate invite. Daalu produces:
- A bootstrap token (single-use, expires in 1 hour).
- A copy-paste helm install command pre-filled with the token.
Copy the command. It looks like:
helm install daalu-edge oci://ghcr.io/daalu/charts/daalu-edge \
--namespace daalu-edge --create-namespace \
--set hub.url=https://hub.daalu.io \
--set bootstrap.token=<long-random-token>Step 2: Install the chart
Run the command. It deploys:
- daalu-wireguard-edge — the WireGuard pod.
- daalu-edge-bootstrap — a Job that exchanges the bootstrap token for a long-lived WireGuard configuration.
- Supporting Secret, ConfigMap, RBAC.
The bootstrap Job:
- POSTs the token to
hub.daalu.iowith the cluster’s freshly-generated WireGuard public key. - Receives back the WireGuard server endpoint and the IP address assigned to this cluster in the tenant’s subnet.
- Writes a Secret with the WireGuard config.
- Exits successfully.
The WireGuard pod consumes the Secret and brings up the tunnel. Within ~30 seconds you should see a successful handshake.
The edge also self-registers the cluster credential with Daalu in the same bootstrap: the chart creates a scoped ServiceAccount, and the edge reports its token so the hub can assemble the cluster’s Kubernetes access itself. You never hand-mint a token or paste a kubeconfig — and if you ever rebuild the cluster and re-onboard it, the fresh edge replaces its own stale credential automatically instead of stranding a dead one.
Step 3: Verify in the operator app
Back in Managed infra → Clusters & observability, the new row should be:
- Status: connected (green).
- Tunnel IP: a
10.200.0.xaddress. - Last handshake: <2 minutes ago.
Click the row for the detail page. Verify:
- The node list shows your cluster’s nodes.
- The “kubectl run” panel can execute
kubectl get nodesthrough the tunnel.
If any of this is off, see the troubleshooting section.
What got installed in your cluster
After Step 2, in the daalu-edge namespace you’ll have:
- A Deployment running the WireGuard pod (1 replica).
- A Secret holding the WireGuard private key.
- A ConfigMap with the public WireGuard config.
- A ServiceAccount the edge pod runs as.
- RBAC granting the SA permissions to talk to the API server on Daalu’s behalf.
The RBAC is scoped by default to:
- Read pods, services, deployments, statefulsets, daemonsets cluster-wide.
- Read events.
- Read logs (
pods/log).
To widen this (so the Assistant can read more, or so write proposals can be applied), edit Settings → Clusters → [cluster] → RBAC. Daalu generates the patch for you to apply.
What didn’t get installed
A few things that are explicitly not present:
- No daemonset on every node. The edge is one pod on one node. Crashlooping doesn’t affect data-plane workloads.
- No mTLS reverse-proxy or sidecar in your pods. Nothing in your existing workloads changes.
- No NodeLocal DNS hijacking, no CNI plugin, no privileged
container. The WireGuard pod runs with
NET_ADMINfor its WireGuard interface only. Nothing else is privileged.
Operational properties
- Restart behaviour. If the edge pod dies, Kubernetes restarts it. The tunnel reconnects in seconds. The Daalu side notes the dropped handshake; if it’s down for >15 minutes, a critical alert fires.
- Cluster reboots. Reboots are transparent. Once the edge pod schedules and starts, the tunnel comes back.
- Updates. The chart can be upgraded with
helm upgrade. We publish releases as needed; check the integration detail page for “Available update.”
Removing daalu-edge
helm uninstall -n daalu-edge daalu-edge and the tunnel dies
immediately. In the operator app, the cluster row will go to
disconnected within seconds. Delete the cluster row from
the UI to clean up the Daalu side as well.
Troubleshooting
”Awaiting handshake” persists for >5 minutes
Most common causes:
- Egress firewall. The edge pod can’t reach
hub.daalu.ioon UDP/51820. Verify your egress policy permits this. - The bootstrap Job failed. Check
kubectl -n daalu-edge get jobs— ifdaalu-edge-bootstrapshows a failure, inspect its logs:kubectl -n daalu-edge logs job/daalu- edge-bootstrap. - Bootstrap token expired. The token is valid for 1 hour. If you generated the invite ages ago, regenerate.
Connection drops periodically
- Aggressive NAT timeouts. The edge pod sends a keepalive
every 25 s by default; some NAT devices have shorter
windows. Lower the interval via the chart’s
wg.keepalivevalue. - Pod evictions. If your cluster is rescheduling the edge pod often, increase its priority or pin it to a stable node.
kubectl-through-tunnel fails
- RBAC. The edge SA doesn’t have permission to do what Daalu asked. Inspect the error message; widen RBAC or narrow the Daalu request.
- NetworkPolicy. Your cluster has a NetworkPolicy that forbids the edge pod from reaching the API server. Add an exception.
What’s next
Chapter 35 covers the local-GPU side — connecting a GPU in one of these clusters once federation is up. It’s a single form: the cluster-onboarding you just did is the only command-line step in the whole path.