kubevirt API服务,kubevirt是以CRD的方式工作的,virt-api提供了自定义的api请求处理,可以通过virtctl命令执行同步命令 virtctl vnc/pause/unpause/stop/start vm等。
与k8s api-server通讯监控VMI资源创建删除等事件,并触发相应操作
根据VMI定义创建virt-launcher pod,该pod中将会运行虚拟机
监控pod状态,并随之更新VMI状态
运行在kubelet的node上,定期更新heartbeat,并标记”kubevirt.io/schedulable”
监听在k8s apiserver当发现VMI被标记的nodeName与自身node匹配时,负责虚拟机的生命周期管理
以pod形式运行
根据VMI定义生成虚拟机模板,通过libvirt API创建虚拟机
每个虚拟机会对应独立的libvirtd
与libvirt通讯提供虚拟机生命周期管理
将数据面kvm及libvirtd等进程移出管理面的virt-laucher容器,物理机上的libvirtd进程管理此物理机上的所有虚拟机。
新增virt-start-hook组件用以对接网络组件、存储组件及xml的路径变动等。
重构虚拟机镜像制作和分发方式,借助于OCS的对象存储管理,实现镜像的快速分发。
用户创建vmi crd,kubectl create -f vmi.yaml
virt-controller watch到新的vmi对象,为vmi创建对应的virt-launcher pod
virt-launcher pod创建好后,k8s的调度器kube-scheduler会将其调度到符合条件的kubevirt node节点上
然后virt-controller会将virt-launcher pod的nodeName更新到vmi对象上
kubevirt node节点watch到vmi调度到本节点后,会将虚拟机的基础镜像mount到指定位置,然后调用virt-launcher的syncVMI接口创建domain
virt-launcher接受到创建请求后,将vmi对象转变为domain对象,然后调用virt-start-hook,根据backingFile创建qcow2虚拟机增量镜像磁盘,将domain xml中的相关路径转变为物理机上路径,请求网络,配置xml,然后将最终配置好的xml返回virt-launcher
virt-launcher收到virt-start-hook的返回后,调用物理机上的libvirtd来define domain xml和create domain
用户执行删除vmi命令,kubectl delete -f vmi.yaml
virt-handler watch到vmi的update事件,并且vmi的deletionTimeStamp不为空,调用virt-launcher shutdownDomain,virt-launcher调用virt-start-hook释放网络然后调用libvirtd关机
domain shutdown的消息由virt-launcher watch到并发送给virt-handler,virt-handler根据vmi和domain已停机的状态调用virt-launcher deleteDomain,virt-launcher调用virt-start-hook删除网络然后调用libvirtd undefineDomain
domain undefine的消息由virt-launcher watch到并发送给virt-handler,virt-handler根据vmi和domain已删除的状态更新vmi添加domain已删除的condition,然后清理该domain的垃圾文件及路径
virt-controller watch到vmi状态deleteTimeStamp不为空,并且vmi的condition DomainDeleted为True,则删除virt-launcher pod,然后等pod删除后,清理vmi的finalizer,使vmi自动删除
作者简介
Weiwei OPPO高级后端工程师
主要从事调度、容器化、混合云等相关方向的工作。