Agent Substrate 多模板 Demo 完整指南:两种工作负载跨 3 个命名空间共享一个 WorkerPool
【免费下载链接】substrateAgent Substrate: the core system项目地址: https://gitcode.com/GitHub_Trending/substrate7/substrate
Agent Substrate是一个为智能体(Agent)工作负载打造的执行运行时,它能把大量「Actor」高效复用到少量常驻「Worker」上,实现亚 500ms 的恢复延迟。本文带你玩转它的多模板(Multi-Template)Demo:让counter和fspersist两种完全不同的工作负载,从 2 个 atespace(隔离边界)出发,跨 3 个命名空间共享同一个 WorkerPool,一次看清 Substrate 的资源调度模型。
🎯 这个 Demo 证明了什么?
一句话:WorkerPool 是「镜像无关」的通用算力池。
- 一个
WorkerPool的 Pod 里只运行 ateom 监督程序,不绑定任何业务镜像; - 每个
ActorTemplate自带自己的工作负载镜像,并通过workerSelector(标签选择器)认领算力池; - 选池是集群级的——不受 atespace 或命名空间限制。即使两个模板身处不同的 atespace,只要标签匹配,就能共用同一个池。
两个工作负载的分工也很巧妙:
| 工作负载 | 二进制 | 验证点 |
|---|---|---|
counter | 内存计数器服务 | 内存状态在 gVisor 挂起/恢复后依然存活 |
fspersist | 文件历史服务 | 文件系统状态随 Actor 跨 checkpoint/restore 持久化 |
fspersist的源码见 fspersist.go:每次请求把一行「Pod IP + 计数 + 时间戳」写入根文件系统,计数从文件而非内存中读回——文件跟着 Actor 迁移,历史就不断累积。
📦 资源布局:2 种工作负载、3 个命名空间
| 命名空间 | 内容 |
|---|---|
ate-demo-multi-template-pool | 唯一的WorkerPool(shared-pool,3 副本) |
ate-demo-multi-template-counter | atespace,存放counterActorTemplate |
ate-demo-multi-template-fspersist | atespace,存放fspersistActorTemplate |
核心清单:
- 算力池定义:multi-template.yaml.tmpl —— 为池打上
workload: multi-template-shared标签 - counter 模板:counter-template.yaml.tmpl —— 通过
workerSelector.matchLabels用同一标签认领池 - fspersist 模板:fspersist-template.yaml.tmpl —— 同样标签,跨 atespace 命中同一个池
⚠️ 不要手动编辑
demos/multi-template/*.yaml.tmpl,安装脚本会在部署时自动注入${BUCKET_NAME}等变量。
🚀 一键部署:3 步跑通多模板共享池
前置条件:已安装 Agent Substrate 的 K8s 集群(./hack/install-ate.sh --deploy-ate-system)、ko构建工具、以及存放快照的 GCS 存储桶(BUCKET_NAME环境变量)。
步骤 1:构建并部署(一条命令)
./hack/install-ate.sh --deploy-demo-multi-template它会依次完成:
- 用
ko构建counter和fspersist镜像; - 创建
shared-pool(3 副本)并等待 rollout; - 创建两个 atespace 并各建一个 ActorTemplate;
- 等待两个模板的 Golden Snapshot 构建完成。
对应实现逻辑可参考 install-demo-multi-template.sh。
步骤 2:每个模板各创建一个 Actor
go install ./cmd/kubectl-ate # 尚未安装 CLI 时执行 kubectl ate create actor c1 -a ate-demo-multi-template-counter --template counter kubectl ate create actor f1 -a ate-demo-multi-template-fspersist --template fspersistActor 按(atespace, name)寻址,DNS 名称中内嵌其 atespace。
步骤 3:端口转发路由器并发起请求
kubectl port-forward -n ate-system svc/atenet-router 8000:80然后通过atenet路由器访问,Substrate 会自动识别会话、把休眠的 Actor 唤醒到可用 Worker 上并代理流量:
# counter:内存计数 +1 curl -s -H "ate-target-actor: ate-demo-multi-template-counter/c1" http://localhost:8000 # -> hello from: <ip> | preserved memory count: 1 # fspersist:文件系统历史 curl -s -H "ate-target-actor: ate-demo-multi-template-fspersist/f1" http://localhost:8000 # -> pod: <ip> # --- history --- # pod=<ip> | count=0 | time=<timestamp>两个请求头中的ate-target-actor由「Actor 名 + atespace」共同构成完整路由键,这正是两种工作负载互不干扰的关键。
🔍 验证:两个 Actor 确实落在同一个池
kubectl ate get workers可以看到c1和f1都调度在shared-pool的 Worker 上。再玩一个「状态穿越」实验:
kubectl ate suspend actor f1 -a ate-demo-multi-template-fspersist curl -s -H "ate-target-actor: ate-demo-multi-template-fspersist/f1" http://localhost:8000挂起后再请求,Actor 从快照恢复——历史文件原样保留,计数继续增长。这同时验证了内存(counter)与文件系统(fspersist)两类状态在快照/恢复周期中的持久性。
🧹 一键卸载:避免残留资源
./hack/install-ate.sh --delete-demo-multi-template该命令按正确顺序删除:两个 Actor(运行中的先挂起)→ 两个模板 → 两个 atespace → 池及其命名空间。
📚 延伸阅读
- 官方 Demo 说明:demos/multi-template/README.md
- 核心术语(Actor、Atespace、WorkerPool、Worker 的关系):docs/glossary.md
- WorkerPool / ActorTemplate 完整配置参考:docs/api-guide.md
- 对照 Demo(单一模板的计数器):demos/counter/README.md
💡小结:多模板 Demo 用最小成本展示了 Agent Substrate 的核心设计哲学——池是算力,模板是身份,标签是桥梁。当你需要用有限 Worker 承载多套异构 Agent 负载时,这就是可以直接抄作业的参考实现。
【免费下载链接】substrateAgent Substrate: the core system项目地址: https://gitcode.com/GitHub_Trending/substrate7/substrate
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考