核心概念
Template、Workspace 与 Volume 是每次使用 Kibotos 都会遇到的对象。本页介绍它们和其他对象、Workspace 的状态,以及控制面与数据面两条访问路径。
对象
flowchart LR T["Template<br/>revision"] -->|创建时确定| W[Workspace] W ---|绑定 0 或 1 个| V[Volume] W -.->|网络策略引用| E[Egress] W -.->|网络策略引用| R[Resolver] X[Exposure] -->|公开一个端口| W W -->|导出| TR[Transfer] TR -->|恢复为新的| W2[Workspace]
Template 与 revision
Template 是创建 Workspace 用的系统镜像,例如最小系统、编程工具链或桌面环境。
- 每次发布产生一个不可变的 revision,部署方为每个 Template 选定一个默认 revision(default revision)。
- 创建 Workspace 时可以只写 Template,由系统选当前的默认 revision;也可以指定 revision。
- 选定后不再改变:部署方之后发布新版本、改了默认 revision,已经存在的 Workspace 不跟着换。
Workspace
Workspace 是 Agent 工作的环境,每个 Workspace 运行在自己的 MicroVM 里。
- 创建后 ID 不变。
- 每次成功启动是一次新的运行,称为执行代(generation),从 1 开始递增。停止后,这一次运行的凭证、进程和连接全部失效,下次启动要重新申请凭证。
- 属性有 CPU、内存、可写层大小、到期时间、网络策略、labels 与 annotations。可写层(writable layer)是根文件系统上可写的部分,保留规则见保证与边界。
- Volume 与可写层存放在部署方的存储池里。每次启动时,系统选一台能访问这些存储池的宿主运行它,可能与上次不是同一台。
Volume
Volume 是独立于 Workspace 的持久卷。
- 创建 Workspace 时默认同时创建一个独占的 Volume,挂在
/data;也可以绑定已有的 Volume,或不要 Volume。 - 一个 Workspace 最多绑定一个 Volume,一个 Volume 同时只属于一个 Workspace。Workspace 停止后可以换绑或解绑,下次启动时生效。
- 默认创建的 Volume 随 Workspace 一起删除,绑定的已有 Volume 默认保留,都可以在绑定时改。数据在什么情况下保留见保证与边界。
其他对象
| 对象 | 是什么 | 详见 |
|---|---|---|
| Exposure | 把 Workspace 里的一个 HTTP 端口换成一条公开的 https:// 地址 | 公开 URL |
| Egress | 调用方提供的出站代理。网络策略引用后,出站连接经由它。要求 v0.3.0 或更新版本 | 调用方自带的出口 |
| Resolver | 调用方提供的 DNS 服务器。网络策略引用后,DNS 查询经由它。要求 v0.3.0 或更新版本 | 调用方自选的 Resolver |
| Transfer | 把已停止 Workspace 的 Volume 导出成归档,再导入成新的 Volume、恢复成新的 Workspace(ID 不同) | 导出、导入与恢复 |
| labels 与 annotations | 挂在 Workspace、Volume 等对象上的键值对。labels 可以用来筛选列表,annotations 只保存 | labels 与 annotations |
Workspace 的状态
stateDiagram-v2 CREATING --> AVAILABLE AVAILABLE --> STOPPING: 停止 / 到期 STOPPING --> STOPPED STOPPED --> STARTING: 启动 STARTING --> AVAILABLE AVAILABLE --> FAILED: 出错 FAILED --> STOPPED: 强制停止 STOPPED --> DELETING: 删除 DELETING --> DELETED
| 状态 | 含义 |
|---|---|
CREATING | 正在选宿主、准备 Template、启动 MicroVM |
AVAILABLE | 正在运行,可以访问文件和进程 |
STOPPING | 正在停止 |
STOPPED | 已停止,不占用 CPU 和内存 |
STARTING | 正在启动 |
FAILED | 创建、启动或运行中出了问题 |
UNKNOWN | 一个操作的结果暂时无法确认 |
DELETING | 正在删除 |
DELETED | 已删除,仍能按 ID 查询 |
图中只画了主干:
- 除
DELETING与DELETED外,任何状态都可以直接删除。 - 创建和启动过程中出错也会进入
FAILED。 - guest 是否在回应(
RESPONDING或UNRESPONSIVE)单独报告,不改变状态。
每个状态下能做哪些操作、FAILED 怎样恢复,见各状态下能做的操作与从 FAILED 恢复。
控制面与数据面
访问 Kibotos 有两条路:
| 控制面(control plane) | 数据面(data plane) | |
|---|---|---|
| 做什么 | 创建、查询、停止、删除 Workspace,管理 Volume、Exposure 等对象 | 读写文件、运行进程、打开终端和桌面 |
| 发给谁 | ctrl | 运行 Workspace 的宿主 |
| 怎样认证 | 部署方签发的 Operator 身份,双向 TLS | 先向 ctrl 申请的短期会话凭证(data-plane session credential) |
文件和进程的流量不经过 ctrl,所以大文件和长时间的输出不受控制面的负载影响。代价是多一步申请凭证,并在 Workspace 重新启动后重新申请;kibo 和 E2B 网关会自动完成这一步。请求怎样流动见架构。
写操作的约定
| 约定 | 做法 |
|---|---|
| 幂等键(command ID) | 每个写请求带一个调用方生成的幂等键。用同一个幂等键重发不会重复执行,结果已经出来时直接拿到结果 |
| 期望版本(expected revision) | 修改已有对象时带上读到的版本号。别人先改过时请求被拒绝,不会悄悄覆盖 |
| 结果未知 | 请求超时或连接中断时,用原来的幂等键重发,或查询该命令的结果。换一个幂等键会变成一个新的操作 |
具体字段与错误码见原生 API 的写操作的约定。