根据Garnter的最新预测,到2022年将会有75%的生产应用全部跑在容器环境之上。基于这个预测,其实至少还有25%的架构由于技术原因或是认为原因都将仍然跑在旧的架构之上,这其中虚拟机又会占据其中的大部分份额。所以在容器技术尤其是Kubernetes诞生之初,就已经有开源的社区在为如何使用Kubernetes纳管虚拟机作为一个重要的功能在开发和贡献。
今天要介绍的主角就是Kube-virt,那么使用Kube-virt主要会帮我们解决以下两个问题:
🔹从技术层面,完全的虚拟机纳管,可以完美迁移因为内核版本过于陈旧以及语言问题而无法迁移到容器的部分应用
🔹从管理和运维层面,符合传统的运维工作方式,以前的SSH 等运维方式可以完美复用
架构
为什么kube-virt可以做到让虚拟机无缝的接入到K8S?
首先,先给大家介绍一下它的整体架构。
- virt-api
kubevirt是以CRD形式去管理vm pod, virt-api就是所有虚拟化操作的入口,包括常规的CRD更新验证以及vm start、stop - virt-controlller
virt-controller会根据vmi CRD,生成对应的virt-lancher pod,并维护CRD的状态 - virt-handler
Virt-handler会以Daemonset形式部署在每个节点上,负责监控节点上每个虚拟机实例状态变化,一旦检测到状态变化,会进行响应并确保相应操作能达到所需(理想)状态。
Virt-handler保持集群级VMI Spec与相应libvirt域之间的同步;报告Libvirt域状态和集群Spec的变化;调用以节点为中心的插件以满足VMI Spec定义的网络和存储要求。 - virt-launcher
每个virt-lanuncher pod对应着