README
¶
Multi-Template Demo
This demo shows that two different actor templates running two different binaries
can share a single WorkerPool — even when the templates live in different atespaces.
Each template gates on the pool via workerSelector, a label selector matched
against the pool's labels — pool selection is cluster-wide, not scoped by atespace
or namespace.
Prerequisites
- A k8s cluster with Agent Substrate installed (
./hack/install-ate.sh --deploy-ate-system). koinstalled for building images.- A GCS bucket for storing snapshots (configured via
BUCKET_NAMEenv var).
How to Run on Agent Substrate
1. Build and Deploy
[!NOTE] Do not manually edit the
demos/multi-template/*.yaml.tmplmanifests. The installation script automatically injects your${BUCKET_NAME}environment variable during deployment.
./hack/install-ate.sh --deploy-demo-multi-template
This command will:
- Build the
counterandfspersistimages usingko. - Create one
WorkerPool(shared-pool) in theate-demo-multi-template-poolnamespace (multi-template.yaml.tmpl). - Create 2 atespaces —
ate-demo-multi-template-counterandate-demo-multi-template-fspersist— and an actor template in each:counter(counter-template.yaml.tmpl) andfspersist(fspersist-template.yaml.tmpl), both selecting the pool via the sameworkerSelectorlabel and applied withkubectl ate create actor-template. - Wait until both templates' golden snapshots are built.
2. Create one actor per template
Each actor goes in its template's atespace — --template-ref names the template,
resolved in the actor's atespace — and their DNS names embed that atespace:
# Install the CLI as a kubectl plugin if not already installed
go install ./cmd/kubectl-ate
# Create two actors from different templates, one per atespace.
kubectl ate create actor c1 -a ate-demo-multi-template-counter --template-ref counter
kubectl ate create actor f1 -a ate-demo-multi-template-fspersist --template-ref fspersist
3. Port-forward the atenet router
To interact with the router locally:
kubectl port-forward -n ate-system svc/atenet-router 8000:80
How to Use
When you send an HTTP request through the router, Substrate automatically detects the session, activates (resumes) the actor onto an available worker pod, and proxies the traffic.
# counter binary
curl -s -H "Host: c1.ate-demo-multi-template-counter.actors.resources.substrate.ate.dev" http://localhost:8000
# -> hello from: <ip> | preserved memory count: 1
# fspersist binary
curl -s -H "Host: f1.ate-demo-multi-template-fspersist.actors.resources.substrate.ate.dev" http://localhost:8000
# -> pod: <ip>
# --- history ---
# pod=<ip> | count=0 | time=<timestamp>
Confirm both actors landed on workers in the one shared-pool:
kubectl ate get workers
The counter increments its in-memory count on each request, while fspersist prepends
a line to its history file on each request. Suspending and re-requesting an actor
preserves that state across the snapshot/restore cycle:
kubectl ate suspend actor f1 -a ate-demo-multi-template-fspersist
curl -s -H "Host: f1.ate-demo-multi-template-fspersist.actors.resources.substrate.ate.dev" http://localhost:8000 # history persists; count keeps climbing
How to Uninstall
Remove the demo — this deletes the actors (suspending running ones first), the templates, both atespaces, and then the pool and its namespace:
./hack/install-ate.sh --delete-demo-multi-template