KubeVirt 介绍:容器原生虚拟化

发布时间: 更新时间: 总字数:2348 阅读时间:5m 作者: IP上海 分享 网址

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) 两部分。

  1. 控制平面:负责处理 API 请求、调度、全局状态维护。
  2. 计算节点:负责真正运行虚拟机负载,配置网络和存储。

核心组件拆分介绍

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,内部封装了 libvirtdQEMU 进程。
    • 生命周期绑定:虚拟机的生命周期与这个 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

为了更直观地理解这些组件如何协作,以下是创建一个虚拟机的简要流程:

  1. 用户 使用 kubectl apply 提交一个 VirtualMachineInstance (VMI) 的 YAML 文件。
  2. K8s API Server 收到请求,通过 Webhook 转发给 virt-api 进行校验。
  3. 校验通过后,VMI 对象被存入 ETCD。
  4. virt-controller 监听到新的 VMI 对象,根据 VMI 的配置(CPU、内存、镜像),创建一个对应的 virt-launcher Pod
  5. Kubernetes Scheduler 将这个 Pod 调度到某个合适的节点(Node A)。
  6. Node A 上的 kubelet 启动 virt-launcher Pod。
  7. Node A 上的 virt-handler 发现本机有一个属于 VMI 的 Pod 启动了,于是它从 API Server 获取 VMI 的详细配置。
  8. virt-handlervirt-launcher 通信,生成对应的 Libvirt XML 配置文件,并指令 libvirt 启动 QEMU 进程。
  9. 虚拟机启动成功,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

参考

  1. https://kubevirt.io/
  2. https://kubevirt.io/quickstart_minikube/
  3. https://www.redhat.com/zh-cn/topics/virtualization/what-is-kubevirt
  4. https://kubevirt.io/user-guide/architecture/
  5. https://github.com/kubevirt/containerized-data-importer
  6. https://kubevirt.io/labs/kubernetes/lab2
本文总阅读量 次 本站总访问量 次 本站总访客数
Home Archives Categories Tags Statistics