Kubernetes 管理虚拟机之 KubeVirt

  1. 目录

    Kubevirt 架构设计

    虚拟机生命周期管理

     准备工作

    部署最新版本的 Kubevirt

    部署 CDI

Kubernetes 管理虚拟机之 KubeVirt_第1张图片

 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 架构设计Kubernetes 管理虚拟机之 KubeVirt_第2张图片

 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。

虚拟机生命周期

Kubernetes 管理虚拟机之 KubeVirt_第3张图片

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

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

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

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

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

准备工作

在安装 Kubevirt 之前,需要做一些准备工作。先准备一台k8s集群,然后在k8s集群里面安装 libvrt 和 qemu 软件包:

# 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

Kubernetes 管理虚拟机之 KubeVirt_第4张图片

如果不支持,则先生成让 Kubevirt 使用软件虚拟化的配置:

kubectl create namespace kubevirt



kubectl create configmap -n kubevirt kubevirt-config \

    --from-literal debug.useEmulation=true

 

部署最新版的KubeVirt

export VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- '-rc' | head -1 | awk -F': ' '{print $2}' | sed 's/,//' | xargs)

kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-operator.yaml

kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${VERSION}/kubevirt-cr.yaml

export VERSION=v0.51.0   (选择版本)

echo $VERSION    (查看版本)

 我这里用的v0.46.1版本,版本是可以选择的

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

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

然后创建

Kubernetes 管理虚拟机之 KubeVirt_第5张图片

查看命名空间kubevirt

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

Kubernetes 管理虚拟机之 KubeVirt_第6张图片

然后 podsvc 状态如下

Kubectl get svc -n kubevirt

部署 CDI

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

export VERSION=$(curl -s https://github.com/kubevirt/containerized-data-importer/releases/latest | grep -o "v[0-9]\.[0-9]*\.[0-9]*")

kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-operator.yaml

kubectl create -f https://github.com/kubevirt/containerized-data-importer/releases/download/$VERSION/cdi-cr.yaml

安装完毕后,会在cdi namespace下,启动cdi相关组件

kubectl get po -n cdi

Kubernetes 管理虚拟机之 KubeVirt_第7张图片

至此,kubevirt安装完毕

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

export VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases | grep tag_name | grep -v -- '-rc' | head -1 | awk -F': ' '{print $2}' | sed 's/,//' | xargs)

curl -L -o /usr/local/bin/virtctl https://github.com/kubevirt/kubevirt/releases/download/$VERSION/virtctl-$VERSION-linux-amd64

 chmod +x /usr/local/bin/virtctl

Kubernetes 管理虚拟机之 KubeVirt_第8张图片

Virtctl命令能用

Kubernetes 管理虚拟机之 KubeVirt_第9张图片

使用KubeVirt创建虚拟机

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

创建vm.yaml

 

 查看

kubectl get vm

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

Kubernetes 管理虚拟机之 KubeVirt_第10张图片

启动虚拟机

virtctl start testvm

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

根据vmi资源创建相应的pod

你可能感兴趣的:(kubernetes,docker,容器,云原生)