在 Kubernetes 上运行?devin-outpost-k8s
是一个开源 Operator,可为你实现这一循环:它会监视
队列、认领待处理的会话,并将每个会话作为工作器 pod 运行在任何
认证集群上 (GKE、EKS、…) 。请通过它的 Helm chart 安装,
而不是自行构建编排器。
核心流程
- 注册一个 outpost
outpost 是一个已命名的会话队列,由部署在你的基础架构上的多个工作器提供服务 (例如 rhel、gpu-h200 或 my-outpost) 。使用 devin worker outpost create 创建一个:
在 fleet API 中,Outposts 表示为
outposts 资源,其作用域限定在
你的账户下 (由其所有组织共享) 。请参阅
outposts 端点。
- 监听 fleet API 中等待的会话
你的 编排器 会列出其所服务的 outpost 中待处理的会话:
metadata.session_id 执行 upsert,并容忍重复。有关查询参数、响应格式以及完整的分页语义,请参阅 列出排队的会话 和 监听变更。
- 预配前先认领
在为某个 会话 启动 machine 之前,先以原子操作认领它,避免被其他工作器接走。传入一个 acceptor_id —— 这是工作器自行上报的身份标识:
409。认领意味着会有一个工作器在服务器分配的认领截止时间 (status.claim_deadline) 内就绪;过期的认领会自动返回队列。如果预配失败,请释放认领,以便该会话立即返回队列。
- 启动一台机器并运行工作器
对于每个已认领的会话,基于你的镜像预配一个 VM 或容器。在其中,从你希望会话工作的目录中运行工作器——其代码仓库位于该目录的 repos 子目录中,即 $(pwd)/repos/<repo-name>:
--acceptor-id,并通过 --token 或 DEVIN_OUTPOSTS_TOKEN 提供令牌 (参见完整开关列表) 。工作器会连接到 Devin 的云端,将会话标记为就绪,并开始执行工具调用。
- 在工作器退出时终止机器
当 devin worker start 退出时,会话即告结束 (或已暂停) 。终止 VM 或容器。如果你的 outpost 支持恢复,请在终止前为机器创建快照,以便在会话恢复时还原。
需要持久化的目录
已暂停的会话之后可以恢复,届时它会在原来的位置查找自己的文件。在为恢复的会话启动工作器之前,请先还原以下目录:
为整台机器创建快照即可同时涵盖这两个目录。如果你只持久化部分文件系统 (例如主目录卷) ,请确保这两个目录都在其中,并在恢复时于相同的工作目录中启动工作器。
会话启动时,Devin 会在上述每个目录中为其写入一个小型标记文件:工作目录中的
.devin-outpost-stamps/<session_id>,以及会话状态目录中的 outpost_stamp。如果会话恢复时缺少某个标记文件,则说明对应目录未被持久化,Devin 会在会话中发出警告并指明该目录。在空机器上进行恢复不适用于生产环境:会话将丢失检出的代码、未提交的工作以及已安装的依赖。
你的编排器可以跟踪其已认领的会话及这些会话的状态:
status.session_status 字段,其值为 pending、running、suspended 或 terminated。
去中心化调度
如果你计划运行超过约 16 个协调组件 (即监视并从 outpost 认领任务的工作器或 编排器) ,请先联系你的账户团队——更大的集群会加剧认领竞争并提高队列读取负载,我们希望确保 outpost 已为此做好相应配置。
- 认领是唯一的协调机制。 每个工作器都会独立监视队列,并竞争认领待处理的会话。认领是在服务器上执行的原子 compare-and-swap 操作:恰好只有一个工作器会成功,其他所有失败者都会收到
409,然后直接继续处理下一个待处理会话。认领竞争失败是正常情况,不是错误。 - 每个工作器都有自己的身份标识。
acceptor_id会将工作器的认领、续期和重启恢复限定在该工作器自身范围内。devin worker start会为每台机器自动生成并持久化一个,因此集群无需额外配置身份标识。切勿在不同机器之间共享 acceptor ID (或复制的工作器数据目录) ——发生冲突的工作器会互相抢走对方的认领。 - 故障会自行恢复。 如果工作器在认领后终止,其认领会在 claim deadline 到达时过期,该会话会返回队列,由其他工作器接手。无需进行集群级别的健康状态跟踪。
构建自定义编排器
devin worker start 的所有功能都可以直接通过 fleet API 实现,因此你可以完全替代 CLI:从 Devin 的静态分发源获取 devin-remote 二进制程序,并按照文档中说明的环境自行启动它。请参阅参考文档中的 远程二进制程序分发 和 spawn 约定。
