在 Kubernetes 生态中,有三种主流的 VM/容器融合方案:Virtlet、Kata Containers 和 KubeVirt。本文对比它们的核心原理与适用场景。
Tap Device vs Domain Socket
首先澄清一个常见疑问:tap device 不是 domain socket,两者是完全不同的机制。
|
Tap Device |
Unix Domain Socket |
| 本质 |
内核虚拟网络接口(Layer 2) |
进程间通信端点 |
| 存在形式 |
网卡接口(如 tap0) |
文件系统路径(如 /var/run/foo.sock) |
| 用途 |
VM 网络通信 |
IPC(进程间通信) |
在 VM 网络路径中,tap device 是核心组件:
1
| Pod veth ←→ tap device ←→ QEMU virtio-net ←→ VM 内网卡 ←→ 容器/VM 进程
|
Kata Containers 核心原理
一句话:每个容器/Pod 跑在一个轻量级 VM 里,但对外表现得像普通容器。
架构层次
1 2 3 4 5 6 7 8 9 10 11
| kubelet │ (CRI) containerd / CRI-O │ (OCI shim) kata-shim (kata-agent) │ QEMU / Cloud Hypervisor / Firecracker ← 轻量级 Hypervisor │ Guest Kernel + kata-agent (inside VM) │ 容器进程 (runc inside VM)
|
关键组件
- 轻量级 Hypervisor:默认 QEMU,也支持 Cloud Hypervisor、Firecracker,启动极快(~100ms)
- kata-agent:跑在 VM 内部的 gRPC server,接收宿主机指令在 VM 内执行容器操作
- virtio 设备:
virtio-fs / virtio-9p:挂载容器 rootfs 进 VM
virtio-net + tap device:网络通信
vhost-vsock:宿主机 ↔ VM 内 kata-agent 通信
隔离原理
1 2
| 普通容器: 进程 → namespace/cgroup → 宿主内核 (共享内核!) Kata: 进程 → VM Guest内核 → Hypervisor → 宿主内核 (独立内核!)
|
每个 Pod 有自己独立的 Guest Kernel,安全隔离远强于普通容器。
三者对比
定位一览
|
Virtlet |
KubeVirt |
Kata Containers |
| 本质 |
在 Pod 里跑 VM |
VM 是一等公民 CRD |
容器外包一层 VM |
| 目标用户 |
想用 VM 镜像跑 Pod |
需要完整 VM 生命周期管理 |
要容器安全隔离 |
| 对 K8s 修改 |
需要 DaemonSet + CRI |
CRD + operator,无需改 CRI |
替换运行时,无需改 k8s |
| 状态 |
已废弃 |
活跃,CNCF 项目 |
活跃,CNCF 项目 |
架构对比
Virtlet(已废弃)
1 2 3 4 5
| kubelet --CRI--> virtlet (DaemonSet) │ QEMU VM │ VM disk image (QCOW2)
|
直接实现 CRI,kubelet 以为在管容器,实际跑的是 VM。绕过 containerd,维护成本高,社区已放弃。
KubeVirt
1 2 3 4 5 6 7 8 9
| 用户 --> kubectl apply VirtualMachine (CRD) │ virt-controller (operator) │ virt-launcher Pod │ (Pod 内部) libvirt + QEMU │ 真正的 VM
|
- VM 是独立 CRD,不伪装成容器
- 完整 VM 语义:快照、热迁移、设备直通
- virt-launcher 本身是个 Pod,VM 跑在 Pod 里
Kata Containers
1 2 3 4 5 6 7 8 9
| kubelet --CRI--> containerd │ kata-shim (OCI) │ 轻量级 Hypervisor (QEMU/Firecracker) │ Guest Kernel + kata-agent │ 容器进程 (看起来还是容器!)
|
用户用的还是普通容器镜像,感知不到 VM,每个 Pod = 一个轻量 VM。
功能对比
|
Virtlet |
KubeVirt |
Kata |
| 快照 |
无 |
有 |
无 |
| 热迁移 |
无 |
有 |
无 |
| 串口/VNC console |
简单 |
完整 |
无 |
| VM 磁盘镜像 |
QCOW2 |
QCOW2/PVC |
不暴露 |
| 镜像格式 |
VM 镜像 |
VM 镜像 |
普通 OCI 镜像 |
隔离模型
1 2 3
| 普通容器: [进程]──namespace──[宿主内核] 共享内核 Kata: [进程]──[Guest内核]──Hypervisor──[宿主内核] 独立内核,容器接口 KubeVirt: [VM OS]──[Guest内核]──libvirt──[宿主内核] 完整VM,VM接口
|
选型建议
1 2 3 4 5 6 7 8 9 10
| 你的工作负载是...
容器 + 需要强隔离(多租户/不信任代码/serverless)? └─→ Kata Containers
VM + 需要完整VM管理(快照/热迁移/GPU直通/老系统)? └─→ KubeVirt
Virtlet? └─→ 不要用,已停止维护
|