KubeVirt — 架构

Posted _李少侠_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了KubeVirt — 架构相关的知识,希望对你有一定的参考价值。

文章目录

什么是KubeVirt

kubevirt是Red Hat开源的以容器方式运行虚拟机的项目,是基于kubernetes运行,利用k8s CRD为增加资源类型VirtualMachineInstance(VMI),使用CRD的方式是由于kubevirt对虚拟机的管理不局限于pod管理接口。通过CRD机制,kubevirt可以自定义额外的操作,来调整常规容器中不可用的行为。kubevirt可以使用容器的image registry去创建虚拟机并提供VM生命周期管理。

KubeVirt架构

virt-api

kubevirt是以CRD形式去管理VM Pod,virt-api就是所有虚拟化操作的入口,这里面包括常规的CDR更新验证、以及vnc、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。

libvirtd

每个VMI实例对应的Pod都会有一个libvirtd实例,virt-launcher借助于libvirtd来管理VMI实例的生命周期。

参考链接:
后Kubernetes时代的虚拟机管理技术之kubevirt篇
kubevirt.io

KubeVirt上的虚拟化GPU工作负载


在这段2019年北美KubeCon视频中,Red Hat的David Vossel和NVIDIA的Vishesh Tanksale探索了KubeVirt背后的架构,以及NVIDIA如何利用该架构为Kubernetes上的GPU工作负载提供动力。以NVIDIA的GPU工作负载为例进行研究,它们提供了一个重点视图,以了解主机设备透传是如何通过KubeVirt完成的,并提供了一些性能指标,将KubeVirt与独立KVM进行比较。

https://www.youtube.com/watch?v=Qejlyny0G58

https://v.qq.com/x/page/s3031occ4r7.html


KubeVirt介绍

David介绍了KubeVirt是什么和不是什么:

  • KubeVirt不参与管理AWS或GCP实例

  • KubeVirt不是Firecracker或Kata容器的竞争对手

  • KubeVirt不是一个容器运行时替换


他喜欢把KubeVirt定义为:

KubeVirt是Kubernetes的一个扩展,它允许与容器工作负载一起原生运行传统的VM工作负载。

但是为什么需要KubeVirt呢?

  • 已经有了像OpenStack、oVirt这样的本地解决方案

  • 然后是公共云,AWS、GCP、Azure

  • 为什么我们又要做VM管理的事情呢?


答案是,最初的动机是基础设施的融合:



迈向云模型的转型包括多个栈、容器和VM、旧代码和新代码。KubeVirt简化了这一切,只需要一个栈来管理容器和VM来运行旧代码和新代码。


KubeVirt上的虚拟化GPU工作负载


工作流的融合意味着:

  • 将VM管理合并到容器管理工作流中

  • 对容器和虚拟机使用相同的工具(kubectl)

  • 保持用于VM管理的声明性API(就像pod、deployment等…)


YAML中VM实例的一个例子可以像下面这样简单:

$ cat <<EOF | kubectl create -f -apiVersion: kubevirt.io/v1alpha1kind: VirtualMachineInstance... spec: domain: cpu:  cores: 2 devices: disk: fedora29


架构

事实是,KubeVirt VM是在pod中运行的KVM+qemu进程。就是这么简单。


KubeVirt上的虚拟化GPU工作负载


VM启动流程如下图所示。用户向集群发布VM清单,直到Kubelet启动VM pod。最后,virt-handler指示virt-launcher如何启动qemu。


KubeVirt上的虚拟化GPU工作负载


KubeVirt中的存储以与pod相同的方式使用,如果需要在VM中有持久存储,则需要创建PVC(持久卷声明)。


KubeVirt上的虚拟化GPU工作负载


例如,如果您的电脑中有一个VM,您可以使用容器数据导入器(containerized-data-importer,CDI)将该镜像上载到PVC,然后您可以将该PVC附加到VM pod以使其运行。


关于网络服务的使用,流量以与容器工作负载相同的方式路由到KubeVirt VM。Multus还可以为每个VM提供不同的网络接口。


