kuasar-io/kuasar
GitHub: kuasar-io/kuasar
Kuasar 是一个基于 Rust 的多沙箱容器运行时,通过统一的 Sandbox API 让单个节点上混部多种隔离技术并显著降低资源开销和启动延迟。
Stars: 1437 | Forks: 118

Kuasar 是一个高效的容器 runtime,通过支持多种沙箱技术,提供云原生、全场景的容器解决方案。它使用 Rust 编写,基于 sandbox API 提供了标准的沙箱抽象。此外,Kuasar 还提供了一个优化的框架,以加速容器启动并减少不必要的开销。
## 目录
- [支持的沙箱](#supported-sandboxes)
- [为什么选择 Kuasar?](#why-kuasar)
- [Kuasar 架构](#kuasar-architecture)
- [MicroVM Sandboxer](#microvm-sandboxer)
- [App Kernel Sandboxer](#app-kernel-sandboxer)
- [Wasm Sandboxer](#wasm-sandboxer)
- [Runc Sandboxer](#runc-sandboxer)
- [性能](#performance)
- [快速开始](#quick-start)
- [前置条件](#prerequisites)
- [从源码构建](#build-from-source)
- [启动 Kuasar](#start-kuasar)
- [启动容器](#start-container)
- [联系](#contact)
- [贡献](#contributing)
- [许可证](#license)
# 支持的沙箱
| Sandboxer | Sandbox | 状态 |
|------------|------------------|-----------------|
| MicroVM | Cloud Hypervisor | 已支持 |
| | QEMU | 已支持 |
| | Firecracker | 计划于 2025 年 |
| | StratoVirt | 已支持 |
| Wasm | WasmEdge | 已支持 |
| | Wasmtime | 已支持 |
| App Kernel | Quark | 已支持 |
| runC | runC | 已支持 |
# 为什么选择 Kuasar?
在容器世界中,沙箱是一种用于将容器进程彼此隔离,并与操作系统本身隔离的技术。随着 [Sandbox API](https://github.com/containerd/containerd/issues/4131) 的引入,沙箱已成为 containerd 中的一等公民。随着容器世界中出现越来越多的沙箱技术,期望能提出一种名为“sandboxer”的管理服务。
Kuasar 支持多种类型的 sandboxer,使得用户可以根据应用需求为每个应用选择最合适的 sandboxer。
与其他容器 runtime 相比,Kuasar 具有以下优势:
+ **统一的沙箱抽象**:由于 Kuasar 完全基于 containerd 社区于 2022 年 10 月预览的 Sandbox API 构建,沙箱在 Kuasar 中是一等公民。Kuasar 充分利用了 Sandbox API 的优势,为沙箱的访问和管理提供了统一的方式,提高了沙箱的运维效率。
+ **多沙箱混部**:Kuasar 内置支持主流沙箱,允许在单个节点上运行多种类型的沙箱。Kuasar 能够平衡用户对安全隔离、快速启动和标准化的需求,并使 serverless 节点资源池能够满足各种云原生场景需求。
+ **优化的框架**:Kuasar 通过移除所有 pause 容器并用单个常驻 sandboxer 进程替代 shim 进程进行了优化,带来了 1:N 的进程管理模型,其性能优于当前的 1:1 shim v2 进程模型。基准测试结果表明,Kuasar 的沙箱启动速度提升了 2 倍,同时管理的资源开销减少了 99%。更多详细信息请参阅[性能](#performance)。
+ **开放与中立**:Kuasar 致力于构建一个开放且兼容的多沙箱技术生态系统。得益于 Sandbox API,集成沙箱技术变得更加便捷和省时。Kuasar 对沙箱技术保持开放和中立的态度,因此欢迎所有的沙箱技术。目前,Kuasar 项目正在与 WasmEdge、openEuler 和 QuarkContainers 等开源社区和项目进行合作。
# Kuasar 架构

Kuasar 中的 sandboxer 对容器使用各自的隔离技术,它们也是基于新的沙箱插件机制构建的 containerd 外部插件。在这个 [Containerd issue](https://github.com/containerd/containerd/issues/7739) 中发起了一项关于 sandboxer 插件的讨论,并在该[评论](https://github.com/containerd/containerd/issues/7739#issuecomment-1384797825)中附带了社区会议记录和幻灯片。现在此功能已纳入 2.0 里程碑。
目前,Kuasar 提供了三种类型的 sandboxer —— **MicroVM Sandboxer**、**App Kernel Sandboxer** 和 **Wasm Sandboxer** —— 所有这些均已被证明是多租户环境下的安全隔离技术。sandboxer 的总体架构由两个模块组成:一个是实现 Sandbox API 以管理沙箱生命周期的模块,另一个是实现 Task API 以处理容器相关操作的模块。
此外,Kuasar 也是一个正在积极开发的平台,我们欢迎在它之上构建更多的 sandboxer,例如 Runc sandboxer。
## MicroVM Sandboxer
在 microVM 沙箱场景中,VM 进程基于 [Cloud Hypervisor](https://www.cloudhypervisor.org/)、[StratoVirt](https://gitee.com/openeuler/stratovirt)、[Firecracker](https://firecracker-microvm.github.io/) 和 [QEMU](https://www.qemu.org/) 等开源 VMM 提供完整的虚拟机和 Linux 内核。**所有这些 vm 必须在启用虚拟化的节点上运行,否则无法工作!**。因此,MicroVM sandboxer 的 `vmm-sandboxer` 负责启动 VM 并调用 API,而 `vmm-task` 作为 VM 中的 init 进程,扮演运行容器进程的角色。容器 IO 可以通过 vsock 或 uds 导出。
microVM sandboxer 避免了在主机上运行 shim 进程的必要性,从而带来了更简洁、更易于管理的架构,每个 pod 只有一个进程。

*请注意目前仅支持 Cloud Hypervisor、StratoVirt 和 QEMU。*
## App Kernel Sandboxer
App kernel 沙箱启动一个 KVM 虚拟机和客户机内核,无需任何应用级的 hypervisor 或 Linux 内核。这允许进行定制化优化,以加快启动过程、减少内存开销,并提高 IO 和网络性能。此类 app kernel 沙箱的示例包括 [gVisor](https://gvisor.dev/) 和 [Quark](https://github.com/QuarkContainer/Quark)。
Quark 是一个应用内核沙箱,它利用名为 `QVisor` 的自有 hypervisor 和名为 `QKernel` 的定制化内核。通过对这些组件进行定制化修改,Quark 可以实现显著的性能提升。
App kernel sandboxer 的 `quark-sandboxer` 启动 `Qvisor` 和名为 `Qkernel` 的 app kernel。每当 containerd 需要在沙箱中启动容器时,`QVisor` 中的 `quark-task` 将调用 `Qkernel` 来启动一个新容器。同一个 pod 内的所有容器都将在同一个进程内运行。

*请注意目前仅支持 Quark。*
## Wasm Sandboxer
Wasm 沙箱(例如 [WasmEdge](https://wasmedge.org/) 或 [Wasmtime](https://wasmtime.dev/))极其轻量,但目前它可能对某些应用程序有限制。`wasm-sandboxer` 和 `wasm-task` 在 WebAssembly runtime 中启动容器。每当 containerd 需要在沙箱中启动容器时,`wasm-task` 将 fork 一个新进程,启动一个新的 WasmEdge runtime,并在其中运行 Wasm 代码。同一个 pod 内的所有容器将与 `wasm-task` 进程共享相同的 Namespace/Cgroup 资源。

## Runc Sandboxer
除了安全容器之外,Kuasar 还提供了对 [runC](https://github.com/opencontainers/runc) 容器的支持。为了生成一个单独的 namespace,`runc-sandboxer` 通过双重 fork 创建了一个轻量级进程,然后使其成为 PID 1。基于这个 namespace,`runc-task` 可以创建容器进程并加入该 namespace。如果容器需要私有的 namespace,它将为自身 unshare 一个新的 namespace。

# 性能
Kuasar 的性能通过两个指标来衡量:
+ 端到端容器启动时间。
+ 运行容器的进程内存消耗。
我们在基准测试中使用了 Cloud Hypervisor,并测试了在串行和并行场景下 100 个 POD 的启动时间。结果表明,在启动速度和内存消耗方面,Kuasar 的性能均优于开源的 [Kata-containers](https://github.com/kata-containers/kata-containers)。
有关详细的测试脚本、测试数据和结果,请参阅[基准测试](tests/benchmark/Benchmark.md)。
# 快速开始
## 前置条件
### 1. 操作系统
Kuasar 支持的 Linux 发行版最低版本为 *Ubuntu 22.04* 或 *CentOS 8* 或 openEuler 23.03。
另请注意,Quark 要求 Linux 内核版本 >= 5.15。
### 2. 沙箱
+ MicroVM:要启动基于 microVM 的沙箱,必须在**启用了虚拟化**的主机上安装 hypervisor。
+ 建议默认安装 Cloud Hypervisor。您可以[在此处](https://github.com/cloud-hypervisor/cloud-hypervisor/blob/main/docs/building.md)找到 Cloud Hypervisor 的安装说明。
+ 如果您想使用 iSulad 容器引擎和 StratoVirt hypervisor 运行 kuasar,可以参考此指南 [how-to-run-kuasar-with-isulad-and-stratovirt](docs/vmm/how-to-run-kuasar-with-isulad-and-stratovirt.md)。
+ Quark:要使用 Quark,请参阅[此处](docs/quark/README.md)的安装说明。
+ WasmEdge:要启动 WebAssembly 沙箱,您需要安装 WasmEdge v0.13.5。有关安装 WasmEdge 的说明,请参见 [install-a-specific-version-of-wasmedge](https://wasmedge.org/docs/start/install/#install-a-specific-version-of-wasmedge)。
### 3. containerd
Kuasar sandboxer 是 containerd 的外部插件,因此为了管理沙箱和容器,containerd 及其 CRI 插件都是必需的。
我们提供了两种方式将 Kuasar 与 containerd 结合使用:
+ **containerd 2.0 里程碑中的实验性功能**:如果您渴望获得 Kuasar 的完整体验,请安装 [kuasar-io 组织下的 containerd](docs/containerd.md)。请放心,我们的 containerd 是基于官方 v1.7.0 构建的,因此不必担心会缺失任何功能。
+ 如果兼容性确实是一个问题,您需要安装官方的 containerd v1.7.0,并使用一个额外的 [kuasar-shim](shim) 进行请求转发,详见[此处](docs/shim/README.md)。但是,随着 containerd 2.0 的发展,这种方式未来可能会被弃用。
### 4. crictl
由于 Kuasar 构建在 Sandbox API 之上,而该 API 已经集成到 containerd 的 CRI 中,因此从 CRI 层面体验 Kuasar 是很有意义的。
`crictl` 是用于 CRI 的调试 CLI。要安装它,请参见[此处](https://github.com/kubernetes-sigs/cri-tools/blob/master/docs/crictl.md#install-crictl)
### 5. virtiofsd
像 Cloud Hypervisor 这样的 MicroVM 需要 virtiofs 守护进程来共享主机上的目录。请参阅 [virtiofsd 指南](https://gitlab.com/virtio-fs/virtiofsd)。
## 从源码构建
编译 Kuasar 需要 Rust 1.67 或更高版本。使用 root 用户进行构建:
```
git clone https://github.com/kuasar-io/kuasar.git
cd kuasar
make all
make install
```
## 启动 Kuasar
通过以下命令启动 sandboxer:
+ 对于 vmm:`nohup vmm-sandboxer --listen /run/vmm-sandboxer.sock --dir /run/kuasar-vmm &`
+ 对于 quark:`nohup quark-sandboxer --listen /run/quark-sandboxer.sock --dir /var/lib/kuasar-quark &`
+ 对于 wasm:`nohup wasm-sandboxer --listen /run/wasm-sandboxer.sock --dir /run/kuasar-wasm &`
+ 对于 runc:`nohup runc-sandboxer --listen /run/runc-sandboxer.sock --dir /run/kuasar-runc &`
## 启动容器
由于 Kuasar 是一个底层容器 runtime,所有的交互都应通过 containerd 中的 CRI(例如 crictl 或 Kubernetes)来完成。我们以 crictl 为例:
+ 对于 vmm、quark 或 runc,运行以下脚本:
`examples/run_example_container.sh kuasar-vmm`、`examples/run_example_container.sh kuasar-quark` 或 `examples/run_example_container.sh kuasar-runc`
+ 对于 wasm:Wasm 容器需要自己的容器镜像,因此我们的脚本必须首先构建并导入容器镜像。
`examples/run_example_wasm_container.sh`
# 联系
如果您有任何问题,请随时通过以下方式联系我们:
- [邮件列表](https://groups.google.com/forum/#!forum/kuasar)
- [slack](https://cloud-native.slack.com/archives/C052JRURD8V) | [加入](https://slack.cncf.io/)
# 贡献
如果您有兴趣成为贡献者并想参与开发 Kuasar 代码,请参阅 [CONTRIBUTING](CONTRIBUTING.md) 了解有关提交补丁和贡献工作流的详细信息。
# 许可证
Kuasar 采用 Apache 2.0 许可证。详细信息,请参阅 [LICENSE](LICENSE) 文件。
Kuasar 文档采用 [CC-BY-4.0 许可证](https://creativecommons.org/licenses/by/4.0/legalcode)。
标签:Rust, WASM, 可视化界面, 子域名突变, 容器运行时, 微虚拟机, 沙箱, 网络流量审计, 身份验证强制, 通知系统