1控制面
PCS 只写期望态与签名命令,不直接调用 Docker;容器生命周期由主机上的 host-runtime 执行。私钥只用于探测与一次性引导。
PCS 控制面管理主机、部署与 Agent / API 档案,密钥只保存 Secret Store 引用; 主机侧 host-runtime 执行签名命令;调度机按递归树派发任务,结点调度机逐级汇总能力; 主机可以并入另一台主机组成联邦,跨调度机的任务只下推、不复制。 局域网设备可以拿侧载令牌走同一条任务链路,每个任务都能通过附件与产物通道收发文件。
PCS 只写期望态与签名命令,不直接调用 Docker;容器生命周期由主机上的 host-runtime 执行。私钥只用于探测与一次性引导。
根调度机下可以挂叶构建机,也可以挂结点调度机;结点调度机再挂构建机和调度机,如此递归,层级不设上限。每台调度机各自一套库。
W = round(1000 × Σ(权重 × min(值, 上限) / 上限)):CPU 30%(8 核)、频率 15%(4 GHz)、内存 20%(32 GB)、存储 10%(256 GB)、模型 15%(10)、API 10%(10)。调度机不参与 W,固定 0。
任务带难度 D(0–1000,0 = 不限)。调度机只把任务交给 W ≥ D 的构建机,并优先选余量最小的,避免大机器被小任务占住。
结点调度机把名下构建机的 W 与子调度机的 ΣW 相加后上报,直到根调度机。根看到的 ΣW 就是整个联邦的总能力。
pcs_hosts.parent_host_id 一行引用即完成并入;不能并入自己或自己的下级,双方都必须已有根调度机。合并与脱离只改运行时上级,不重启容器。
只下推、不复制:父任务留在原库保持 QUEUED,子任务用 relay_parent_task_id 唯一约束去重;状态与输出镜像回来,取消向下转发,深度上限 8。
主机角色取 containers / builder / scheduler;同一台主机不能同时是构建机和调度机。容器模式下每台主机有且仅有一台根调度机,可再加任意多台结点调度机。
构建机、调度机、对话、终端都按主机子树取数:本机与并入主机分组折叠,组头显示主机名与数量,折叠状态记在本机;只有一台主机时不折叠。
Agent Profile 与 API Profile 由控制面维护:角色到 Agent 的绑定在 role_agent_bindings,到 API 的绑定在 role_api_bindings,都按主机生效。调度机与构建机部署时只拿到引用,调度机不解析档案内容,也不接触密钥。
API 密钥不落平台库:档案里只存 secret://<path> 引用,值写入独立的 Secret Store(文件 0600),PCS 不回显、不记日志;容器实例用 Secret Store 实例 JWT 解析引用。
派发仍由确定性调度循环完成;调度 Agent 只解释队列、租约与「为什么这条在等」。它通过调度机本地 MCP 服务 builders 调用 list_builders、builder_exec、builder_ask、task_status 查看或操作构建机,不进入任务派发路径。
侧载是绑定到单台主机的 curl 令牌,不是 Agent:设备 → PCS → 主机根调度机,复用同一套任务、租约与 fencing 路径。权限是封闭集合(tasks:read、tasks:write、builders:read、queue:read、console:run);平台只存 SHA-256 哈希与末四位。
附件经 POST /attachments 上传(单个 24 MiB),命令执行前落到 <workspace>/attachments/。任务用 requirements.console.collect 收集工作区(32 个路径 / 128 个文件,单文件 64 MiB、合计 256 MiB),逐字节进入产物通道并重算 SHA-256;下载同样是原始字节。
明文令牌只展示一次;删除或到期在下一次请求即生效。在线状态最多 30 秒写一次,界面 120 秒内算在线。侧载能看到的构建机就是主机根调度机的子树,也正是任务实际能跑的范围。