KubeVirt入门介绍

KubeVirt入门介绍

KubeVirt 是一个开源项目,旨在通过 Kubernetes 管理虚拟机(VM),使得 Kubernetes 不仅支持容器化工作负载,还支持虚拟机的部署和管理。这种双重支持的目标是提供一个统一的云原生平台,让开发人员和运维团队在同一环境中管理容器和虚拟机应用。

1. 简介

为什么需要 KubeVirt?

KubeVirt 技术满足了那些已经或希望采用 Kubernetes 的开发团队的需求,这些团队拥有现有的基于虚拟机的工作负载,但这些工作负载无法轻易地容器化。更具体地说,KubeVirt 提供了一个统一的开发平台,让开发人员可以在一个通用的共享环境中构建、修改和部署基于应用容器和虚拟机的应用程序。

其优势广泛而显著。对于依赖现有虚拟机工作负载的团队,KubeVirt 使他们能够快速将应用程序容器化。通过将虚拟化的工作负载直接纳入开发流程中,团队可以逐步拆解这些工作负载,同时在需要时继续使用剩余的虚拟化组件,从而实现灵活的迁移和过渡。

使用 KubeVirt 可以做什么?

  • KubeVirt 和 Kubernetes :利用 KubeVirt 和 Kubernetes 来管理无法容器化的应用所需的虚拟机。

  • KubeVirt 和虚拟机 : 在同一平台上将现有的虚拟化工作负载与新的容器化工作负载结合。

  • 容器化应用 : 支持在容器中开发新的微服务应用,并与现有的虚拟化应用进行交互。

2. 架构

Stack(技术栈)

  +---------------------+
  | KubeVirt            |
~~+---------------------+~~
  | Orchestration (K8s) |
  +---------------------+
  | Scheduling (K8s)    |
  +---------------------+
  | Container Runtime   |
~~+---------------------+~~
  | Operating System    |
  +---------------------+
  | (Virtual)           |
~~+---------------------+~~
  | Physical            |
  +---------------------+

需要虚拟化服务的用户通过虚拟化 API进行交互,而该 API 会与 Kubernetes 集群通信以调度请求的虚拟机实例(VMI)。调度、网络和存储全部由 Kubernetes 处理,而 KubeVirt 提供虚拟化功能。

Additional Services

KubeVirt 为你的 Kubernetes 集群提供了额外的功能,以实现虚拟机管理。

回想一下 Kubernetes 是如何处理 Pods 的,我们会记得 Pods 是通过向 Kubernetes API Server 提交 Pod 规格来创建的。这个规格随后会在 API Server 内部转化为一个对象,这个对象具有特定的类型或种类——在规格中就是这样定义的。Pod 的类型是 Pod。Kubernetes 中的控制器知道如何处理这些 Pod 对象。因此,一旦看到一个新的 Pod 对象,控制器就会执行必要的操作以将 Pod 启动,并使其匹配所需的状态。

KubeVirt 使用了相同的机制。因此,KubeVirt 提供了三种东西来实现新的功能:

  1. 向 Kubernetes API 添加了额外的类型——所谓的自定义资源定义(CRD)。
  2. 为与这些新类型相关的集群级逻辑添加了额外的控制器。
  3. 为与新类型相关的节点特定逻辑添加了额外的守护进程。

完成这三个步骤后,你就可以:

  • 在 Kubernetes 中创建这些新类型的对象(在我们的例子中是 VMIs)。
  • 新的控制器负责将 VMI 调度到某个主机上。
  • 一个守护进程: virt-handler – 与 kubelet 一起在主机上工作,启动 VMI 并进行配置,直到它匹配所需的状态。

最后要注意的是,控制器和守护进程都是作为 Pods(或类似的形式)在 Kubernetes 集群上运行的,而不是与集群并行安装的。类型如前所述是在 Kubernetes API Server 内定义的。这使得用户可以与 Kubernetes 进行交互,同时修改 VMIs。

下面的图示展示了额外的控制器和守护进程是如何与 Kubernetes 进行通信的,以及这些额外类型存储的位置:

架构

简化的架构图:

简化后的架构

3. 应用布局

集群

  1. KubeVirt 组件

    • virt-controller
    • virt-handler
    • libvirtd
  2. KubeVirt 管理的 Pods

    • VMI Foo
    • VMI Bar
  3. KubeVirt 自定义资源

    • VirtualMachine (VM) Foo -> VirtualMachineInstance (VMI) Foo
    • VirtualMachineInstanceReplicaSet (VMIRS) Bar -> VirtualMachineInstance (VMI) Bar

