Agent 基础设施 · 编排运行时

谷歌开源的 AX:用管 Kubernetes 的方式,管理百万 Agent

AX 管任务,Substrate 管资源。Google 想给 Agent 铺一层底座——但把设计目标当成实测成绩,是读它最容易犯的错。

2026-10-04技术解读 · Agent 基础设施约 14 分钟

引言:三组数字

2026 年 9 月 21 日,Hacker News 的榜首被一个开源项目占住了一整天。664 分,299 条评论。

它叫 AX,仓库地址 github.com/google/ax,Apache 2.0,Google 出品。首页上只有一句话的自我介绍:Declare an agentic task. AX runs it at scale.——声明一个 agentic 任务,AX 帮你把它规模化跑起来。

再往下翻,是三组数字。

翻译成人话:把 Agent 当集群里的负载来管,空闲的挂起,要用的秒级唤醒。这就是"用管 Kubernetes 的方式管 Agent"的字面意思。

这篇不打算再复述一遍发布新闻。它要回答一个问题链:AX 到底是哪一层?它的四个原语各管什么?一份 YAML 怎么变成一次真实运行?它最好的一笔设计藏在哪?"百万 Agent"的密度究竟靠谁撑起来?还有,现在上它要踩哪些坑?

01AX 是编排层,不是 Agent 框架

先把最容易搞混的地方说清楚:AX 不写 Agent,它管 Agent。

打开 google/ax 的人,第一反应常常是"Google 又出了一个 Agent SDK"。不是。

AX 不碰 Prompt 模板,不碰 Memory 抽象,不碰 Tool 定义。这些是 ADK、LangChain、LangGraph、Claude Code 这些 harness 的活。AX 站得更低一层。

共同作者 Jaana Dogan 在 Hacker News 上亲自澄清过一句,我觉得是理解整个项目的钥匙:

「AX 是更接近作业编排的一层,跑在 Agent Substrate 之上。它不是 Agent 框架。」—— Jaana Dogan,AX 共同作者,Hacker News

换成工程语言:AX 管的是"任务怎么声明、怎么调度、怎么挂起恢复、怎么审计";Substrate 管的是"计算资源怎么在上万个 Agent 之间复用"。两者都不碰 Agent 自己的逻辑怎么写。

上层HarnessADK / LangChain / LangGraph / Claude Code / Antigravity——在这里写 Agent 的行为
中层AX声明式控制面:Task、Workspace、Gateway、Model 四个原语,管任务的声明、调度、挂起与审计
底座Agent Substrate执行运行时:Actor / Worker 解耦、快照、亚秒恢复,管计算资源的复用
地基Kubernetes管机器:节点自愈、集群自动扩缩、Worker Pod 的生命周期

为什么中间非要插一层?因为 Agent 既不是无状态微服务,也不是跑完即走的批任务。它是有状态、突发、长生命周期的新负载。硬塞进现有模型,会连撞三堵墙。

第一堵是算力经济性。微服务全天占资源是合理的;Agent 却 90% 以上时间在等模型推理、等工具返回、等人回复。给每个会话常驻 1 CPU / 1G,百万并发就是百万核。

第二堵是冷启动延迟。Pod 冷启动是秒级到十秒级。一个 Python ADK Agent 初始化常常要 10 秒以上,因为要启解释器、导入依赖、构建内存对象图。一次对话中途冷启动几秒,交互体验直接报废。

第三堵是控制面吞吐。K8s 的 etcd 基于 Raft 串行提交,为"万级对象、低频更新"设计。百万级 Actor 的高频状态变更,会把 Watch 机制和 API Server 压垮。

一句话记住定位:AX 想复刻的,是 Knative 之于函数计算的位置——不是 Kubernetes 本身,而是架在 Kubernetes 之上、专门伺候某一类新负载的那一层。

02四个原语,就是 AX 的全部世界观

AX 把 Agent 运行需要的所有东西,收敛成四个声明式对象。

AX 的 API 组是 ax.io/v1alpha1。全部抽象只有四个,一个不多。

原语管什么
Task在隔离沙箱里跑不可信 Agent 代码,带 CPU / 内存上限。创建便宜、挂起便宜、丢弃也便宜
Workspace任务开始前把环境备好:Git 仓库、MCP server、技能包。也可以只写一句自然语言的 goal,让初始化 Agent 自己装
Gateway出网策略。把流量锁到显式的主机+端口白名单,并把凭据注入到出站请求里
ModelLLM 供应商参数、模型版本、密钥的统一配置点,密钥从 K8s Secret 取

看一份真实的清单,四个原语里用了两个:

apiVersion: ax.io/v1alpha1
kind: Workspace
metadata:
  name: golang
