KubeVirt

KubeVirt发展历程

随着云计算和容器技术的发展,Kubernetes 已经成为了业界的标准和领导者。为用户提供了一个强大、灵活和可扩展的平台,用来部署和管理各种类型的应用。然而,对于一些难以容器化的应用,例如传统的企业应用,遗留的系统,或者需要特殊硬件支持的应用,虚拟机仍然是一个必要和有效的解决方案。 如何在 Kubernetes 上运行和管理虚拟机,以及如何实现容器和虚拟机之间的互操作性和一致性,是一个待解决的问题。这就是 KubeVirt 项目诞生的背景和目标。

KubeVirt 的想法最早可以追溯到 2015 年,在第一届 KubeCon 上 Red Hat 的工程师 Fabian Deutsch 提出了一个问题:能否在 Kubernetes 上运行虚拟机?当时的回答是不确定的,但是这个问题引起了很多人的兴趣和讨论。在接下来的一年里,Fabian Deutsch 和他的同事开始了一些原型和实验性的工作,探索了不同的方案和技术。最终,他们选择了使用 libvirt 和 QEMU 来实现虚拟机在 Kubernetes 上的运行和管理。

在 2016 年底,KubeVirt 项目正式启动,并在 GitHub 上开源。项目的主要目标是提供一个 Kubernetes 原生的虚拟化 API 和运行时,让用户可以像使用 Pod 和 Deployment 一样使用 VirtualMachine 和 VirtualMachineInstance 来定义和管理虚拟机。项目的主要挑战是如何将虚拟机与 Kubernetes 的资源模型,调度器,网络,存储等组件进行集成和协调。

在接下来的几年里,KubeVirt 项目经历了多个阶段和版本的迭代和改进。其中一些重要的里程碑包括:

  • 2017 年底,KubeVirt 实现了基本的虚拟机创建和删除功能,并发布了 v0.1.0 版本。
  • 2018 年初,KubeVirt 重新设计了 VirtualMachine 的 API,并发布了 v0.2.0 版本。
  • 2018 年中,KubeVirt 兼容了 Kubernetes 的网络,以及离线虚拟机支持,并发布了 v0.3.0 版本。
  • 2018 年底,KubeVirt 支持了初始化空 PV,以及 liveness 和 readiness,并发布了 v0.9.0 ~ v0.11.0 版本。
  • 2019 年中,KubeVirt 支持了 virtctl migrate,并发布了 v0.21.0 版本。
  • 2022 年初,KubeVirt 移除了旧的对 GPU 设备的支持,可以通过统一的方式进行定义,并发布了 v0.50.0 版本。
  • 2023 年中,KubeVirt 发布了 v1.0.0 版本。

KubeVirt 架构

KubeVirt 的核心功能是在 Kubernetes 上运行和管理虚拟机。KubeVirt 定义了一套 Kubernetes 原生的虚拟化 API,让用户可以像使用 Pod 和 Deployment 一样使用 VirtualMachine 和 VirtualMachineInstance 来定义和管理虚拟机。VirtualMachine 是一种声明式的资源类型,表示一个期望的虚拟机状态。VirtualMachineInstance 是一种实时的资源类型,表示一个正在运行的虚拟机实例。用户可以通过 YAML 文件或者 kubectl 命令来创建,更新,删除或者查询这些资源

KubeVirt 实现了一套虚拟化运行时,让用户可以在 Kubernetes 集群中的任何节点上运行和管理虚拟机。KubeVirt 的运行时主要由以下几个组件构成:

  • virt-controller:负责监控和调谐虚拟机的状态,以及处理虚拟机的生命周期事件,如创建,删除,启动,停止,迁移等。
  • virt-handler:负责在每个节点上执行虚拟机的操作,如启动,停止,暂停,恢复等。它也负责与 libvirt 和 QEMU 进行通信,以及收集和报告虚拟机的性能指标。
  • virt-operator:负责在每个节点上启动和管理 libvirt 和 QEMU 进程。
  • virt-api:负责提供虚拟化 API 的服务端点,以及验证和转换用户的请求。
    在这里插入图片描述
    这里还有一个简化版,这个图里的 Agent 其实就是 virt-hander
    在这里插入图片描述
    虚拟机创建流程
  • client 发送创建VMI命令达到k8s API server.
  • K8S API 创建VMI
  • virt-controller监听到VMI创建时,根据VMI spec生成pod spec文件,创建pods
  • k8s调度创建pods
  • virt-controller监听到pods创建后,根据pods的调度node,更新VMI 的nodeName
  • virt-handler监听到VMI nodeName与自身节点匹配后,与pod内的virt-launcher通信,virt-laucher创建虚拟机,并负责虚拟机生命周期管理

部署KubeVirt

环境准备

系统:centos7
内核版本:5.4.278-1.el7.elrepo.x86_64
Docker版本:20.10.17
K8s版本:1.21.5
Kubevirt:v0.43.1

开启虚拟化

在安装 Kubevirt 之前,需要做一些准备工作。先安装 libvrtqemu 软件包

# Ubuntu
$ apt install -y qemu-kvm libvirt-bin bridge-utils virt-manager

# CentOS
$ yum install -y qemu-kvm libvirt virt-install bridge-utils

查看节点是否支持 kvm 硬件辅助虚拟化

$ virt-host-validate qemu
  QEMU: Checking for hardware virtualization                                 : PASS
  QEMU: Checking if device /dev/kvm exists                                   : PASS
  QEMU: Checking if device /dev/kvm is accessible                            : PASS
  QEMU: Checking if device /dev/vhost-net exists                             : PASS
  QEMU: Checking if device /dev/net/tun exists                               : PASS
  QEMU: Checking for cgroup 'memory' controller support                      : PASS
  QEMU: Checking for cgroup 'memory' controller mount-point                  : PASS
  QEMU: Checking for cgroup 'cpu' controller support                         : PASS
  QEMU: Checking for cgroup 'cpu' controller mount-point                     : PASS
  QEMU: Checking for cgroup 'cpuacct' controller support                     : PASS
  QEMU: Checking for cgroup 'cpuacct' controller mount-point                 : PASS
  QEMU: Checking for cgroup 'cpuset' controller support                      : PASS
  QEMU: Checking for cgroup 'cpuset' controller mount-point                  : PASS
  QEMU: Checking for cgroup 'devices' controller support                     : PASS
  QEMU: Checking for cgroup 'devices' controller mount-point                 : PASS
  QEMU: Checking for cgroup 'blkio' controller support                       : PASS
  QEMU: Checking for cgroup 'blkio' controller mount-point                   : PASS
  QEMU: Checking for device assignment IOMMU support                         : PASS
  QEMU: Checking if IOMMU is enabled by kernel                               : PASS

如果节点不支持 kvm 硬件辅助虚拟化,则生成让 Kubevirt 使用软件虚拟化的配置

$ kubectl create namespace kubevirt
$ kubectl create configmap -n kubevirt kubevirt-config \
    --from-literal debug.useEmulation=true

部署KubeVirt

[root@master ~]# export RELEASE=v0.43.1
[root@master ~]# kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-operator.yaml
[root@master ~]# kubectl apply -f https://github.com/kubevirt/kubevirt/releases/download/${RELEASE}/kubevirt-cr.yaml

查看部署结果

[root@master ~]# kubectl get pods -n kubevirt
NAME                               READY   STATUS    RESTARTS   AGE
virt-api-64999f7bf5-fblkh          1/1     Running   0          5m24s
virt-api-64999f7bf5-l8wzr          1/1     Running   0          5m24s
virt-controller-8696ccdf44-k9qpv   1/1     Running   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值