K3s + Sysbox:讓容器擁有“虛擬機(jī)的靈魂”
K3s 二進(jìn)制文件集成了運(yùn)行生產(chǎn)級、符合 CNCF 標(biāo)準(zhǔn)的 Kubernetes 集群所需的全部組件,包括 containerd、runc、kubelet 等。在本文中,我們將介紹 containerd 如何與 OCI runtime 通信,并探討如何在 K3s 中添加另一個(gè)容器運(yùn)行時(shí) —— Sysbox,以及它在運(yùn)行系統(tǒng)級 Pod 時(shí)的應(yīng)用場景。
Containerd 與 Runc 的關(guān)系
首先,讓我們簡要了解一下 containerd 是如何與 runc 協(xié)作的。containerd 是一個(gè)常駐的守護(hù)進(jìn)程,主要負(fù)責(zé)以下任務(wù):
- 鏡像管理:從鏡像倉庫拉取并存儲鏡像。
- 容器管理:管理容器生命周期(創(chuàng)建、啟動、停止、刪除)。
- 快照管理:通過 snapshotter 管理容器文件系統(tǒng)層。
- 運(yùn)行時(shí)管理:將容器創(chuàng)建的任務(wù)委托給兼容 OCI 的運(yùn)行時(shí)(如 runc)。
當(dāng)你在 Kubernetes 中創(chuàng)建 Pod 時(shí),kubelet 會通過 containerd 實(shí)現(xiàn)的 CRI 插件 向 containerd 發(fā)送請求,要求創(chuàng)建 Pod sandbox(RunPodSandbox)并創(chuàng)建容器(CreateContainer)。containerd 隨后會啟動一個(gè) shim 進(jìn)程,該進(jìn)程在 containerd 與 OCI runtime(如 runc)之間充當(dāng)中間層。
shim 的存在有一個(gè)關(guān)鍵作用:即便 containerd 守護(hù)進(jìn)程崩潰或重啟,容器依然可以繼續(xù)運(yùn)行。
在啟動過程中,shim 會生成 OCI runtime 所需的 bundle(包括 config.json 和 rootfs 路徑),然后調(diào)用 runc 二進(jìn)制文件。runc 讀取 config.json,配置容器的 namespace 和 cgroup,最后啟動容器進(jìn)程。
runc 是直接與 Linux 內(nèi)核交互的組件——它負(fù)責(zé)配置 cgroup、namespace、seccomp、權(quán)限和掛載。當(dāng)容器創(chuàng)建完成后,runc 就會退出,shim 則繼續(xù)負(fù)責(zé)容器生命周期與 I/O 的管理。