spec:
  git:
    - repo: https://github.com/golang/go.git
      branch: "my-fix"
---
apiVersion: ax.io/v1alpha1
kind: Task
metadata:
  name: test
spec:
  workspaces:
    - name: golang
  goal: "Ensure that Go tool chain is available and is built from source"
  debug: true

读一遍就知道 AX 想干什么:Workspace 先声明"我要一个 golang 环境,代码从哪个仓库哪个分支来";Task 再声明"在这个环境里跑一个目标——确保 Go 工具链可用、而且是从源码构建的",debug: true 允许你 ssh 进去看。

四个原语里,最容易被低估的是 Gateway。让 Agent 跑起来不难,难的是让它只能访问该访问的东西。Agent 会自己生成代码、自己发网络请求,出网一旦不受控,一次提示注入就可能把数据发到外面去。Gateway 用一个主机+端口白名单把这条口子收紧,凭据还在沙箱够不到的地方注入——Agent 自己看不到密钥。

而 Model 看着最不起眼,却是运维上最省事的那个:轮换一个密钥、钉一个新模型版本,改一处 apply 一下就行,不用去翻每个 Agent 的代码。

03一份 YAML 怎么变成一次 Agent 运行

AX 的 CLI 照着 kubectl 的形状做,用惯 K8s 的人十分钟上手。

ax 是个 Go 写的命令行工具,背后是 gRPC 控制面。控制面部署进 ax-system 这个 namespace,用 ko 构建镜像,配一个 Redis。前提是,先有一个 Agent Substrate。

装、部署、提交任务,全流程是这样:

# 装 CLI
go install github.com/google/ax/cmd/ax@latest

# 部署控制面(需要先有 Substrate)
make deploy AX_IMAGE_REPO=<your-registry>

# 提交任务
ax apply -f task.yaml

# 看状态
ax get tasks
ax watch task task123   # 实时看 phase / condition 变化

# 钻进沙箱,看 Agent 到底在干嘛
ax ssh task123 -- ls -la /workspace

# 手动挂起 / 续跑
ax suspend task task123
ax resume task task123

基础动词和 kubectl 一一对应:apply、get、describe、watch、delete。在这之上,多了几个 Agent 专属动词:suspend(检查点暂停)、resume(原地续跑)、ssh(进沙箱)。

这些动词里,suspend/resume 是灵魂。它对付的是 Agent 的"空闲成本"——没人等的 Agent 挂起,需要时从断点继续,而不是从头再跑一遍。

还有一个细节说明它想清楚了生产场景:kubectx 集成。你手上有多个集群时,切一下上下文,ax 会自动解析并隧道到对应集群的控制面,不用再手动配一堆 kubeconfig。

AX 内置了 Antigravity harness,直接支持 Google AI Studio 和 Vertex AI。但它是harness 无关的——官方明确列举了 LangChain、LangGraph、ADK、Claude Code、MCP server 都能跑上去。这一步很关键:它没把用户锁在自己的框架里。

04Workspace:AX 里最实在的一笔设计

四个原语里,Workspace 最能说明设计者真的跑过 Agent。

Agent 的成本大头,不在推理,在冷启动。

每来一个新任务,都要重新拉代码、装依赖、接工具服务器、等环境就绪。一个 Python 环境装完十几个包,几分钟就没了。你花在"等环境"上的钱,经常比花在"跑任务"上的还多。

Workspace 就是冲着这笔账来的。它把要做的事提前声明清楚:要哪几个 Git 仓库、哪个分支;要连哪些 MCP server;要装哪些技能包。

AX 会在每个沙箱启动之前把这些全部备好。Agent 一睁眼,工具链就是热的,不用等。

更有意思的是"生成式 workspace"。你甚至不用列清单,直接用一句自然语言描述"一个就绪的环境长什么样":

apiVersion: ax.io/v1alpha1
kind: Task
metadata:
  name: data-analysis
spec:
  workspaces:
    - name: python-env
      goal: "Set up a Python 3 development environment"

首次启动时,AX 会把这句话丢给一个初始化 Agent,让它去装工具链、验证依赖。同一个机制,也让 demo 里那句 "Ensure that Go tool chain is available and is built from source" 成立——它不只是检查 Go 在不在,而是真的从源码把 Go 构建出来。

回头看,这个设计比"声明式编排"的口号实在得多。它承认了一个常被忽略的事实:Agent 的成本结构和微服务不一样,热环境本身就是要花钱买的资源。与其让每个任务从零冷启动,不如把环境做成可复用的模板,把冷启动成本在模板层摊掉。

05"百万 Agent"靠谁撑起来

AX 管任务,但让任务在百万量级上待得起的,是它脚下的 Substrate。