For using the Host Resources:

  • VM Guest CPU and NUMA Affinity

    • CPU Manager (pinning)

    • Topology Manager (NUMA nodes)

  • VM Guest CPU/MEM requirements

    • POD resource request/limits

  • VM Guest use of Host Devices

    • Device Plugins for access to (/dev/kvm, SR-IOV, GPU passthrough)

    • POD resource request/limits for device allocation


在Kubevirt虚拟机的GPU/vGPU

在David的介绍之后,Vishesh接手并深入讨论了VM中GPU的原因和方法。许多新的机器和深度学习应用程序正在利用GPU处理工作负载。如今,大数据是GPU的主要消费者之一,但仍有一些差距,游戏和专业图形部门仍然需要运行VM和具有原生GPU功能,这就是为什么NVIDIA决定与KubeVirt合作。


KubeVirt上的虚拟化GPU工作负载


NVIDIA已经开发了KubeVirt GPU设备插件,它可以在GitHub上获得,它是开源的,任何人都可以查看并下载它。


使用设备插件框架是向GPU提供对Kubevirt虚拟机访问的自然选择,下图显示了涉及到GPU透传架构的不同层:


KubeVirt上的虚拟化GPU工作负载


Vishesh还说明YAML代码的一个例子,可以看到包含NVIDIA的节点状态卡信息(节点有5个GPU),包含deviceName的虚拟机规范指向NVIDIA卡和Pod状态,用户可以设置资源的限制和要求。


KubeVirt上的虚拟化GPU工作负载


The main Device Plugin Functions are:

  • GPU and vGPU device Discovery

    • GPUs with VFIO-PCI driver on the host are identified

    • vGPUs configured using Nvidia vGPU manager are identified

  • GPU and vGPU device Advertising

    • Discovered devices are advertised to kubelet as allocatable resources

  • GPU and vGPU device Allocation

    • Returns the PCI address of allocated GPU device

  • GPU and vGPU Health Check

    • Performs health check on the discovered GPU and vGPU devices


为了理解GPU是如何通过生命周期工作的,Vishesh用下图展示了不同阶段的过程:


KubeVirt上的虚拟化GPU工作负载


在下面的图表中,有一些NVIDIA使用KubeVirt的关键功能:


KubeVirt上的虚拟化GPU工作负载


如果您对生命周期如何工作的细节感兴趣,或者对NVIDIA为什么高度使用上面列出的KubeVirt特性感兴趣,您可能会对下面的视频感兴趣。


视频


PDF

https://static.sched.com/hosted_files/kccncna19/31/KubeCon%202019%20-%20Virtualized%20GPU%20Workloads%20on%20KubeVirt.pdf


演讲者

David Vossel是红帽公司的首席软件工程师。他目前正致力于OpenShift的容器原生虚拟化(Container Native Virtualization,CNV),并且是开源KubeVirt项目的核心贡献者。


Vishesh Tanksale目前是NVIDIA的高级软件工程师。他专注于在Kubernetes集群上启用VM工作负载管理的不同方面。他对VM上的GPU工作负载特别感兴趣。他是CNCF Sanbox项目Kubevirt的积极贡献者。


点击文末<<阅读原文>>进入网页了解更多。




KubeVirt上的虚拟化GPU工作负载:关于中国KubeCon + CloudNativeCon + 开源峰会


KubeVirt上的虚拟化GPU工作负载


扫描二维码联系我们,加入中国最终用户支持者计划!




CNCF (Cloud Native Computing Foundation)成立于2015年12月,隶属于Linux  Foundation,是非营利性组织。 

CNCF云原生计算基金会)致力于培育和维护一个厂商中立的开源生态系统,来推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。请长按以下二维码进行关注。

以上是关于KubeVirt — 架构的主要内容,如果未能解决你的问题,请参考以下文章

KubeVirt with YRCloudFile 擦出创新的火花

云原生虚拟化:基于 Kubevirt 构建边缘计算实例

使用 swagger-ui 可视化 Kubernetes API 文档

基于OVN的Kubernetes网络架构解析

Kubernetes 学习总结(32)—— Kubernetes 的架构原理简单总结

Kubernetes 学习总结(32)—— Kubernetes 的架构原理简单总结