VirtualMachineInstance (VMI) 是表示实例基本、短暂构建块的自定义资源。在许多情况下,这个对象不会由用户直接创建,而是通过高级资源来创建。VMI 的高级资源可以是:

VirtualMachine (VM)

有状态的虚拟机,能够在保留 VM 数据和状态的情况下停止和启动。

VirtualMachineInstanceReplicaSet (VMIRS)

类似于 Pods 的 ReplicaSet,是一个由模板中定义的相似配置的短暂 VMI 组成的组。

4. 原生工作负载

KubeVirt 部署在 Kubernetes 集群之上。这意味着你可以继续运行 Kubernetes 原生工作负载,同时也能管理通过 KubeVirt 管理的 VMI。

此外:如果你可以运行原生工作负载,并且已经安装了 KubeVirt,那么你应该也能够运行基于虚拟机的工作负载。例如,应用操作员在使用集群功能管理虚拟机时,不应需要比使用普通 Pod 时更多的权限。

从安全角度来看,安装和使用 KubeVirt 不应赋予用户任何他们在原生工作负载方面尚未拥有的权限。例如,一个非特权的应用操作员绝不能通过使用 KubeVirt 功能获得对特权 Pod 的访问权限。

5. The Razor(准则)

我们热爱虚拟机,认为它们非常重要,并努力使它们在 Kubernetes 中易于使用。但比虚拟机更重要的是,我们热爱良好的设计和模块化、可重用的组件。我们经常面临一个两难问题:我们应该以最优化虚拟机的方式来解决 KubeVirt 中的问题,还是应该走一条更长的路,把这个解决方案也引入到基于 Pod 的工作负载中?

为了做出这个决策,我们提出了 KubeVirt 准则:“如果某个功能对 Pods 有用,我们不应该仅仅为虚拟机实现它。”

例如,我们曾讨论过如何将虚拟机连接到外部网络资源。最直接的方式似乎是引入 KubeVirt 特定的代码,将虚拟机附加到主机网桥上。然而,我们选择了更长的路径,即与 MultusCNI 集成并加以改进。

6. 相关资料

  1. KubeVirt文档:https://kubevirt.io/user-guide/
  2. KubeVirt架构:https://github.com/kubevirt/kubevirt/blob/master/docs/architecture.md
  3. KubeVirt仓库: https://github.com/kubevirt/kubevirt
multus-cni 是一个 Kubernetes 的多网络 CNI 插件,它是 Kubernetes 上负责多网络管理的代表性插件之一。它允许 Kubernetes 集群中的每个 Pod 拥有多个网络接口,并能针对每个网络接口对应的网络策略和路由进行不同的配置。 multus-cni 的源码主要分为三部分:CNI 插件相关代码、配置文件相关代码和网络资源相关代码。CNI 插件相关代码包括主程序 main.go、CNI 配置解析器 conf.go、IPAM 相关代码和网络审计相关代码。配置文件相关代码包括 multus.conf 和各种 JSON/YAML 配置文件的解析器。网络资源相关代码主要负责通过 Kubernetes API 获取和管理 Pod、NetworkAttachmentDefinition 和 Service 等网络资源信息。 multus-cni 的核心是 CNI 插件相关代码中的 main.go,它主要负责 CNI 插件的初始化和执行。CNI 插件的执行流程大概可以总结为如下三步:首先,multus-cni 解析 CNI 配置文件并获取 Pod 相关的网络资源信息;接着,multus-cni 调用下层 CNI 插件(比如 flannel、calico、ovs 等)完成网络接口的创建和配置;最后,multus-cni 继续执行其他 CNI 插件(比如 ipvlan、macvlan、bridge 等)完成其他网络接口的创建和配置。 此外,multus-cni 通过 Kubernetes API 获取和管理 NetworkAttachmentDefinition 和 Service 等网络资源信息。在 Kubernetes 中,NetworkAttachmentDefinition 用于定义和配置网络接口,而 Service 用于定义和管理 Kubernetes 集群中的服务。multus-cni 通过获取、解析和应用这些网络资源信息,实现了多网络的管理和配置。 总的来说,multus-cni 是一个非常优秀的多网络 CNI 插件,它利用 Kubernetes API 实现了多网络的管理和配置,并同时支持插件化扩展。它的源码比较清晰,适合对 Kubernetes 网络原理比较熟悉的开发者学习和探究。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lldhsds

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值