网站的规划与建设案例分析,北京南站,南京专业制作网站,天元建设集团有限公司汇票信誉摘要 本文主要介绍针对云原生kubernetes虚拟化IO的应用场景#xff0c;在Kubevirt中引入SPDK-vhost的支持#xff0c;来加速虚机中IO存储性能。同时基于Intel开源的Workload Service Framework[1]平台集成部署一套端到端虚拟化IO的应用场景做基本的性能对比测试。 云原生Kube… 摘要 本文主要介绍针对云原生kubernetes虚拟化IO的应用场景在Kubevirt中引入SPDK-vhost的支持来加速虚机中IO存储性能。同时基于Intel开源的Workload Service Framework[1]平台集成部署一套端到端虚拟化IO的应用场景做基本的性能对比测试。 云原生Kubevirt虚拟化 在云原生时代越来越多的业务开始逐步迁移到容器上来容器也成为了一种不可或缺的资源发布和管理形式同时由于场景的需求有部分业务形态更适合运行在虚拟机如何同时管控虚拟机和容器逐渐成为了云原生时代的主流需求Kubevirt给出了完美的解决方案。VM在Kubernetes环境中的管理和部署工具Kubevirt是 Red Hat 开源的是基于Kubernetes运行具体的来说是基于Kubernetes的CRD自定义资源增加虚拟机的运行和管理相关的资源特别是VMVMI资源类型。用户可以在K8S环境中通过CRD进行增加关于虚拟机的资源类型再通过部署VM.yaml的形式来创建虚拟机等一系列的操作。 图1云原生Kubevirt架构介绍 如图1所示绿色模块是Kubevirt的原生插件和功能模块在master上部署virt-controller和virt-apivirt-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的VM EXIT和VM ENTRY事件同时产生大量中断这会带来不少系统资源的消耗和IO latency 的增大。 图2Kubevirt VM在Ceph存储上的使用 集成SPDK-vhost到Kubevirt 众所周知业界为了优化virtIO的虚拟化IO性能而引入vhost的模型以便减少频繁的用户空间和内核空间的切换和数据的拷贝。而在我们云原生虚拟化场景中引入了SPDK-vhost在空户空间的一种虚拟化IO优化的方案基于KubeVirt中引入SPDK-vhost的deamonset模块来加速VM中block IO的访问对于SPDK-vhost的具体细节可以参考SPDK官网介绍[2]。如下图3所示我们针对Kubevirt中virt-launcher模块进行优化加入spdk-vhost-user的接口功能提供对SPDK-vhost的接口检测和通讯以便在VMI实例中使用SPDK-vhost的接口给VM提供加速的block功能。同时当在K8S集群中部署Kubevirt的时候我们同时会在集群中部署SPDK-vhost daemonset在每个节点都会部署一个SPDK-vhost功能POD。而SPDK-vhost POD中的接口会相应的检测和并通过librbd链接到后端的Rook-Ceph创建对应的SPDK rbd bdev 设备再以此bdev设备创建vhost-block controller。基于此当virt-launcher发起创建虚机的过程中vhost-user接口模块会解析VM yaml文件中定义的块设备信息并链接到SPDK-vhost POD 向该模块申请特定size的 block设备而SPDK-vhost守护进程则会向Rook-Ceph申请对应的卷空间一旦成功则会在VM中成功看到虚拟磁盘而此虚拟磁盘则是基于Ceph块设备通过SPDK-vhost加速之后提供的。 图3引入SPDK-vhost的Kubevirt架构 下面介绍一下KubeVirt虚机的部署过程中SPDK-vhost功能的接口。如下图4所示SPDK-vhost模块支持对Rook-Ceph的存储功能管理和链接能够按需申请Ceph RBD存储卷并在SPDK内部对应的创建rbd-bdev逻辑设备再将bdev设备挂接到创建的vhost block controller上而虚机中vdisk是通过共享内存的方式和SPDK-vhost做数据传输。在控制面virt-launcher中的libvirt是通过链接SPDK-vhost所提供vhost socket来实现通讯。 图4基于SPDK-vhost的Kubevirt VM的接口机制 对于新的方案的部署和实施流程如下图5所示以Rook-Ceph为后端存储为例用户需要在Kubernetes集群环境中预先部署Rook-Ceph和优化过的Kubevirt版本。同时确保SPDK-vhost daemonset正常部署到集群中(当前示例是将SPDK-vhost deamonset单独作为一个模块部署没有和kubevirt的部署集成到一起)。SPDK-vhost POD中有接口会检测Root-Ceph的环境健康状态并建立链接。随后用户基于编写好的VM yaml文件部署虚机通过virt-api的将创建VM的信息和资源申请传递给virt-controller那么virt-controller则会创建virt-launcher POD以便在内部创建VM实例。如下图所示virt-launcher会往本地node上SPDK-vhost POD发送创建volume的请求SPDK-vhost POD则会通知Rook-Ceph创建相应的RBD image成功之后会在SPDK-vhost POD中创建一个SPDK-vhost controller同时返回结果给到virt-launcher至此基于SPDK-vhost的block设备创建成功那么virt-launcher则会正式通知libvirt创建虚机并挂载相应的virtual block设备。 图5基于SPDK-vhost的Kubevirt VM的部署流程 如下图6所示用户在创建虚机之前需要在VM yaml文件中申明基于“spdkVhostBlkDisk”类型的块设备并申请相应的卷容量。 图6申请SPDK-vhost类型的块设备 性能的对比 我们基于Intel开源的WSF (Workload Service Framework见下一节)框架搭建一套端到端的全栈式workload来对使用SPDK-vhost的虚拟化IO方案和使用Kubevirt内置virtIO方案做性能对比测试。这里采用的是一套三节点集群的存储超融合环境部署2副本的Rook-Ceph在该集群中同时在该集群中均匀的部署3个虚机每个虚机挂载3个虚拟卷。该workload [3]的具体实现可以参考WSF git仓库中的代码和相应的手册。下面是对于使用Kubevirt内置的virtIO方案和加入SPDK-vhost的方案的性能对比。 图74K 的随机写的吞吐性能和时延对比 图84k 的随机读的吞吐性能和时延对比 如图7和图8所示对测试数据做归一化处理以virtio方案为基准可以看到vhost方案对于4K的读写场景均有一定程度的性能提升并且在某些场景中时延也能得到比较大的改善。 图91M Read Write 带宽性能对比测试 而对比较大的IO如图9所示可以看到vhost方案相比原有的virtIO方案在1M的读写场景中也有性能提升1M顺序读能提升11.52%而对比1M的顺序写可以得到18.64%的性能提升。 WSF 的介绍 WSF 全称Workload Service Framework [1], 是一套Intel开源的面向云原生端到端的全栈式workload的集成开发基准测试和调优的平台。该平台支持在不同环境中自动化的系统性的运行并测试workload的性能目前可以支持在On-Prem和云服务厂商CSP上的实例上部署和性能测试同时也支持多个硬件平台(比如Intel, AMD, ARM等) 的性能对比分析。 WSF 目前支持云原生应用场景中的几个主要的部署类型如下图所示其中包括纯Docker部署Kubernetes的部署和基于Terraform的部署方式。其中Terraform的部署方式能有效的帮助我们将软件栈和workload部署到On-Prem和CSP 的云实例上。WSF中集成的workload是依据业界内常用的客户应用场景来实现并对应的定义workload性能KPI测试标准这不仅能够帮助芯片制造商来分析芯片在各种应用场景下的运行行为和性能状况也能帮助行业客户在特定平台上部署和调优软件栈和工作负载。 图10WSF 支持的几种部署后端 WSF 最新的Release WSF仓库中包含一系列的完整独立可单独执行的workload 囊括AI网络存储安全等行业类型的软件栈和使用场景。Intel计划会在每个季度做一次workload的发布和更新最新的一次是23.2的版本[6], 主要更新如下内容 新增Edge-Ceph-VirtIO workload,该workload是针对edge native的应用平台搭建端到端的虚拟化IO方案以rook-ceph作为超融合块存储后端基于KubeVirt引入spdk-vhost加速虚机IO性能新增CM-xAPP-OpenVINO workload该Workload是基于O-RAN网络架构开发的智能连接管理CMxApp使用OpenVINO框架来优化5G用户关联和负载均衡以提高用户设备UE的服务质量QoS要求。新增OpenSSL3 workload该workload中引入Intel® QuickAssist Technology (Intel® QAT)技术的硬件加速OpenSSL软件栈。 更新NGNIX workload: 升级OpenSSL的版本到OpenSSL3同时加入Intel® QuickAssist Technology (Intel® QAT) 技术的硬件加速来提升端到端的RPS整体性能。 参考和引用 [1] WSF Repo: https://github.com/intel/workload-services-framework[2] SPDK Vhost的介绍https://spdk.io/doc/vhost.html[3] Edge-Ceph-Virtio Workload: 代码链接[4] Kubevirt官网https://kubevirt.io[5] Kubevirt repohttps://github.com/kubevirt/kubevirt[6] WSF V23.02版本https://github.com/intel/workload-services-framework/tree/23.2 点击“阅读原文”链接访问WSF对本文中提到的Workload和SPDK vhost的支持。 作者张敏朱永波杨鼎WE Team等