Volume 与导出恢复
Volume独立于任何 Workspace 存在的持久卷。一个 Workspace 最多绑定一个 Volume,默认挂载在 /data。 存放 Workspace 的数据,独立于任何 Workspace 存在。本页介绍创建 Workspace 时怎样选择 Volume,Volume 的创建与扩容、换绑,以及把 Workspace 的数据导出、恢复成新的 Workspace。
创建时的 Volume
每个 Workspace 默认带一个新建的 Volume,挂在 /data,并标记为随 Workspace 删除。只有这个路径承诺在停止、启动之间保留数据。
预先创建一个 Volume,在创建 Workspace 时把它绑定到另一个路径:
volume_id=$(kibo volume create --capacity 10G -q)
kibo workspace create --template "$template_id" --volume "$volume_id" --mount-path /srv/datakibo workspace create 中与 Volume 有关的参数:
| 参数 | 效果 |
|---|---|
| 不传 | 新建一个 Volume 挂在 /data,删除 Workspace 时一起删除 |
--mount-path <path> | 改变挂载路径 |
--volume <id> | 绑定一个已有的 Volume。默认在删除 Workspace 时只解除绑定,不删除 Volume |
--delete-with-workspace[=false] | 显式决定删除 Workspace 时是否连 Volume 一起删。新建 Volume 默认删,--volume 默认留 |
--no-volume | 不绑定 Volume。这样的 Workspace 没有承诺持久的路径 |
--volume与--no-volume互斥,--no-volume也不能与--mount-path、--delete-with-workspace同时使用。- 参数冲突或路径非法时,在发请求前就被拒绝。
- 预先创建 Volume 用
kibo volume create或kibo transfer import。
「随 Workspace 删除」是绑定的属性,不是 Volume 的种类。Workspace 停止后可以换绑、改路径、翻转这个开关或解绑,见绑定、换绑与解绑 Volume。
管理 Volume
kibo volume create、resize 与 delete 在请求内完成,输出显示结果状态。结果丢失时按命令 ID 查询,见结果未知时。
创建 Volume
创建一个不属于任何 Workspace 的 Volume:
kibo volume create --capacity 10G- 不传
--capacity时,容量由 node 的存储配置决定。 --capacity按二进制单位写大小,如10G、512MiB。GB、MB会被拒绝,改写成G或GiB。这类写法、非正数与无法解析的值都在发请求前被拒绝,见大小与 CPU 的写法。- 不传
--command-id时,kibo自动生成一个,并在输出的command_id中返回。 - 之后用
kibo workspace create --volume或kibo workspace volume bind绑定。删除 Workspace 时默认只解除绑定。
查看 Volume
列出 Volume,或查看其中一个:
kibo volume list
kibo volume get "$volume_id"- 两条命令都显示 Volume 的容量与当前绑定的 Workspace。
- 所有 Volume 都有确定的容量,包括随 Workspace 创建的;服务端没有返回容量时显示
unknown。 - 列表默认不显示已删除的 Volume,见列表过滤。
扩容 Volume
先停止使用这个 Volume 的 Workspace,再把 Volume 扩到总共 20 GiB:
kibo workspace stop "$workspace_id"
kibo volume resize "$volume_id" --capacity 20G--capacity必填,是扩容后的总容量,只能增大。- 等于当前容量时命令成功但不做任何事;小于当前容量时返回
invalid_argument。 - 只有未挂载的 Volume 能扩容。Volume 仍挂载在 node 上,或它所属的 Workspace 正在运行时,返回
failed_precondition。 - 扩容期间 Volume 状态为
RESIZING。node 同时扩大 Volume 中的文件系统,Workspace 再次启动后 guest 即可使用新容量。
删除 Volume
删除不再需要的 Volume:
kibo volume delete "$volume_id"kibo 会先请求确认,--yes 跳过确认。除了这条命令,只有在删除 Workspace 且绑定设置为随 Workspace 删除时,Volume 才会被删除,见删除。
结果未知时
create、delete、resize 的响应丢失时,按命令 ID 查询结果:
kibo volume command get "$volume_id" "$command_id"输出给出 status、error 与对应的 result。不要换 ID 重新提交。用法与 kibo workspace command get 相同。
绑定、换绑与解绑 Volume
kibo workspace volume bind 把一个已有的 Volume 绑定到已停止的 Workspace。目标是完整的绑定:换成另一个 Volume、只改挂载路径、只翻转「随 Workspace 删除」开关,都是再次执行这条命令并写出想要的最终值。
警告
省略的参数取默认值:--mount-path 回到 /data,不带 --delete-with-workspace 就关闭「随 Workspace 删除」。所以为了改挂载路径而重新绑定创建时的那个 Volume,不带 --delete-with-workspace 的话,这个 Volume 在 Workspace 删除后会保留下来。
把一个新的 Volume 绑定到 /srv/data,再带着它启动 Workspace:
workspace_id=workspace-example
volume_id=$(kibo volume create --capacity 10G -q)
kibo workspace stop "$workspace_id"
kibo workspace volume bind "$workspace_id" --volume "$volume_id" --mount-path /srv/data
kibo workspace start "$workspace_id"解除已停止 Workspace 的绑定:
kibo workspace volume unbind "$workspace_id"bind 的参数 | 效果 |
|---|---|
--volume | 要绑定的 Volume,必填 |
--mount-path | guest 中的挂载路径,默认 /data |
--delete-with-workspace | 删除 Workspace 时一起删除这个 Volume。不加时保留 Volume |
--expected-revision、--command-id | 见绑定版本 |
前提条件
- 与调整资源相同:Workspace 不持有执行。运行中返回
failed_precondition,先执行kibo workspace stop。 - 目标 Volume 必须存在、处于
AVAILABLE、没有被其他未删除的 Workspace 绑定,并且所在的存储池能被这个 Workspace 当前放置的 node 访问。不满足时分别返回not_found与failed_precondition,绑定不变。
改绑定的效果
- 被换掉或解绑的 Volume 不会被删除:它回到
AVAILABLE,数据原样保留,可以绑到别的 Workspace,或用kibo volume delete显式删除。这与它的开关无关;开关只决定kibo workspace delete的行为。 - 新绑定在下一次
kibo workspace start时挂载。 - 解绑后的 Workspace 没有承诺持久的路径,不能
kibo transfer export。 - 换路径后,旧挂载点留在可写层里,只是一个普通目录。
绑定版本
该命令使用乐观锁,版本是 binding_revision,即 workspace get --wide 中 Revisions 一节的 Volume binding。
- 不传
--expected-revision时,kibo先读取当前版本再提交。 - 提交时版本已变化则返回
aborted,不自动重试。 - 脚本需要重放时,把
--command-id与--expected-revision一起传入。 - 提交与当前完全相同的绑定不改变版本。这个版本与
update用的资源版本各自独立。
导出、导入与恢复
Transfer把已停止 Workspace 的 Volume 导出成归档。归档可以导入为新的 Volume,再恢复成新的 Workspace。 把一个已停止 Workspace 的 Volume 内容复制成新的 Volume,再用它创建新的 Workspace。它分三步,每一步在 ctrl 接受之后由 ctrl 自己执行到底,ctrl 重启或 node 短暂不可达时 ctrl 自行重试。
导出已停止的 Workspace,把归档导入成新的 Volume,再用它恢复出 Workspace:
kibo transfer export "$workspace_id"
kibo transfer import "$transfer_id"
kibo transfer restore "$transfer_id" --volume "$volume_id" --template "$template_id"| 步骤 | 结果 |
|---|---|
export | Volume 中文件的归档,Transfer 为 COMPLETE |
import | 一个带有归档中文件的新 Volume |
restore | 一个绑定导入所得 Volume 的新 Workspace |
导出
export要求 Workspace 处于STOPPED且绑定了 Volume。- 完成后 Transfer 为
COMPLETE,输出里的 manifest 给出文件数、归档大小、SHA-256 和过期时间。 .kibotos/credentials和.kibotos/browser-state两个目录不会被导出。- 归档不压缩,大小与其中的文件相当。单个归档默认不超过 1 GiB,部署方可以修改这个上限。
- 归档超过上限的导出以
resource_exhausted失败,Transfer 进入FAILED。减少 Volume 里的数据,或请部署方调高上限,再重新导出。
导入
import创建一个新的 Volume。默认落在被导出 Volume 所在的存储池;--storage-pool指定另一个池。- 由哪台 node 执行导入由部署决定,只要它接入目标池。
- 因为没有可用的 node 或池容量不足而失败的导入不消耗 Transfer,它仍是
COMPLETE,稍后换一个命令 ID 再导入。 - 在 node 上失败的导入让 Transfer 进入
FAILED,需要重新导出。
恢复
restore用导入得到的 Volume 和你给出的规格创建新的 Workspace,--cpu、--memory、--disk的写法与workspace create相同。- 会话、凭证、进程和登录状态需要重新建立。
等待 Transfer 完成
大的 Volume 导出与导入要几分钟。kibo 用同一个命令 ID 重发,直到命令完成或到 --wait-timeout:
| 命令 | --wait-timeout 默认值 |
|---|---|
export、import | 2 小时 |
restore | 1 小时 |
等待结束或按 Ctrl-C 不会撤回命令。用原来的 --command-id 再运行,接着等它的结果。
归档的保留
归档存放在部署的 artifact store 里,默认保留 24 小时,部署方可以修改保留时间。大小上限见导出。
- 过了保留时间还没有导入的 Transfer 变为
EXPIRED,之后import返回failed_precondition,需要重新导出。 - 已经导入或恢复的 Transfer 不受过期影响,导入得到的 Volume 和恢复出的 Workspace 照常使用。
kibo transfer delete立即删除归档,不需要任何 node 在线。导出、导入或恢复还在进行时返回failed_precondition。
用 API
Volume
Volume 用 VolumeService 管理:创建、扩容与删除在请求内完成,响应带回结果状态。
kibo 命令 | API |
|---|---|
kibo volume create | CreateVolume |
kibo volume resize | ResizeVolume,没有期望版本 |
kibo volume command get | GetVolumeCommand,结果未知时用它查询 |
kibo workspace volume bind | UpdateWorkspaceVolumeBinding |
Transfer
TransferService 的方法是 ExportWorkspace、ImportTransfer、RestoreWorkspace、GetTransfer 与 DeleteTransfer。
三个写方法最长等命令完成 1 分钟,超时返回可重试的 unavailable,命令继续执行,见幂等键。
注意
- 部署方可以用
kibo volume move与kibo workspace move-layer把 Volume 或可写层搬到另一个存储池,见在池之间搬迁对象。 - 搬迁期间,启动所属或绑定它的 Workspace、扩容、绑定或解绑、删除与导出都返回可重试的
unavailable(退出码15),搬迁结束后再试。