
OpenSandbox task-executor任务执行器解析批任务如何驱动沙箱【免费下载链接】OpenSandboxSecure, Fast, and Extensible Sandbox runtime for AI agents.项目地址: https://gitcode.com/GitHub_Trending/ope/OpenSandboxOpenSandbox 的 task-executor 是面向 AI Agent 沙箱的批任务任务执行器它以轻量 Sidecar 形式运行在沙箱 Pod 内接收来自控制器的任务规格负责把一个个短生命周期任务进程或容器安全地拉起、监控、回收。本文带你快速读懂它的执行原理、任务生命周期与 HTTP 接口帮你看懂批任务是如何一步步驱动沙箱的。1. task-executor 是什么沙箱内的批任务执行引擎在 OpenSandbox 的 Kubernetes 体系中BatchSandboxController等控制器负责调度决策而真正动手干活的是运行在每个沙箱 Pod 里的task-executor。它有三个关键身份 本地 Agent以独立二进制运行不依赖 etcd状态全部落在本地文件目录默认/var/lib/sandbox/tasksHTTP 服务默认监听0.0.0.0:5758对外暴露任务创建、查询、同步、删除等 REST 接口任务管家内置一个约 500ms 一轮的协调循环reconcile loop持续观察任务进程并把状态变更持久化。入口逻辑非常直观加载配置 → 初始化文件存储 → 创建执行器 → 启动任务管理器 → 拉起 HTTP 服务详见 kubernetes/cmd/task-executor/main.go。2. 它在架构中的位置控制器如何把批任务下发到节点BatchSandboxController → TaskScheduler → task-executor (Pod 内 HTTP :5758) → 进程/容器 调度决策 任务分配 本地执行 实际工作负载控制器并不直接启动进程而是通过 task-executor 的 HTTP API 下发任务执行结果再以任务状态的形式被调度器观察最终反映到BatchSandbox的资源状态中。这种控制面 / 执行面分离的设计让批任务的编排逻辑与节点执行细节彻底解耦。更多架构说明可参考 kubernetes/DEVELOPMENT.md 与 kubernetes/AGENTS.md。3. 核心三件套Manager、Runtime、Storagetask-executor 的代码组织在 kubernetes/internal/task-executor/ 下职责划分清晰模块路径职责配置config/config.go数据目录、监听地址、Sidecar 模式、日志轮转等默认值任务管理manager/task_manager.go任务创建/同步/删除、协调循环、状态持久化执行运行时runtime/process.go真正 fork 进程构建 shim 脚本、写 PID、捕获退出码文件存储storage/file_store.go每个任务一个目录状态落盘可恢复类型定义types/task.go任务状态机Pending / Running / Succeeded / Failed / Timeout 等几个值得注意的设计细节并发控制当前单 Pod 内maxConcurrentTasks 1保证批任务串行、资源可控task_manager.go#L34优雅删除删除任务只是打上DeletionTimestamp标记软删除由协调循环负责发信号、等进程退出、执行 postStop 钩子后再清理崩溃恢复重启时从磁盘恢复任务清单重新Inspect每个任务的实际进程状态避免僵尸状态recoverTasks。4. 任务是怎么跑起来的shim 脚本 文件状态锚process 运行时不用内存跟踪进程而是用三个小文件作为状态锚点 pid文件进程启动成功后立即写入 PIDexit文件进程退出后由 shim 脚本写入退出码0 成功非 0 失败stdout.log/stderr.log任务输出重定向到磁盘方便事后排查。所谓 shim 脚本本质是一个迷你 init它把用户命令放到后台运行、捕获 SIGTERM 并转发给子进程、最终把退出码写进exit文件见 buildShimScript。这套机制让 task-executor 即使自身崩溃重启也能通过文件准确还原每个任务处于 Pending、Running、Succeeded 还是 Failed 状态。状态推断逻辑同样简单可靠有exit文件 → 按退出码判定成败只有pid文件且进程还活着 → Running并检查是否超过TimeoutSecondsPID 对应的进程消失但没有exit文件 → 视为崩溃Inspect。5. Host 与 Sidecar 双模式任务跑在谁的世界里task-executor 支持两种执行模式由--enable-sidecar-mode开关控制Host 模式直接在 task-executor 所在容器内以/bin/sh -c启动任务简单直接Sidecar 模式借助nsenter进入主容器默认名为main的 mount / pid / net 等命名空间执行任务使任务与主业务容器同处一个世界可读写主容器内的文件系统、访问其网络环境useNsenterForProcess。Sidecar 模式的定位目标task-executor 通过扫描/proc找到带有SANDBOX_MAIN_CONTAINER容器名环境变量的进程作为命名空间入口findPidByEnvVar。停止任务时也是同样的思路——先 SIGTERM 优雅终止10 秒未退出再 SIGKILL 整个进程树。6. 生命周期钩子preStart 与 postStop除了主进程任务规格还支持生命周期钩子让批任务具备前置校验 / 后置清理能力preStart任务主进程启动前执行失败则任务直接进入FailedReason 为PreStartHookFailedpostStop任务停止后执行完成后会在 SubStatus 中追加PostStopHookCompleted标记。钩子支持独立超时TimeoutSeconds输出保留首尾各 8 KiB 用于诊断execLifecycleHook。这与 OpenSandbox 沙箱层面的生命周期钩子思路一脉相承可参考官方文档 docs/guides/lifecycle-hooks.md 中的钩子时序设计。7. HTTP API 速览5 个端点管完任务一生完整接口文档见 kubernetes/examples/task-executor/README.md常用端点如下端点用途POST /tasks创建并启动单个任务GET /tasks/{name}查询指定任务状态DELETE /tasks/{name}标记删除触发优雅停止POST /setTasks全量同步期望任务集控制器主要用法GET /getTasks列出所有任务GET /health健康检查其中POST /setTasks是声明式同步入口控制器把期望状态整体推过来不在清单里的任务被标记删除、新任务被创建——这正是批任务与沙箱驱动关系的核心控制器声明意图执行器负责收敛现实。8. 动手体验3 步提交你的第一个沙箱任务项目自带一个极简客户端示例 kubernetes/examples/task-executor/main.go演示了完整闭环提交任务client.Set(ctx, task)提交一条echo命令任务轮询状态循环client.Get(ctx)观察 Waiting → Running → Terminated 的状态流转直到拿到退出码清理传nil调用Set清空任务列表。本地调试时也可以直接 port-forward 到沙箱 Pod 后curl交互命令示例见 kubernetes/DEVELOPMENT.md。9. 小结task-executor 的设计亮点 回顾全文task-executor 用非常少的部件解决了批任务落地的关键问题文件即状态pid / exit / 日志三个文件让任务状态可恢复、可审计声明式同步setTasks接口让控制器的期望状态成为唯一事实来源优雅生命周期软删除 信号转发 preStart/postStop 钩子批任务也能像容器一样被体面地管理Host/Sidecar 双模式既能独立跑进程也能借 nsenter 融入主容器环境。理解了这条控制器 → HTTP → 文件锚定的进程链路你就掌握了 OpenSandbox 批任务驱动沙箱的完整机制。若想深入可从 kubernetes/internal/task-executor/ 源码与 kubernetes/test/e2e_task/ 端到端测试继续读起。【免费下载链接】OpenSandboxSecure, Fast, and Extensible Sandbox runtime for AI agents.项目地址: https://gitcode.com/GitHub_Trending/ope/OpenSandbox创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考