概述
所有组件
代码分析
kuasar 代码仓库中共有如下 11 个 Cargo.toml:
-
Cargo.toml
-
shim/Cargo.toml
-
vmm/task/Cargo.toml
-
runc/Cargo.toml
-
quark/Cargo.toml
-
wasm/Cargo.toml
-
vmm/sandbox/src/bin
-
vmm/sandbox/src/bin/qemu/main.rs
-
runc/src/main.rs
-
quark/src/main.rs
-
wasm/src/main.rs
通过对上述所有 Cargo.toml 文件的分析,kuasar项目总共会打包出以下二进制文件。
二进制文件总览
kuasar项目总共会打包出8个主要的二进制文件,分为以下几类:
1. Shim 二进制文件 (2个)
- containerd-shim-kuasar-vmm-v2
- 功能:VMM sandboxer的containerd shim
- main入口:
shim/src/bin/containerd-shim-kuasar-vmm-v2.rs
- containerd-shim-kuasar-wasm-v2
- 功能:WASM sandboxer的containerd shim
- main入口:
shim/src/bin/containerd-shim-kuasar-wasm-v2.rs
2. Sandboxer 二进制文件 (4个)
- quark-sandboxer
- 功能:App-Kernel沙箱运行时
- main入口:
quark/src/main.rs
- runc-sandboxer
- 功能:传统runc沙箱运行时的包装器
- main入口:
runc/src/main.rs
- wasm-sandboxer
- 功能:WebAssembly沙箱运行时(支持WasmEdge和Wasmtime)
- main入口:
wasm/src/main.rs
- vmm-task
- 功能:VMM任务服务器(在虚拟机内部运行)
- main入口:
vmm/task/src/main.rs
3. VMM Hypervisor 二进制文件 (3个)
这些都在vmm/sandbox模块中定义:
- qemu
- 功能:基于QEMU的虚拟机监控器
- main入口:
vmm/sandbox/src/bin/qemu/main.rs
- cloud_hypervisor
- 功能:基于Cloud Hypervisor的虚拟机监控器
- main入口:
vmm/sandbox/src/bin/cloud_hypervisor/main.rs
- stratovirt
- 功能:基于StratoVirt的虚拟机监控器
- main入口:
vmm/sandbox/src/bin/stratovirt/main.rs
4. 测试工具 (1个)
- kuasar-e2e
- 功能:端到端测试工具
- main入口:
tests/e2e/src/main.rs
关于Cargo.toml的说明
并不是所有的Cargo.toml都会打包出二进制文件:
- vmm/common/Cargo.toml: 这是一个库(library)模块,不生成二进制文件,只提供给其他模块使用的共享代码
- vmm/sandbox/derive/Cargo.toml: 这是一个过程宏库,不生成独立的二进制文件
所以总结来说,kuasar项目会生成8个主要的可执行二进制文件,覆盖了从容器运行时到虚拟机监控器的完整技术栈。
cloud hypervisor 相关
相关的二进制文件
如果只考虑启动Cloud Hypervisor的microVM,需要使用到的二进制文件包括:
必需的Kuasar二进制文件
-
Shim二进制文件 containerd-shim-kuasar-vmm-v2
- 功能:作为containerd和VMM sandboxer之间的桥梁
- 位置:
shim/src/bin/containerd-shim-kuasar-vmm-v2.rs - 作用:接收containerd的CRI调用,转发给VMM sandboxer
-
VMM Sandboxer二进制文件 cloud_hypervisor (VMM sandboxer的一个实现)
- 功能:基于Cloud Hypervisor的虚拟机监控器和沙箱管理器
- 位置:
vmm/sandbox/src/bin/cloud_hypervisor/main.rs - 作用:创建和管理Cloud Hypervisor虚拟机实例,处理容器生命周期
-
虚拟机内部任务服务器 vmm-task
- 功能:在虚拟机内部运行的任务服务器
- 位置:
vmm/task/src/main.rs - 作用:在VM内部处理容器的创建、启动、停止等操作
外部依赖的二进制文件
-
Cloud Hypervisor本体
- 这是外部的Cloud Hypervisor项目提供的二进制文件
- Kuasar通过调用这个二进制文件来实际启动和管理虚拟机
总结: 最核心的是这4个二进制文件:
containerd-shim-kuasar-vmm-v2(Kuasar提供)cloud_hypervisorVMM sandboxer (Kuasar提供)vmm-task(Kuasar提供)cloud-hypervisor(外部Cloud Hypervisor项目提供)
这是启动Cloud Hypervisor microVM的最小二进制文件集合。其他的sandboxer(如wasm、quark、runc)以及对应的shim在这个场景下都不需要。
典型的工作流程
- containerd 接收到创建Pod/容器的请求
- containerd-shim-kuasar-vmm-v2 被containerd调用
- cloud_hypervisor (VMM sandboxer) 被shim启动
- VMM sandboxer调用外部的 cloud-hypervisor 二进制文件创建虚拟机
- vmm-task 在虚拟机内部启动,处理容器相关操作
sequenceDiagram
participant User as 用户/Kubernetes
participant Containerd as containerd
participant Shim as containerd-shim-kuasar-vmm-v2
participant VMM as cloud_hypervisor (VMM Sandboxer)
participant CH as cloud-hypervisor (外部二进制)
participant VM as Virtual Machine
participant Task as vmm-task (VM内部)
Note over User, Task: Cloud Hypervisor MicroVM 创建流程
%% 1. 创建Pod/容器请求
User->>Containerd: 创建Pod请求 (via CRI)
Note right of User: kubectl/crictl create pod
%% 2. Containerd调用Shim
Containerd->>Shim: 启动 containerd-shim-kuasar-vmm-v2
Note right of Containerd: containerd识别runtime类型<br/>选择kuasar-vmm runtime
%% 3. Shim与VMM Sandboxer通信
Shim->>VMM: 通过Unix Socket连接VMM Sandboxer
Shim->>VMM: 发送CreateSandbox请求
Note right of Shim: 传递容器规格、网络配置等
%% 4. VMM Sandboxer创建虚拟机
VMM->>VMM: 生成Cloud Hypervisor配置
Note right of VMM: 配置CPU、内存、网络、存储等
VMM->>CH: 调用cloud-hypervisor二进制
Note right of VMM: 启动hypervisor进程
CH->>VM: 创建并启动虚拟机
Note right of CH: 初始化VM硬件、加载内核
%% 5. VM内部初始化
VM->>Task: 启动vmm-task服务
Note right of VM: VM启动后自动运行vmm-task
Task->>VMM: 建立VM内外通信连接
Note right of Task: 通过vsock或其他方式
%% 6. 创建容器
VMM->>Task: 发送CreateContainer请求
Note right of VMM: 传递容器镜像、配置等
Task->>Task: 在VM内创建容器
Note right of Task: 设置namespace、挂载、进程等
Task->>VMM: 返回创建成功响应
%% 7. 启动容器
VMM->>Task: 发送StartContainer请求
Task->>Task: 启动容器进程
Task->>VMM: 返回启动成功响应
%% 8. 响应链路返回
VMM->>Shim: 返回Sandbox创建成功
Shim->>Containerd: 返回成功响应
Containerd->>User: Pod/容器创建完成
%% 9. 运行时管理(可选)
Note over Shim, Task: 运行时操作 (exec, logs, stats等)
User->>Containerd: 执行命令 (kubectl exec)
Containerd->>Shim: 转发exec请求
Shim->>VMM: 发送exec请求
VMM->>Task: 转发到VM内部
Task->>Task: 在容器内执行命令
Task->>VMM: 返回执行结果
VMM->>Shim: 转发结果
Shim->>Containerd: 返回结果
Containerd->>User: 显示命令输出
这个序列图展示了以下关键步骤:
主要阶段
- 请求发起: 用户通过kubectl/crictl发起Pod创建请求
- Shim启动: containerd根据RuntimeClass选择并启动kuasar shim
- Sandbox创建: Shim与VMM Sandboxer通信,请求创建新的沙箱
- VM创建: VMM Sandboxer调用Cloud Hypervisor创建虚拟机
- VM初始化: 虚拟机启动,内部的vmm-task服务开始运行
- 容器管理: 通过VM内外通信在虚拟机内创建和启动容器
- 运行时操作: 支持exec、logs等运行时操作
关键组件职责
- containerd-shim-kuasar-vmm-v2: CRI到Kuasar的适配层
- cloud_hypervisor (VMM Sandboxer): 虚拟机生命周期管理
- cloud-hypervisor: 实际的hypervisor进程
- vmm-task: VM内部的容器管理服务
这个架构实现了容器在轻量级虚拟机中的强隔离运行。