Virtlet、Kata Containers 与 KubeVirt 核心原理对比

在 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?
└─→ 不要用,已停止维护