先说问题的形状。Agent 长时间在等:等模型吐字、等工具返回、等人点确认。这期间它占着的 CPU 和内存如果不能放出去,规模一大,账单就撑不住。

AX 的解法是 suspend/resume:空闲的 Agent 被检查点、挂起,资源释放;下一个请求到达时,从断点亚秒恢复,零冷启动。官方给的目标是恢复低于 500 毫秒。

这条能力来自它脚下的 Agent Substrate。核心抽象几个词就够:

关键是:Actor 不与任何具体 Worker 绑定。空闲时,系统对 Actor 做一次全量快照(进程内存 + 文件系统),写进本地磁盘和 Google Cloud Storage,然后释放 Worker 回池。下一个请求来时,快照被恢复到任意一个空闲且兼容的 Worker 上。逻辑生命周期和物理资源,就这样彻底解耦了。

快照分两级。创建 ActorTemplate 时,Substrate 会临时把负载跑起来、等就绪、打一次全量检查点,得到 golden snapshot。新 Actor 从这个共享检查点起步,省掉整个冷启动路径;之后每次挂起,写入该 Actor 专属的 last snapshot,下次恢复的是它自己那一份。这就是"有状态"的来源。

一个 Agent Actor 的一次挂起—恢复

活跃执行 Agent 在思考 / 跑码 空闲 → 挂起 checkpoint 全量快照 持久化 本地磁盘 + GCS 亚秒恢复 <500ms 零冷启动 空闲即释放资源 · 请求到达即唤醒 · 同一 Actor 可落到任意兼容 Worker

三个动作串起整个密度故事:挂起时把状态拍成快照,恢复时把快照贴回任意一台空闲 Worker。

官方给的指标是:比标准容器运行时密度高 10 倍,沙箱恢复低于 500ms,每秒 500 次以上挂起/恢复,单主机承载 1000 个以上休眠 Agent。仓库的演示更直观:250 个有状态会话挤在 8 个物理 Pod 上,也就是 30 倍以上超售。

但要分清目标和实测。AX 首页写着"单集群十亿级任务",README 里同时写着"尚不适合生产使用,API 几乎必然会变"。把设计目标当成可复现的 Benchmark,是读这类早期项目最容易犯的错。

06AX 现在缺什么,别踩哪些坑

它解决的痛点是真的,但它离"拿来就能上生产"还有距离。

Hacker News 那条帖子下面,社区分成了两派。基础设施工程师感谢它——它正面回答了"空闲 Agent 云成本"这个没人愿意碰的问题。另一边的开发者则吐槽"ergonomic"的营销口径,跟"你得自己维护 K8s 集群、镜像仓库、还要用 ko 管 CRD"的现实对不上。

两派说的都对。它确实解决了真问题,也确实不是给想快速起步的独立开发者准备的。

几条硬约束,值得记在本子上:

把它放进已有方案里比一比,位置会更清楚:

方案优势代价
传统 K8s1 Agent ≈ 1 Pod,简单、可靠、生态成熟空闲资源浪费;百万对象时 etcd 与控制面撑不住
Knative无状态函数冷启动快,scale-to-zero不保留进程内存和文件系统,会话必然断裂
CRIU容器检查点,Linux 内核原语成熟长期停在 Alpha,延迟不稳定,覆盖不到沙箱级状态
AX + Substrate有状态挂起 + 亚秒恢复 + 30× 超售极早期;快照强依赖 GCS;旁路控制面带来一致性自负

差别最本质的地方在状态。Knative 卖的是无状态函数的零缩放;Substrate 卖的是有状态挂起——内存、打开的文件、终端状态原样保留。它填的正是这个空白。

那谁该现在上?已经有 K8s 团队、并且工作负载是"大量并发会话、但单次调用很短"的平台团队:编码助手、后台长驻助理、RL rollout、一次性沙箱、评测基准。对这类团队,Substrate 的思路值得直接搬进基础设施规划。

谁该再等等?想快速起步的独立开发者。对你们,一条托管的路线大概率更省事。

07总结与收束

把几个落点收一下。

把镜头拉远一点看,Agent 运维层这块已经分出两条路。一条是托管:沙箱、状态、权限全包,你接 API,基础设施交给厂商。一条是自托管:K8s 声明式,在你自己的集群里跑,数据不出域。

没有谁对谁错。真正值得注意的信号是:两条路都承认了同一件事——Agent 的沙箱、状态、网络、调度,是一个独立的基础设施层,不能再塞进应用代码里自建。分歧只在谁运营这一层。

至于 Agent 基础设施最后会像容器编排一样收敛到某一个项目,还是各大厂各搞一套、再次碎片化,现在还没有答案。AX 把问题摆上了桌面,但还没到能给出答案的时候。

参考资料