kubevirt是Red Hat开源的以容器形式运行虚拟机的我的项目,是基于kubernetes运行,利用k8s CRD为减少资源类型VirtualMachineInstance(VMI),应用CRD的形式是因为kubevirt对虚拟机的治理不局限于pod治理接口。通过CRD机制,kubevirt能够自定义额定的操作,来调整惯例容器中不可用的行为。kubevirt能够应用容器的image registry去创立虚拟机并提供VM生命周期治理。
Kubevirt的架构

kubevirt以CRD的模式将VM治理接口接入到kubernetes中,通过一个pod去应用libvirtd治理VM的形式,实现pod与VM的一一对应,做到如同容器个别去治理虚拟机,并且做到与容器一样的资源管理、调度布局、这一层整体与企业IAAS关系不大,也不便企业的接入,对立纳管。

virt-api:kubevirt是以CRD模式去治理VM Pod,virt-api就是所有虚拟化操作的入口,这外面包含惯例的CDR更新验证、以及console、vm start、stop等操作。

virt-controller:virt-controller会依据vmi CRD,生成对应的virt-launcher Pod,并且保护CRD的状态。与kubernetes api-server通信监控VMI资源的创立删除等状态。virt-handler:virt-handler会以deamonset模式部署在每一个节点上,负责监控节点上的每个虚拟机实例状态变动,一旦检测到状态的变动,会进行响应并且确保相应的操作可能达到所需(现实)的状态。virt-handler还会放弃集群级别VMI Spec与相应libvirt域之间的同步;报告libvirt域状态和集群Spec的变动;调用以节点为核心的插件以满足VMI Spec定义的网络和存储要求。

virt-launcher:每个virt-launcher pod对应着一个VMI,kubelet只负责virt-launcher pod运行状态,不会去关怀VMI创立状况。virt-handler会依据CRD参数配置去告诉virt-launcher去应用本地的libvirtd实例来启动VMI,随着Pod的生命周期完结,virt-lanuncher也会去告诉VMI去执行终止操作;其次在每个virt-launcher pod中还对应着一个libvirtd,virt-launcher通过libvirtd去治理VM的生命周期,这样做到去中心化,不再是以前的虚拟机那套做法,一个libvirtd去治理多个VM。
virtctl:virtctl是kubevirt自带相似kubectl的命令行工具,它是越过virt-launcher pod这一层去间接治理VM虚拟机,能够管制VM的start、stop、restart。
Kubevirt如何治理虚拟机?
虚拟机镜像制作与治理

虚拟机镜像采纳容器镜像模式寄存在镜像仓库中。创立原理如上图所示,将Linux发行版本的镜像文件寄存到根底镜像的/disk目录内,镜像格局反对qcow2、raw、img。通过Dockerfile文件将虚拟机镜像制作成容器镜像,而后别离推送到不同的registry镜像仓库中。客户在创立虚拟机时,依据配置的优先级策略拉取registry中的虚拟机容器镜像,如果其中一台registry故障,会另一台衰弱的registry拉取镜像。

虚拟机生命周期治理

KubeVirt虚拟机生命周期治理次要分为以下几种状态:

虚拟机创立:创立VM对象,并同步创立DataVolume/PVC,从Harbor镜像仓库中拉取零碎模板镜像拷贝至指标调度主机,通过调度、IP调配后生成VMI以及治理VM的Launcher Pod从而启动供业务应用的VM。
虚拟机运行:运行状态下的VM 能够进行控制台治理、快照备份/复原、热迁徙、磁盘热挂载/热删除等操作,此外还能够进行重启、下电操作,进步VM平安的同时解决业务存储空间需要和主机异样Hung等问题。
虚构机关机:关机状态下的VM能够进行快照备份/复原、冷迁徙、CPU/MEM规格变更、重命名以及磁盘挂载等操作,同时可通过重新启动进入运行状态,也可删除进行资源回收。
虚拟机删除:对虚机资源进行回收,但VM所属的磁盘数据仍将保留、具备复原条件。
虚拟机创立流程

虚拟机创立分为创立DataVolume和VMI两个流程:
1.创立DataVolume后,CDI组件创立对应的PVC并且关联到适合的PV,而后通过长期Importer Pod拉取虚拟机容器镜像绑定到DataVolume生成的PV中,并且将镜像转换成disk.img文件存储在PV中供虚拟机应用。
2.创立VMI后,期待disk.img转换胜利,而后在对应的Node上启动Launcher Pod,并将CDI流程生成的PV挂载到Pod内,当做虚拟机启动的系统盘。Launcher依据VMI的定义生成定义虚拟机的XML文件,而后调用libvirt过程调用Qemu命令创立并且启动虚拟机。VMI会对Launcher Pod状态进行同步,反馈VM运行的状态。
Kubevirt如何实现容器与虚拟机交互TBD
容器和虚拟机互通
Virtual-Kubelet对应的Node会上报节点上Pod的Endpoint,假设Kubernetes集群和IaaS层平台部署在同一个二层网络下,则集群内容器Pod能够拜访VM-Pod,但容器Pod对于VM-Pod不可见;
针对上一点能够通过Macvlan等网络插件,将容器-Pod,降维至二层网络上,实现容器-Pod和虚拟机互通,有肯定硬件要求。
如何实现⼀套集群下虚拟机与容器的混合调度与资源隔离
Virtual-Kubelet提供的是一个虚构节点用来向Kubernetes上报Node对象和Pod的状态和资源状况,虚拟机资源和集群内节点资源齐全隔离;
在引入Virtual-Kubelet的状况下,须要对Virtual-Kubelet节点配置Taint和Tolerations,保障容器-Pod和VM-Pod调度拆散。
服务发现
Virtual-Kubelet,通过Provider实现的API将IaaS层VM信息形象成对应Pod对象的信息的形式来上报Endpoints,能够通过给CR增加no selector Service,待VM-Pod拉起后补充address至对应的Service
Kubevirt实用场景
因为Kubervirt提供的成熟的虚拟化能力和性能,并且能够间接通过Kubernetes进行对立治理。所以Kubevirt适宜在有PaaS层治理平台和Kubernetes集群环境的状况下,通过kubevirt中的繁多管制立体简化了对虚拟机的治理,让用户无需关怀IaaS层,即可轻松在集群内构建、部署出一台虚拟机进行应用。
如何搭建Kubevirt
Kubevirt装置
1.前置条件
查看硬件是否反对虚拟化

如果虚拟化不可用,则须要手动开启软件仿真

2.装置Kubevirt组件
间接操作以下命令进行装置

3.查看实例是否失常运行

4.启动相干个性
批改kubevirt-config configmap内的数据

5.装置virtctl
装置kubevirt命令行工具

6.装置CDI
CDI(containerized-data-importer) 是kubernetes的长久存储管理插件,帮忙kubevirt构建磁盘镜像,能够将不同起源的数据源(url、container image、upload....)来填充pvc的能力。
获取最新版,进行装置

装置结束后,会在cdi namespace下,启动cdi相干组件

至此,kubevirt装置结束

创立虚拟机
1.筹备一个虚拟机镜像

通过dockerfile构建出一个虚拟机镜像


2.创立一台VM
编辑好yaml文件,通过kubectl命令拉起一台vm