摘要
本文主要介绍针对云原生kubernetes虚拟化IO的应用场景,在Kubevirt中引入SPDK-vhost的支持,来加速虚机中IO存储性能。同时基于Intel开源的Workload Service Framework[1]平台集成部署一套端到端虚拟化IO的应用场景做基本的性能对比测试。
云原生Kubevirt虚拟化
在云原生时代,越来越多的业务开始逐步迁移到容器上来,容器也成为了一种不可或缺的资源发布和管理形式,同时由于场景的需求,有部分业务形态更适合运行在虚拟机,如何同时管控虚拟机和容器逐渐成为了云原生时代的主流需求,Kubevirt给出了完美的解决方案。VM在Kubernetes环境中的管理和部署工具Kubevirt是 Red Hat 开源的,是基于Kubernetes运行,具体的来说是基于Kubernetes的CRD(自定义资源)增加虚拟机的运行和管理相关的资源,特别是VM,VMI资源类型。用户可以在K8S环境中通过CRD进行增加关于虚拟机的资源类型,再通过部署VM.yaml的形式来创建虚拟机等一系列的操作。
图1:云原生Kubevirt架构介绍
如图1所示绿色模块是Kubevirt的原生插件和功能模块,在master上部署virt-controller和virt-api,virt-api是管理虚拟机资源及其运营管理的接口,而virt-controller则负责管理和监控VM实例对象及其关联的POD,其中virt-launcher POD就是virt-controller依据VM的配置文件来创建的。这里需要关注的是virt-launcher POD,每一个virt-launcher承载一个VM实例,其内部是通过libvirtd来管理虚拟机的生命周期。
引入SPDK-vhost加速Kubevirt虚拟化IO
在实际边缘计算和云计算应用场景中,不少客户使用云原生的Rook-Ceph来部署后端存储服务。以常用的block设备为例,用户在创建虚机之前,先通过PV/PVC向Rook-Ceph存储申请volume资源,在创建虚机的时候挂载到VM中,如下图2所示。这种Kubevirt虚机挂载使用Ceph block IO的本质是通过Ceph kernel rbd来提供block块设备,而Kubevirt的虚机则是使用传统的virtIO的前端和后端方案,实际的应用中,会带来频繁的用户空间和内核空间的切换,同时这种基于Qemu-KVM的半虚拟化的IO模型会伴随着大量KVM的V