Kubernetes 管理虚拟机之 KubeVirt

网友投稿 343 2022-09-08

Kubernetes 管理虚拟机之 KubeVirt

Kubevirt 是Redhat开源的以容器方式运行虚拟机的项目,以k8s add-on方式,利用k8s CRD为增加资源类型VirtualMachineInstance(VMI), 使用容器的image registry去创建虚拟机并提供VM生命周期管理。 CRD的方式是的kubevirt对虚拟机的管理不局限于pod管理接口,但是也无法使用pod的RS DS Deployment等管理能力,也意味着 kubevirt如果想要利用pod管理能力,要自主去实现,目前kubevirt实现了类似RS的功能。 kubevirt目前支持的runtime是docker和runv。​

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虚拟机生命周期管理主要分为以下几种状态:​

l 虚拟机创建:创建VM对象,并同步创建DataVolume/PVC,从Harbor镜像仓库中拉取系统模板镜像拷贝至目标调度主机,通过调度、IP分配后生成VMI以及管理VM的Launcher Pod从而启动供业务使用的VM。​

l 虚拟机运行:运行状态下的VM 可以进行控制台管理、快照备份/恢复、热迁移、磁盘热挂载/热删除等操作,此外还可以进行重启、下电操作,提高VM安全的同时解决业务存储空间需求和主机异常Hung等问题。​

l 虚拟机关机:关机状态下的VM可以进行快照备份/恢复、冷迁移、CPU/MEM规格变更、重命名以及磁盘挂载等操作,同时可通过重新启动进入运行状态,也可删除进行资源回收。​

l 虚拟机删除:对虚机资源进行回收,但VM所属的磁盘数据仍将保留、具备恢复条件。​

准备工作​

在安装​

# Ubuntu​

$ apt install -y qemu-kvm libvirt-bin bridge-utils virt-manager​

# CentOS​

$ yum install -y qemu-kvm libvirt virt-install bridge-utils​

查看节点是否支持 kvm 硬件辅助虚拟化​

virt-host-validate qemu​

如果不支持,则先生成让​

kubectl create namespace kubevirt​

kubectl create configmap -n kubevirt kubevirt-config \​

--from-literal debug.useEmulatinotallow=true​

安装​

部署最新版本的​

export VERSION=$(curl -s | grep tag_name | grep -v -- '-rc' | head -1 | awk -F': ' '{print $2}' | sed 's/,//' | xargs)​

kubectl apply -f apply -f VERSION=v0.51.0 (选择版本)​

echo $VERSION (查看版本)​

创建一个名为kubevirt文件这样方便知道你得yaml文件放在这lim​

然后把kubevirt-cr.yaml 和kubevirt-operator.yaml 传到master节点​

然后创建​

查看命名空间kubevirt​

kubectl get po -n kubevirt (我等了有五六分钟才启动完成)​

然后 pod、svc 状态如下​

Kubectl get svc -n kubevirt​

部署​

Containerized Data Importer(CDI)项目提供了用于使 PVC 作为 KubeVirt VM 磁盘的功能。建议同时部署 CDI:​

export VERSION=$(curl -s | grep -o "v[0-9]\.[0-9]*\.[0-9]*")​

kubectl create -f create -f namespace下,启动cdi相关组件​

kubectl get po -n cdi​

至此,kubevirt安装完毕​

Kubevirt 提供了一个命令行工具 virtctl,可以直接下载:(快慢根据自己得网速)​

export VERSION=$(curl -s | grep tag_name | grep -v -- '-rc' | head -1 | awk -F': ' '{print $2}' | sed 's/,//' | xargs)​

curl -L -o /usr/local/bin/virtctl +x /usr/local/bin/virtctl​

Virtctl命令能用​

使用KubeVirt创建虚拟机​

把vm.yaml传到master节点下得kubevirt​

创建vm.yaml​

查看​

kubectl get vm​

说名这就已经创建好虚拟机了可以在k8s的dasboard上看到​

启动虚拟机​

virtctl start testvm​

当我们启动虚拟机的时候它会创建vmi资源​

根据vmi资源创建相应的pod​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:​云原生微服务K8s容器编排第七章之ETCD的使用及备份
下一篇:公关界的007:在环保这件事上,饿了么可不是说说的!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~