kubevirt(二)实现原理

这篇具有很好参考价值的文章主要介绍了kubevirt(二)实现原理。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在《kubevirt(一)虚拟化技术》一文中,我们对libevirt+qemu+kvm虚拟化做了一些简单的说明,本文基于这些内容,来看看kubevirt是怎么结合kubernetes平台实现虚拟化的。

kubevirt项目地址:https://github.com/kubevirt/kubevirt,在介绍kubevirt之前,我们先对kubernetes的informerCRD两个概念再做一个简单的说明。

  • informer

informer简单来说是客户端通过list+watch机制,当关注的资源对象有变化时能得到ADD、UPDATE、DELETE三种事件,并且可以注册这三种事件的处理函数。这里说的资源对象可以是kubernetes原生支持的,例如namespace、deployment、node、pod等资源,也可以是用户自定义资源(CRD)。informer完整原理与实现可参考下图:

kubevirt(二)实现原理

  • CRD

CRD的全称是Custom Resource Definition,即用户自定义资源,它是kubernetes可扩展的重要基础,CRD通常和webhook、informer(controller)一起使用来实现用户自定义逻辑。CRD可以理解为一种抽象,例如kubevirt把虚拟机抽象成一个vmi对象,创建一个vmi对象,就会触发informer中的ADD事件处理函数去创建一台真正的虚拟机。

kubevirt

以下内容基于kubevirt@0.49.0

kubevirt是基于CRD、controller等kubernetes特性,与容器并行地表示和管理传统虚拟机,kubevirt核心CRD VMI(Virtual Machine Instance)对应的就是虚拟机实例。

架构

在kubevirt代码仓库的文档中,我们能看到如下信息,从该图示可以看出,kubevirt运行在kubernetes之上,且调度(scheduling)也是由kubernetes负责,底层则是在物理资源的基础上,利用虚拟化技术运行不同的操作系统(operating System)。

  +---------------------+
  | KubeVirt            |
~~+---------------------+~~
  | Orchestration (K8s) |
  +---------------------+
  | Scheduling (K8s)    |
  +---------------------+
  | Container Runtime   |
~~+---------------------+~~
  | Operating System    |
  +---------------------+
  | (Virtual)           |
~~+---------------------+~~
  | Physical            |
  +---------------------+
虚拟机与普通pod container

同一个kubernetes平台可以同时运行kubevirt虚拟机和普通pod container,它们有如下关系:

kubevirt(二)实现原理

VMI

一个VMI对象对应一台虚拟机,实际上这台虚拟机是在一个特殊的kubernetes pod中,该pod里有virt-launcher、libvirtd和qemu进程,其中libvirtd和qemu是上篇文章提到的用于虚拟化的组件,因此也就是可以看作kubevirt把虚拟机运行在了pod中

kubevirt(二)实现原理

kubevirt组件

kubevirt组件包括virt-controllervirt-apivirt-handlervirt-launcher等,整体关系如下:

kubevirt(二)实现原理

其中各个组件大致功能如下:

  • virt-controller

基于informer的list-watch机制,监听VM、VMI等资源的事件,转换成VMI对应的pod,从而达到管理虚拟机的生命周期的功能。

  • virt-api

virt-api以deployment的形式运行,逻辑上主要包含以下功能:

1、提供VM、VMI等CRD资源mutating+validating webhook接口;

2、通过kubernetes的aggregator特性,对外暴露虚拟机操作的相关接口,包括restart、migrate、start、stop、freeze/unfreeze、softReboot、pause/unpause、console、vnc等操作。

  • virt-handler:

virt-handler以deamonSet的形式运行在每个节点上(配置hostNetwork+hostPID),逻辑上包含以下功能:

1、提供rest接口供virt-api调用,接口功能包括console、vnc、pause/unpause、freeze/unfreeze等功能,这些接口最终操作本节点上对应的VMI对应的虚拟机。virt-api通过VMI的status.nodeName+约定好的端口找到VMI对应节点上的virt-handler https服务,这也是为什么virt-handler要配置hostNetwork网络;

2、通过list-watch机制确保相应的libvirt domain的启动或停止,但是这个过程并不是virt-handler与对应的libvirtd直接交互,而是virt-handler通过unix sock文件访问virt-launcher,virt-launcher再与libvirtd交互。virt-handler与virt-launcher交互的sock文件为/var/run/kubevirt/sockets/{vmi_uid}_sock。

  • virt-launcher:

每一个VMI对应的pod中都运行着一个virt-launcher进程,该进程逻辑上提供如下功能:

1、以unix sock形式启动一个grpc server,该server负责提供接口供virt-hanlder调用;

2、管理VMI对应的pod内的libvirtd、qemu进程的生命周期,例如qemu进程异常后会自动重启。

流程分析

我们选取两个场景,加深对kubevirt各个组件的理解。

场景一、创建VMI

kubevirt(二)实现原理

  1. 用户执行kubectl apply一个vmi对象的yaml;
  2. apiServer把vmi对象保存到etcd;
  3. virt-controller通过list-watch机制监听到vmi对象的创建事件;
  4. virt-controller根据vmi信息构造一个pod对象,并调apiServer接口进行创建;
  5. apiServer把该pod对象存入etcd;
  6. k8s scheduler通过list-watch机制监听到有pod创建;
  7. k8s scheduler发现pod.spec.nodeName为空,根据调度算法选择一个合适的节点给该pod,把节点名称写到pod.spec.nodeName字段,并调apiServer接口更新pod信息;
  8. apiServer更新etcd中pod对象信息;
  9. 上述节点上的kubelet通过list-watch机制发现有新的pod调度到本节点上;
  10. kubelet在本节点上创建一个pod,该pod中启动virt-launcher、libvirtd、qemu三个进程,此时一个kubevirt虚拟机就创建出来了。