Sysbox Runtime 簡介
Sysbox 是由 Nestybox 創(chuàng)建的開源新一代容器運(yùn)行時(shí)。與傳統(tǒng)的 runc 不同,Sysbox 專為運(yùn)行 “系統(tǒng)容器(system containers)” 而設(shè)計(jì)。它利用 Linux 用戶命名空間(user namespaces) 以及其他內(nèi)核特性,為容器提供更接近輕量虛擬機(jī)的行為。
這意味著,你可以在一個(gè) Pod 中運(yùn)行 Docker、Systemd、containerd,甚至 K3s 本身——而無需使用特權(quán)模式(privileged mode)。
簡而言之,Sysbox 填補(bǔ)了應(yīng)用容器與虛擬機(jī)之間的空白。它的典型應(yīng)用場景包括:
- 在 Kubernetes 中運(yùn)行 Kubernetes(K8s-in-K8s)。
- 構(gòu)建需要完整操作系統(tǒng)環(huán)境的 CI/CD 流水線。
- 提供具備虛擬機(jī)隔離級別但速度接近容器的開發(fā)環(huán)境。
目前,Sysbox 官方僅支持 CRI-O。
CRI-O 原生支持 Linux 用戶命名空間,這是 Sysbox 運(yùn)行的基礎(chǔ)。
雖然 containerd 自 v2.0 起也加入了 user namespace 支持,但此前 sysbox-runc 存在一個(gè) bug,導(dǎo)致與 containerd 不兼容。
Sysbox-runc 與 Containerd 的集成
經(jīng)過排查這個(gè)問題之后,我們發(fā)現(xiàn)問題的根源在于 containerd 無法執(zhí)行 sysbox-runc 的一個(gè)子命令 features,導(dǎo)致出現(xiàn)以下錯(cuò)誤:
level=debug msg="failed to introspect features of runtime \"sysbox-runc\"" error="failed to unmarshal Features (*anypb.Any): type with url : not found"
由于無法正確檢測到 Sysbox 的功能特性,containerd 認(rèn)為 sysbox-runc 不支持 user namespace,進(jìn)而導(dǎo)致容器創(chuàng)建失敗。該問題現(xiàn)已在 sysbox-runc 倉庫中修復(fù),使得 containerd 能夠正確地與 sysbox-runc 協(xié)作運(yùn)行。
在 K3s 中運(yùn)行 Sysbox-runc
若要在 K3s 中使用 sysbox-runc,你需要首先擁有一個(gè)已運(yùn)行的 K3s 集群。然后安裝最新版本的 Sysbox。但由于 containerd 支持修復(fù)尚未合并到 Sysbox 主倉庫(僅在 sysbox-runc 中),因此需要從源碼構(gòu)建最新版。
1. 安裝 Docker
在構(gòu)建 Sysbox 之前,請確保系統(tǒng)中已安裝 Docker。
2. 克隆倉庫并準(zhǔn)備代碼
git clone --recursive https://github.com/nestybox/sysbox.git
cd sysbox/sysbox-runc
git pull origin main
cd ..
make IMAGE_BASE_DISTRO=ubuntu IMAGE_BASE_RELEASE=jammy sysbox-static
構(gòu)建完成后,你可以將生成的二進(jìn)制文件復(fù)制到 /usr/bin,或者直接在同一臺運(yùn)行 containerd 的機(jī)器上執(zhí)行:
make install
3. 啟動 Sysbox
sysbox
4. 創(chuàng)建 Sysbox RuntimeClass
apiVersion: node.k8s.io/v1
kind: RuntimeClass
metadata:
name: sysbox-runc
handler: sysbox-runc
5. 在 containerd 中添加 Sysbox 運(yùn)行時(shí)配置
創(chuàng)建文件 /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl:
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.sysbox-runc]
runtime_type = "io.containerd.runc.v2"
[plugins.'io.containerd.cri.v1.runtime'.containerd.runtimes.sysbox-runc.options]
SystemdCgroup = false
BinaryName="/usr/bin/sysbox-runc"
6. 使用 Sysbox 運(yùn)行 Pod
apiVersion: v1
kind: Pod
metadata:
name: ubuntu
spec:
runtimeClassName: sysbox-runc
hostUsers: false
containers:
- name: ubuntu2204
image: ubuntu:22.04
command: ["sleep", "40000000000"]
restartPolicy: Never
總結(jié)
Sysbox 為 Kubernetes 帶來了新的能力:它允許在容器中運(yùn)行系統(tǒng)級工作負(fù)載,具備強(qiáng)隔離性,同時(shí)不依賴特權(quán)模式。結(jié)合 K3s 使用后,它可以實(shí)現(xiàn)以下創(chuàng)新場景:
- 在 Kubernetes 中運(yùn)行 Kubernetes(如 K3k 虛擬集群)。
- 為開發(fā)者提供安全、輕量的類似于虛擬機(jī)的沙箱。
- 在 Pod 中運(yùn)行系統(tǒng)守護(hù)進(jìn)程或嵌套的容器引擎。
雖然目前 Sysbox 官方僅支持 CRI-O,但隨著 sysbox-runc 的修復(fù),它已經(jīng)可以與 containerd 正常配合使用,從而實(shí)現(xiàn)與 K3s 的集成。
這也標(biāo)志著容器生態(tài)的發(fā)展方向正在從傳統(tǒng)的“應(yīng)用容器”,逐步邁向更加靈活、具備系統(tǒng)級能力的“系統(tǒng)容器”。
如果你正在使用 K3s,并希望在 Pod 中探索系統(tǒng)級工作負(fù)載,Sysbox 無疑是一個(gè)值得嘗試的方案,它讓你在保持原生 Kubernetes 工作流的同時(shí),獲得接近虛擬機(jī)的隔離體驗(yàn)。
浙公網(wǎng)安備 33010602011771號