关于虚拟机:后Kubernetes时代的虚拟机管理技术之kubevirt篇

89次阅读

共计 3241 个字符,预计需要花费 9 分钟才能阅读完成。

kubevirt 是 Red Hat 开源的以容器形式运行虚拟机的我的项目,是基于 kubernetes 运行,利用 k8s CRD 为减少资源类型 VirtualMachineInstance(VMI),应用 CRD 的形式是因为 kubevirt 对虚拟机的治理不局限于 pod 治理接口。通过 CRD 机制,kubevirt 能够自定义额定的操作,来调整惯例容器中不可用的行为。kubevirt 能够应用容器的 image registry 去创立虚拟机并提供 VM 生命周期治理。
Kubevirt 的架构

kubevirt 以 CRD 的模式将 VM 治理接口接入到 kubernetes 中,通过一个 pod 去应用 libvirtd 治理 VM 的形式,实现 pod 与 VM 的一一对应,做到如同容器个别去治理虚拟机,并且做到与容器一样的资源管理、调度布局、这一层整体与企业 IAAS 关系不大,也不便企业的接入,对立纳管。

virt-api:kubevirt 是以 CRD 模式去治理 VM Pod,virt-api 就是所有虚拟化操作的入口,这外面包含惯例的 CDR 更新验证、以及 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。
virtctl:virtctl 是 kubevirt 自带相似 kubectl 的命令行工具,它是越过 virt-launcher pod 这一层去间接治理 VM 虚拟机,能够管制 VM 的 start、stop、restart。
Kubevirt 如何治理虚拟机?
虚拟机镜像制作与治理

虚拟机镜像采纳容器镜像模式寄存在镜像仓库中。创立原理如上图所示,将 Linux 发行版本的镜像文件寄存到根底镜像的 /disk 目录内,镜像格局反对 qcow2、raw、img。通过 Dockerfile 文件将虚拟机镜像制作成容器镜像,而后别离推送到不同的 registry 镜像仓库中。客户在创立虚拟机时,依据配置的优先级策略拉取 registry 中的虚拟机容器镜像,如果其中一台 registry 故障,会另一台衰弱的 registry 拉取镜像。

虚拟机生命周期治理

KubeVirt 虚拟机生命周期治理次要分为以下几种状态:

虚拟机创立:创立 VM 对象,并同步创立 DataVolume/PVC,从 Harbor 镜像仓库中拉取零碎模板镜像拷贝至指标调度主机,通过调度、IP 调配后生成 VMI 以及治理 VM 的 Launcher Pod 从而启动供业务应用的 VM。
虚拟机运行:运行状态下的 VM 能够进行控制台治理、快照备份 / 复原、热迁徙、磁盘热挂载 / 热删除等操作,此外还能够进行重启、下电操作,进步 VM 平安的同时解决业务存储空间需要和主机异样 Hung 等问题。
虚构机关机:关机状态下的 VM 能够进行快照备份 / 复原、冷迁徙、CPU/MEM 规格变更、重命名以及磁盘挂载等操作,同时可通过重新启动进入运行状态,也可删除进行资源回收。
虚拟机删除:对虚机资源进行回收,但 VM 所属的磁盘数据仍将保留、具备复原条件。
虚拟机创立流程

虚拟机创立分为创立 DataVolume 和 VMI 两个流程:
1. 创立 DataVolume 后,CDI 组件创立对应的 PVC 并且关联到适合的 PV,而后通过长期 Importer Pod 拉取虚拟机容器镜像绑定到 DataVolume 生成的 PV 中,并且将镜像转换成 disk.img 文件存储在 PV 中供虚拟机应用。
2. 创立 VMI 后,期待 disk.img 转换胜利,而后在对应的 Node 上启动 Launcher Pod,并将 CDI 流程生成的 PV 挂载到 Pod 内,当做虚拟机启动的系统盘。Launcher 依据 VMI 的定义生成定义虚拟机的 XML 文件,而后调用 libvirt 过程调用 Qemu 命令创立并且启动虚拟机。VMI 会对 Launcher Pod 状态进行同步,反馈 VM 运行的状态。
Kubevirt 如何实现容器与虚拟机交互 TBD
容器和虚拟机互通
Virtual-Kubelet 对应的 Node 会上报节点上 Pod 的 Endpoint,假设 Kubernetes 集群和 IaaS 层平台部署在同一个二层网络下,则集群内容器 Pod 能够拜访 VM-Pod,但容器 Pod 对于 VM-Pod 不可见;
针对上一点能够通过 Macvlan 等网络插件,将容器 -Pod,降维至二层网络上,实现容器 -Pod 和虚拟机互通,有肯定硬件要求。
如何实现⼀套集群下虚拟机与容器的混合调度与资源隔离
Virtual-Kubelet 提供的是一个虚构节点用来向 Kubernetes 上报 Node 对象和 Pod 的状态和资源状况,虚拟机资源和集群内节点资源齐全隔离;
在引入 Virtual-Kubelet 的状况下,须要对 Virtual-Kubelet 节点配置 Taint 和 Tolerations,保障容器 -Pod 和 VM-Pod 调度拆散。
服务发现
Virtual-Kubelet,通过 Provider 实现的 API 将 IaaS 层 VM 信息形象成对应 Pod 对象的信息的形式来上报 Endpoints,能够通过给 CR 增加 no selector Service,待 VM-Pod 拉起后补充 address 至对应的 Service
Kubevirt 实用场景
因为 Kubervirt 提供的成熟的虚拟化能力和性能,并且能够间接通过 Kubernetes 进行对立治理。所以 Kubevirt 适宜在有 PaaS 层治理平台和 Kubernetes 集群环境的状况下,通过 kubevirt 中的繁多管制立体简化了对虚拟机的治理,让用户无需关怀 IaaS 层,即可轻松在集群内构建、部署出一台虚拟机进行应用。
如何搭建 Kubevirt
Kubevirt 装置
1. 前置条件
查看硬件是否反对虚拟化

如果虚拟化不可用,则须要手动开启软件仿真

2. 装置 Kubevirt 组件
间接操作以下命令进行装置

3. 查看实例是否失常运行

4. 启动相干个性
批改 kubevirt-config configmap 内的数据

5. 装置 virtctl
装置 kubevirt 命令行工具

6. 装置 CDI
CDI(containerized-data-importer) 是 kubernetes 的长久存储管理插件,帮忙 kubevirt 构建磁盘镜像,能够将不同起源的数据源(url、container image、upload….)来填充 pvc 的能力。
获取最新版,进行装置

装置结束后,会在 cdi namespace 下,启动 cdi 相干组件

至此,kubevirt 装置结束

创立虚拟机
1. 筹备一个虚拟机镜像

通过 dockerfile 构建出一个虚拟机镜像


2. 创立一台 VM
编辑好 yaml 文件,通过 kubectl 命令拉起一台 vm

正文完
 0