场景二、vnc连接虚拟机

kubevirt(二)实现原理

  1. 用户执行virtctl vnc命令;
  2. 请求到达apiServer后通过aggregator机制转发到virt-api;
  3. virt-api根据vmi中的节点信息找到该节点的ip,并通过约定好的端口请求对应节点上的virt-handler;
  4. virt-handler通过unix sock文件找到虚拟机对应的virt-launcher,发起vnc请求;
  5. virt-launcher调libvirtd的vnc接口。

总结

通过本文的介绍,我们简单地了解了kubevirt原理以及核心CRD vmi,其实kubevirt还有很多CRD来处理多副本、快照、迁移等场景,这些内容有待读者自行探索。

如果用一句话来概述kubevirt,那就是在pod中跑虚拟机,github上还有一个开源的容器项目:kata container,与kubevirt相似的是,底层也用到了qemu虚拟化技术,但是kata container是在虚拟机中跑pod,正如kubevirt FAQ中对两者区别的描述:

Kata containers allow you to run containers inside virtual machines.
KubeVirt allows you to run full virtual machines on Kubernetes alongside regular containers.
One could say they are opposites:
Kata containers are containers inside virtual machines.
KubeVirt is a virtual machine inside a container.

后续会有文章分析docker container、kubevirt和kata container的差异,敬请期待。

微信公众号卡巴斯同步发布,欢迎大家关注。文章来源地址https://www.toymoban.com/news/detail-404134.html

到了这里,关于kubevirt(二)实现原理的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 云计算:从基础架构原理到最佳实践之:虚拟化技术与容器化

    作者:禅与计算机程序设计艺术 作为一名资深软件工程师、架构师、CTO或者云计算相关技术人员,如果想要提升自己对于云计算的理解和掌握能力,那么文章将会非常有帮助。文章将从云计算的最底层——基础架构开始介绍,向高级用户展示如何利用云服务提供商提供的基础

    2024年02月08日
    浏览(49)
  • Docker从认识到实践再到底层原理(二-1)|容器技术发展史+虚拟化容器概念和简介

    那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。 高质量博客汇总 然后就是博主最近最花时间的一个专栏《Docker从认识到实践再到底层原理》希望大家多多关

    2024年02月09日
    浏览(42)
  • Docker容器与虚拟化技术:Docker consul 实现服务注册与发现

    目录 一、理论 1.Docker consul 二、实验 1.consul部署 2. consul-template部署 三、总结 (1)服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承载,服务之间调用单纯的通过接口访问。直到后来出现

    2024年02月11日
    浏览(53)
  • 虚拟化技术 — Libvirt 异构虚拟化管理组件

    Libvirt 是目前使用最为广泛的异构虚拟化管理工具,由 libvirt API 函数库、libvirtd Daemon 这 2 个关键部分组成,还具有一个默认命令行管理工具 virsh。 https://libvirt.org/ Libvirt 采用了面向驱动的架构设计,北向提供了统一的虚拟化资源管理 API,南向通过不同的驱动程序来对接异构

    2024年02月03日
    浏览(45)
  • 虚拟化技术 — 虚拟机计算

    NUMA CPU 的主要优势是: 高内存带宽 :每一个 NUMA Node 内部有专用的内存总线访问本地内存,而所有 NUMA Nodes 之间使用共享总线访问远端内存。假设:一个具有 4 个 NUMA Nodes 的系统,每一个 Node 内部有 1GB/s 的存储带宽,同时共享总线也具有 1GB/s 的带宽。如果所有的 Core 总是使

    2024年02月04日
    浏览(62)
  • 【云计算学习教程】云计算虚拟化技术和容器技术详解_云计算虚拟化技术与容器技术

    这跟交通网络很相似,连接两个城市的交通网络具备的第一个功能就是汽车从一个城市到达另一个城市;第二个功能是控制到底走哪条线路最好。前者就是由公路组成的交通网络,后者就是交通控制系统。 下面我们再来看看传统的网络设备(比如一台路由器)的逻辑分层结构

    2024年04月22日
    浏览(62)
  • 虚拟化技术 — VirtIO 虚拟设备接口标准

    VirtIO 由 Rusty Russell 开发,最初是为了支持自己开发的 lguest Hypervisor,其设计目标是在虚拟化环境下提供与物理设备相近的 I/O 功能和性能,并且避免在虚拟机中安装额外的驱动程序。基于这一目标,后来通过开源的方式将 VirtIO 延伸为一种虚拟化设备接口标准,并广泛的支持

    2023年04月25日
    浏览(46)
  • 存储虚拟化技术

    1、存储虚拟化简介 存储领域国际权威机构存储网络工业协会(SNIA)给出的存储虚拟化的定义是“通过将存储系统/子系统的内部功能从应用程序、计算服务器和网络资源中进行抽象、隐藏或隔离,实现独立于应用程序、网络的存储与数据管理”。 存储虚拟化是指将 SAN 中的各

    2024年02月07日
    浏览(37)
  • 虚拟化技术课程实践

    实验目的及要求 实验目的 :基于课程中讲授的虚拟化基本原理和技术,掌握虚拟化环境的搭建方法,熟悉了解一些典型的虚拟化平台的命令。 实验要求 :在Ubuntu操作系统下使用KVM和QUME创建虚拟机镜像、启动虚拟机。 实验环境 VMware Workstation 16 Pro 装有 Ubuntu14.04 操作系统的

    2024年02月08日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包