KubeVirt Kubernetes 虚拟化 API 和运行时,用于定义和管理虚拟机。KubeVirt 于 2019 年 9 月 6 日被 CNCF 接受,并于 2022 年 4 月 19 日转入孵化成熟度级别。
介绍
KubeVirt 是一个开源项目,它允许用户在 Kubernetes 作为底层编排平台的基础上,运行、部署和管理虚拟机(VM)。
其核心理念是实现容器原生虚拟化,这意味着虚拟机被打包在容器中,并与容器化微服务和云原生应用在同一个平台上运行和管理。
KubeVirt 是由 云原生计算基金会(CNCF) 赞助的孵化项目,也是红帽 ® OpenShift® 虚拟化的开源基础。
KubeVirt 如何运作?
KubeVirt 通过扩展 Kubernetes API 来工作,使 Kubernetes 能够将虚拟机(VMs)视为一种新的资源类型。
- 统一管理: 容器和虚拟机可以共享同一个集群、节点和网络,从而可以在一个控制台下管理这两种工作负载。
- Kubernetes 集成: 虚拟机可以通过与其他 Kubernetes 资源(如 Pod、Service 等)相同的方式进行交互、部署和管理。
- 充分利用 Kubernetes 功能: 虚拟机可以受益于 Kubernetes 的原生高级功能,例如网络策略、存储管理、自动伸缩和一致的安全策略。
主要特点和优势
- 整合传统与云原生: 允许组织在不放弃 Kubernetes 优势的情况下,继续运行和管理传统的虚拟机工作负载。
- 实时迁移: 支持虚拟机的实时迁移,即在不中断虚拟机访问的情况下,将其从一台主机移动到另一台主机。这对于需要确保持续正常运行的关键虚拟机非常重要。
- 更高的效率和可移植性: 结合了容器的敏捷性和虚拟机的隔离性。
- 一致的安全防护: 充分利用 Kubernetes 原生安全防护的优势,确保在包括虚拟机在内的所有环境中一致地应用策略。
KubeVirt 架构总览
KubeVirt 的架构主要分为 控制平面 (Control Plane) 和 计算节点 (Compute Node) 两部分。
- 控制平面:负责处理 API 请求、调度、全局状态维护。
- 计算节点:负责真正运行虚拟机负载,配置网络和存储。
核心组件拆分介绍
KubeVirt 的核心组件主要包含以下几个服务(Pod):
| 组件名称 |
部署形态 |
作用域 |
核心职责 |
类比 |
| virt-operator |
Deployment |
全局 |
安装、升级、管理 KubeVirt 自身 |
装修队长 |
| virt-api |
Deployment |
全局 |
统一入口,校验请求,处理 VNC/Console |
前台接待 |
| virt-controller |
Deployment |
全局 |
业务逻辑核心,创建 Pod,管理生命周期 |
项目经理 |
| virt-handler |
DaemonSet |
单节点 |
节点干活的,配置网络存储,指挥 Launcher |
现场工长 |
| virt-launcher |
Pod (Ephemeral) |
单实例 |
承载 VM 进程 (QEMU/Libvirt) 的容器 |
具体的房间 |
virt-api (API 网关与校验)
这是 KubeVirt 的入口组件,通常以 Deployment 形式运行在控制平面。
- 职责:
- 作为 Kubernetes API 的扩展:它提供了一组自定义的 API 端点。
- 准入控制 (Admission Controller):当用户创建 VM 或 VMI (VirtualMachineInstance) 资源时,
virt-api 会通过 Webhook 机制对请求进行校验(Validation)和变更(Mutation),确保配置合法。
- 子资源代理:它处理像
console (控制台), vnc (远程桌面), start, stop, restart 等特殊操作的请求。当用户使用 virtctl console 命令时,流量会经过 API Server 转发给 virt-api,再由 virt-api 代理到具体的节点。
virt-controller (集群控制器)
这是 KubeVirt 的大脑,负责全局的业务逻辑,通常以 Deployment 形式运行(支持高可用)。
- 职责:
- 监听与协调:它监听 Kubernetes API Server 中的
VirtualMachineInstance (VMI) 对象的变化。
- 生命周期管理:当一个新的 VMI 被创建时,
virt-controller 并不直接启动 VM,而是创建一个常规的 Kubernetes Pod(即 virt-launcher Pod)。
- 状态同步:它确保存储在 ETCD 中的 VM 状态与集群中的实际状态一致。
- 节点调度:它不直接调度 VM,而是通过创建 Pod,让 Kubernetes 原生的调度器(Scheduler)来决定 VM 运行在哪个节点上。
virt-handler (节点代理)
这是运行在集群中 每个节点 上的组件,以 DaemonSet 的形式部署。它的作用类似于 Kubernetes 的 kubelet,但是专门针对虚拟机的。
- 职责:
- 节点级监控:监听 API Server 中分配给该节点的 VMI 对象。
- 下发指令:当发现有一个 VMI 被调度到本节点时,它会与该节点上的
virt-launcher Pod 通信,向其下发具体的指令(如定义 Domain XML)。
- 网络与存储配置:它负责在宿主机层面配置网络桥接、挂载存储设备,确保 VM 能够访问资源。
- 状态上报:它会持续监控 VM 的实际运行状态,并更新到 API Server 的 VMI 对象状态中。
virt-launcher (VM 的容器外壳)
这不是一个常驻的系统服务,而是 每个虚拟机实例对应一个 virt-launcher Pod。
- 职责:
- 运行环境:它是一个 Pod,内部封装了
libvirtd 和 QEMU 进程。
- 生命周期绑定:虚拟机的生命周期与这个 Pod 绑定。如果 Pod 被杀掉,虚拟机也就停止了。
- 执行层:它接收来自
virt-handler 的指令,通过 libvirt API 真正启动、停止 QEMU 虚拟机进程。
- 无特权设计:通常情况下,
virt-launcher 不需要以 root 权限运行(取决于具体配置),增强了安全性。
virt-operator (部署与运维)
这是 KubeVirt 的安装和生命周期管理工具(Operator 模式)。
- 职责:
- 安装 KubeVirt:用户只需应用一个 YAML (
KubeVirt CR),virt-operator 就会自动部署上述的 virt-api, virt-controller, virt-handler 等组件。
- 升级与回滚:负责 KubeVirt 组件版本的平滑升级。
- 自愈:如果某个系统组件误删,Operator 会尝试重建它。
工作流程示例:创建一个 VM
为了更直观地理解这些组件如何协作,以下是创建一个虚拟机的简要流程:
- 用户 使用
kubectl apply 提交一个 VirtualMachineInstance (VMI) 的 YAML 文件。
- K8s API Server 收到请求,通过 Webhook 转发给 virt-api 进行校验。
- 校验通过后,VMI 对象被存入 ETCD。
- virt-controller 监听到新的 VMI 对象,根据 VMI 的配置(CPU、内存、镜像),创建一个对应的 virt-launcher Pod。
- Kubernetes Scheduler 将这个 Pod 调度到某个合适的节点(Node A)。
- Node A 上的 kubelet 启动
virt-launcher Pod。
- Node A 上的 virt-handler 发现本机有一个属于 VMI 的 Pod 启动了,于是它从 API Server 获取 VMI 的详细配置。
- virt-handler 与 virt-launcher 通信,生成对应的 Libvirt XML 配置文件,并指令 libvirt 启动 QEMU 进程。
- 虚拟机启动成功,virt-handler 将状态更新回 API Server,用户看到状态为
Running。
安装
组件
| 分类 |
组件 |
部署方式 |
功能说明 |
| 控制面 |
virt-api |
deployment |
自定义 API,开机、关机、重启等,作为 apiserver 的插件,业务通过 k8s apiserver 请求 virt-api。 |
| 控制面 |
virt-controller |
deployment |
管理和监控 VMI 对象的状态,控制 VMI 下的 pod。 |
| 计算节点 |
virt-handler |
daemonset |
类似 kubelet,管理宿主机上的所有虚拟机实例。 |
| 计算节点 |
virt-launcher |
virt-handler pod |
调用 libvirt 和 qemu 创建虚拟机进程。 |
自定义 CRD 对象
| 分类 |
CRD 对象 |
功能说明 |
| 虚机 |
VirtualMachineInstance(VMI) |
代表运行的虚拟机实例 |
| 虚机 |
VirtualMachine(VM) |
虚机对象,提供开机、关机、重启,管理 VMI 实例,与 VMI 的关系是 1:1 |