文章目录
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 之前,需要做一些准备工作。先安装 libvrt 和 qemu 软件包
# 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

最低0.47元/天 解锁文章
1427

被折叠的 条评论
为什么被折叠?



