基本逻辑
cube sandbox是腾讯开发的一个沙箱系统,基于kvm的虚机沙箱是其核心,但是它的范围很
广,涉及沙箱管理的各个方面。
cube的组件包括CubeAPI、CubeMaster、Cubelet、cube-shim、cube-hypervisor、cube-proxy等。
CubeAPI,估计是为了兼容E2B协议,所以这里先收请求然后转换格式后发送到CubeMaster。
CubeMaster,接收沙箱请求的核心部件,整个集群一个。CubeMaster负责管理沙箱,并把请求
转发到对应的Cubelet。
Cubelet可以是一台物理服务器一个实例,管理本实例下的所有沙箱。一台沙箱对应一个cube-shim,
cube-shim里的cube-hypervisor对应VMM。虚机里面跑cube-agent。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| +---------------------------+ CubeSandbox v0.7.0 +-----------------------+ | all-in-one node | | | | CLIENTS | | | | +----------------------+ +------------------+ +-------------+ | | | E2B / Python SDK | | cubemastercli | | cubecli | | | | cube-bench (Go) | | (mgmt CLI) | | (node CLI) | | | +-----------+----------+ +--------+---------+ +------+------+ | | | | | | | | E2B HTTP | REST | unix | | | | | socket | | v v v | | CONTROL PLANE | | +----------------------+ +---------------------+ | | | CubeAPI :3000 | | CubeMaster :8089 | | | | Rust / Tokio |------->| Go | | | | 30s TimeoutLayer | | scheduler | | | +----------------------+ | templates | | | +----------+----------+ | | | | | | gRPC | | +----------+----------+ | | | | | | +--------+--------+ +--------+--------+ | | | CubeOps :3010 | | WebUI :12088 | | | | node registry | | (nginx) | | | +--------+--------+ +-----------------+ | | | | | | HTTP notify (heartbeat) | | v | | STORAGE / INFRA | | +------------+ +------------+ +------------+ +-------------+ | | | MySQL | | Redis | | MinIO | | CoreDNS | | | | (meta) | | (routes) | | :9000 | | 127.0.0.54 | | | +------------+ +------------+ | (S3 vol) | | (cube.app | | | +------------+ | lookup) | | | +-------------+ | +--------------------------------------------------------------------------+ | | gRPC (create / destroy / exec) v +--------------------------------------------------------------------------+ | DATA PLANE | | +------------------------------------------------+ | | | Cubelet | | | | Go, embedded containerd | | | | workflow semaphore = 100 | | | | unix sock: /data/cubelet/cubelet.sock | | | +---------------------+--------------------------+ | | | | | | ttrpc | | v | | +-------------------------------------------------------+ | | | per-sandbox (x N) | | | | | | | | +----------------------------------------------+ | | | | | cube-shim (Rust, containerd shim v2) | | | | | | | | | | | | | +--> embedded cube-hypervisor | | | | | | vcpu0..N threads (KVM_RUN) | | | | | +----------------------+-----------------------+ | | | | | | | | | KVM ioctl | | | | v | | | | +------------+ | | | | | /dev/kvm | | | | | +------------+ | | | | ^ | | | | | ttrpc / vsock | | | | +------+-------------------------+ | | | | | guest MicroVM | | | | | | cube-agent | | | | | | envd :49999 / :49983 (app) | | | | | +--------------------------------+ | | | +-------------------------------------------------------+ | | | | +-------------------------------------------------------+ | | | CubeProxy :80 / :443 / :9090 | | | | nginx + OpenResty, reads Redis for routing | | | | CubeEgress :9091 (L7 MITM) | | | | lcm (lifecycle manager) | | | +-------------------------------------------------------+ | | | +--------------------------------------------------------------------------+
|
(AI生成)
测试命令
基于以上的认识,所以用户可以通过各种接口使用cube沙箱。三类入口对服务端的
访问路径如下:
| 入口 |
服务端路径 |
入口参数 |
| cube-bench / E2B SDK脚本 |
CubeAPI :3000 -> CubeMaster |
E2B_API_URL |
| cube自有SDK脚本(快照系列等) |
CubeAPI :3000 -> CubeMaster |
CUBE_API_URL |
| cubemastercli |
直连CubeMaster :8089 |
-a/-p命令行参数 |
| cubecli |
本机Cubelet unix socket |
无 |
- 通过E2B协议提供的接口。
cube-bench、cubebench.sh、examples目录下的各种脚本都是通过这种方式。cube提供的SDK
是对这些接口的封装,用户可以编程使用。
cube-bench提供沙箱起停的快速测试,examples/snapshot-rollback-clone下的脚本,提供
快照、回滚、克隆的单点性能测试。cubebench.sh提供批量性能测试。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| export E2B_API_URL=http://127.0.0.1:3000 E2B_API_KEY=local export CUBE_TEMPLATE_ID=<tpl-id> export CUBE_API_URL=http://127.0.0.1:3000
~/CubeSandbox/examples/cube-bench/bin/cube-bench -m create-delete -c 1 -n 5
cd ~/CubeSandbox/examples/snapshot-rollback-clone python bench_snapshot_concurrency.py -c 1 -n 5 python bench_snapshot_dirty.py -d 10 -n 3 python bench_clone_concurrency.py -c 1 -n 5 python bench_create_concurrency.py -c 1 -n 3 python bench_rollback_concurrency.py -c 1 -n 5 python bench_pause_resume_concurrency.py -c 1 -n 5
bash ~/CubeSandbox/tests/perf/cubebench.sh run 3.2
|
- cubemastercli命令行。
这个直接发信息给CubeMaster。-a指定CubeMaster的IP。基本功能是沙箱镜像/快照的创建/管理,
沙箱运行,沙箱状态的管理等。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| CM="cubemastercli -a 127.0.0.1"
$CM tpl create-from-image --image cube-sandbox-int.tencentcloudcr.com/cube-sandbox/sandbox-code:latest \ --writable-layer-size 1Gi --expose-port 49999 --probe 49999 $CM tpl ls
$CM tpl render --template-id <tpl-id> --json > /tmp/render.json python3 -c "import json;d=json.load(open('/tmp/render.json'));json.dump(d['api_request'],open('/tmp/req.json','w'))" $CM multirun /tmp/req.json $CM multirun --norm /tmp/req.json
$CM cubebox ls $CM cubebox rm <sandBoxId> $CM snapshot create --sandbox-id <id>
|
- cubecli命令行。
沙箱中执行命令,执行bash可以直接进入沙箱系统,交互式地执行沙箱里的命令。
1 2 3
| sudo cubecli exec -it <sandBoxId> bash sudo cubecli exec -d <sandBoxId> cmd sudo cubecli logs <sandBoxId>
|