Skip to main content

快照管理

概述

Checkpoint 是 OpenKruise Agents 的一等公民 CRD。每个 Checkpoint 对象捕获运行中沙箱 Pod 某一时刻的状态(内存 和/或 文件系统),之后可以用它作为起点克隆(Fork)出全新的沙箱。

OpenKruise Agents 通过 两种 并列的接入方式对外暴露 Checkpoint 能力,底层操作的是同一个 Checkpoint CR:

接入方式面向的使用者典型场景
Kubernetes CRD集群运维、声明式 GitOps、kubectl 或自定义控制器直接使用原生地创建/查看/删除/回收 Checkpoint
E2B SDK(Snapshot API)基于 E2B Python / JavaScript SDK 的应用代码在沙箱进程内以编程方式管理快照生命周期

E2B SDK 把这一能力称为 Snapshot;在 OpenKruise Agents 内部,其底层对象是 Checkpoint CR —— E2B 返回的 snapshotId 就是 Checkpoint 的名称。本文以 Checkpoint 为核心,配套展示两种接入方式的使用方法。

Checkpoint vs. 休眠/唤醒

Checkpoint 与休眠/唤醒底层共享同一套捕获机制,但面向的场景不同:

暂停/恢复(Pause/Resume)Checkpoint(快照)
对源沙箱的影响被暂停(停止运行)短暂暂停后按配置恢复运行
关系一对一 —— 恢复后仍是同一个沙箱一对多 —— 一个 Checkpoint 可克隆出多个新沙箱
操作后沙箱 ID保持不变源沙箱 ID 不变;克隆出的新沙箱各自有新的 ID
典型场景挂起单个沙箱稍后继续使用检查点、回滚、从运行时状态分叉

Checkpoint CRD

Checkpoint 资源(agents.kruise.io/v1alpha1,缩写 cp)的关键字段如下:

字段类型说明
spec.podNamestring要执行 checkpoint 的目标 Pod 名称,通常等于源沙箱名称。
spec.sandboxNamestring可选。当仅靠 podName 不足以定位源沙箱时使用。
spec.keepRunningboolcheckpoint 完成后源 Pod 是否继续 Running,默认 true。若为 false,Pod 阶段会变为 Succeeded
spec.persistentContents[]string要持久化的内容。可选值:memoryfilesystem。为空时默认两者都启用(从源模板继承)。
spec.ttlAfterFinishedstringGo duration(如 30m24h30d)。配置后 Checkpoint CR 到期自动删除;不配置表示保留直到被主动删除。
status.phasestringPending / Creating / Succeeded / Failed / Terminating
status.checkpointIdstring底层 Checkpoint 驱动中该快照的标识。阶段变为 Succeeded 时写入。
status.completionTimeTime阶段进入 SucceededFailed 时写入。

创建 Checkpoint

对目标 Pod / Sandbox 直接 apply 一个 Checkpoint 清单:

apiVersion: agents.kruise.io/v1alpha1
kind: Checkpoint
metadata:
name: checkpoint-code-demo-01
namespace: default
spec:
# 目标 Pod Name
podName: code-interpreter-28rvn
# checkpoint 之后是否要求 Pod 处于 Running 状态。
# 如果是 false,Pod 阶段会变为 Succeeded。
keepRunning: true
# Checkpoint 回收时间,到期后产品侧会主动删除 Checkpoint CR;
# 不配置则默认不回收,由用户主动删除 Checkpoint CR 释放底层资源。
ttlAfterFinished: 30h # 格式,例如 30m、30h、30d
# 要持久化的内容,目前仅支持 memory 和 filesystem 组合,默认两者都启用。
persistentContents:
- memory
- filesystem

查看 Checkpoint 进度:

$ kubectl get cp
NAME STATUS AGE
checkpoint-code-demo-01 Succeeded 24s

STATUS 变为 Succeeded 时,即可作为新沙箱的起点。

列出 Checkpoint

使用缩写 cp 直接 kubectl 查看(Checkpoint 按 namespace 隔离):

$ kubectl get cp -n default
NAME STATUS AGE
checkpoint-code-demo-01 Succeeded 5m
checkpoint-code-demo-02 Creating 10s

也可以通过 agents.kruise.io/sandbox-name label 按源沙箱过滤(E2B 接口创建的 Checkpoint 会自动带上该 label;CRD 直接创建时可以手动设置):

$ kubectl get cp -l agents.kruise.io/sandbox-name=code-interpreter-28rvn

删除 Checkpoint

删除 Checkpoint 会同时清理 Checkpoint CR 以及其配对的 SandboxTemplate已经 从它克隆 / Fork 出的沙箱不受影响。

kubectl delete cp checkpoint-code-demo-01 -n default

也可以依赖 spec.ttlAfterFinished 自动回收。

从 Checkpoint 创建沙箱

状态为 Succeeded 的 Checkpoint 可以作为新沙箱的起点,传入其 Checkpoint.name 作为模板标识即可。

apiVersion: agents.kruise.io/v1alpha1
kind: SandboxClaim
metadata:
name: demo-from-checkpoint
namespace: default
spec:
# 当同 namespace 存在与此同名的 Checkpoint 时,
# SandboxClaim 会走克隆路径,而不是从 warm pool 获取。
templateName: checkpoint-code-demo-01

完整的 claim 选项请参考 获取沙箱

Checkpoint vs. SandboxTemplate / SandboxSet

Checkpoint 与模板都能作为沙箱的可复用起点,但解决的问题不同:

SandboxTemplate / SandboxSetCheckpoint(快照)
定义方式声明式 CRD + 镜像捕获运行中的沙箱
可重现性同一定义始终产出相同沙箱捕获的是当时的运行时状态
适用场景可复用的基础环境、预热池检查点、回滚、从运行时状态分叉

当希望每个沙箱都从相同的预置基线启动时,使用模板;当需要捕获或分叉依赖执行过程的实时状态时,使用 Checkpoint。

注意事项

  1. 连接会断开:捕获期间源沙箱会被短暂暂停,所有活动的 WebSocket、PTY、命令流连接都会断开。客户端必须能够重连。
  2. 后端依赖:具体的 Checkpoint 语义(保留什么内容、速度、体积)取决于集群中配置的 Checkpoint 驱动。
  3. E2B 接入按用户隔离listSnapshots 与 E2B 的删除路径都按创建它的 API-key 用户隔离;Admin Team 的 API-key 在 listSnapshots 中可跨 namespace 查看。
  4. CRD 接入不做用户隔离:通过 kubectl / CRD 直接访问时,只受 Kubernetes RBAC(checkpoints.agents.kruise.io)约束,不经过 E2B 的用户维度校验。
  5. E2B deleteSnapshot 共用删除端点DELETE /templates/{id} 同时承担 Checkpoint 与模板的删除路由。Checkpoint 可以通过 E2B 接口删除;SandboxSet 形式的模板不允许通过 E2B 接口删除。