本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发、订阅专栏!
专栏订阅入口
| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |
往期精彩文章
【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法
目录
[2、部署 KubeVirt Operator](#2、部署 KubeVirt Operator)
[3、部署 KubeVirt](#3、部署 KubeVirt)
[5、安装 Virtctl 客户端](#5、安装 Virtctl 客户端)
一、基本介绍
KubeVirt 是一个用于在 Kubernetes 集群中管理、运行虚拟机的开源项目,旨在为 Kubernetes 上的虚拟化提供通用解决方案。
传统上,Kubernetes 擅长管理容器,而虚拟机则通常由其他工具(如 OpenStack)管理。KubeVirt 可以将容器和虚拟机作为统一的工作负载,在同一个平台上进行编排、部署和管理。
KubeVirt 的主要功能如下:
-
统一的 API
- KubeVirt 引入了新的自定义资源定义(CRD),如 VirtualMachine、VirtualMachineInstance、VirtualMachineInstanceReplicaSet 等,因此可以通过 YAML 方式定义和管理虚拟机
-
生命周期管理
- KubeVirt 会自动处理虚拟机的生命周期,包括其调度
-
存储集成
- KubeVirt 与 Kubernetes 的存储卷(PersistentVolume)无缝集成,可以使用现有的 CSI(Container Storage Interface)驱动为虚拟机分配存储,如 Ceph、NFS 或本地存储
-
网络集成
- KubeVirt 虚拟机可以使用 Kubernetes 的网络模型,并利用 CNI(Container Network Interface)插件来连接到集群网络,实现虚拟机与 Pod 在同一个网络中互相通信
-
实时迁移
- KubeVirt 支持虚拟机在集群节点之间的不停机迁移,这对于维护和升级集群节点非常重要,可以确保服务的高可用性
-
高可用性
- 借助 Kubernetes 的调度和自愈能力,KubeVirt 也能提供虚拟机的容错。如果一个节点上的虚拟机出现故障,Kubernetes 会自动将其重新调度到健康的节点上
KubeVirt 的架构设计利用了 Kubernetes 的可扩展性,将虚拟机管理功能作为附加组件集成进来。其核心组件及示意图如下:
-
virt-api
- 是一个在 Kubernetes 集群中运行的 API Server 扩展,负责处理所有与 KubeVirt 相关的 API 请求(如创建 VirtualMachine 资源),并将它们写入 ETCD 数据库
-
virt-controller
- 是一个 Kubernetes 控制器,负责监控 KubeVirt 的自定义资源,并根据这些资源的期望状态来管理实际的虚拟机状态
-
virt-handler
- 是一个运行在每个 Kubernetes 节点上的 DaemonSet,负责管理其所在节点上的虚拟机,其角色类似于 kubelet
-
virt-launcher
-
是一个特殊的 Pod,负责托管和运行虚拟机,每个虚拟机实例都对应一个 virt-launcher
-
virt-launcher 内部包含 QEMU 等虚拟机进程,并负责将虚拟机的计算、网络和存储资源映射到 Pod 的资源上
-

GitHub 地址:https://github.com/kubevirt/kubevirt
二、部署过程
1、获取最新版本
bash
export KUBEVIRT_VERSION=$(curl -s https://api.github.com/repos/kubevirt/kubevirt/releases/latest | jq -r .tag_name)
echo $KUBEVIRT_VERSION
2、部署 KubeVirt Operator
bash
kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-operator.yaml
# 输出如下
namespace/kubevirt created
customresourcedefinition.apiextensions.k8s.io/kubevirts.kubevirt.io created
priorityclass.scheduling.k8s.io/kubevirt-cluster-critical created
clusterrole.rbac.authorization.k8s.io/kubevirt.io:operator created
serviceaccount/kubevirt-operator created
role.rbac.authorization.k8s.io/kubevirt-operator created
rolebinding.rbac.authorization.k8s.io/kubevirt-operator-rolebinding created
clusterrole.rbac.authorization.k8s.io/kubevirt-operator created
clusterrolebinding.rbac.authorization.k8s.io/kubevirt-operator created
deployment.apps/virt-operator created
3、部署 KubeVirt
bash
kubectl create -f https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/kubevirt-cr.yaml
# 输出如下
kubevirt.kubevirt.io/kubevirt created
4、查看状态
bash
# 查看组件状态
kubectl get po -n kubevirt
# 输出如下
NAME READY STATUS RESTARTS AGE
virt-api-dd4cc786-bct8l 1/1 Running 0 2m32s
virt-controller-b9bbc9458-2lrdp 1/1 Running 0 117s
virt-controller-b9bbc9458-j6pmn 1/1 Running 0 117s
virt-handler-5rghn 1/1 Running 0 117s
virt-operator-7b7bbf7c6f-g2q4c 1/1 Running 0 3m57s
virt-operator-7b7bbf7c6f-gh5t2 1/1 Running 0 3m57s
======================================================================
# 查看服务状态
kubectl get kubevirt -n kubevirt
# 输出如下
NAME AGE PHASE
kubevirt 7m25s Deployed
5、安装 Virtctl 客户端
bash
wget -O virtctl https://github.com/kubevirt/kubevirt/releases/download/${KUBEVIRT_VERSION}/virtctl-${KUBEVIRT_VERSION}-linux-amd6
chmod +x virtctl
🔔 virtctl 用于与虚拟机进行交互(启动/停止/控制台等)
6、虚拟机使用示例
1)部署虚拟机
bash
kubectl apply -f https://kubevirt.io/labs/manifests/vm.yaml
# 输出如下
virtualmachine.kubevirt.io/testvm created
2)查看虚拟机列表
可以看到虚拟机处于停止状态
bash
kubectl get vms
# 输出如下
NAME AGE STATUS READY
testvm 72s Stopped False
3)启动虚拟机
bash
./virtctl start testvm
# 输出如下
VM testvm was scheduled to start
======================================================================
kubectl get vmis
# 输出如下
NAME AGE PHASE IP NODENAME READY
testvm 8m15s Running 10.42.0.16 ubuntu True
4)访问虚拟机
bash
./virtctl console testvm

5)停止虚拟机
bash
./virtctl stop testvm
6)删除虚拟机
bash
kubectl delete vms testvm