【K8s】Kubernetes 虚拟机管理工具之 KubeVirt

本文内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发、订阅专栏!


专栏订阅入口

| 精选文章 | Kubernetes | Docker | Linux | 羊毛资源 | 工具推荐 |


往期精彩文章

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法

【Docker】(全网首发)Kylin V10 下 MySQL 容器内存占用异常的解决方法(续)

【K8s】Helm Chart 方式部署 Sentry


目录

一、基本介绍

二、部署过程

1、获取最新版本

[2、部署 KubeVirt Operator](#2、部署 KubeVirt Operator)

[3、部署 KubeVirt](#3、部署 KubeVirt)

4、查看状态

[5、安装 Virtctl 客户端](#5、安装 Virtctl 客户端)

6、虚拟机使用示例


一、基本介绍

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

官方指南地址:https://kubevirt.io/user-guide/


二、部署过程
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
相关推荐
能不能别报错4 小时前
K8s学习笔记(六) K8s升级与节点管理
笔记·学习·kubernetes
青衫客364 小时前
浅谈 Kubernetes 微服务部署架构
微服务·架构·kubernetes
虚伪的空想家4 小时前
生产环境K8S的etcd备份脚本
运维·容器·kubernetes·脚本·备份·etcd
孙克旭_5 小时前
kind部署K8S集群并将“修仙业务“部署到kind集群
linux·运维·云原生·kubernetes·kind
缘的猿5 小时前
Kubernetes 四层负载均衡:Service核心原理与实战指南
java·kubernetes·负载均衡
不会吉他的肌肉男不是好的挨踢男7 小时前
docker 安装TDengine 并创建新用户
docker·容器·iot·tdengine
FrankYoou8 小时前
docker logs 显示的日志,默认是保存在哪里?
docker·容器
Li zlun8 小时前
Kubernetes 进阶实战:CRD、Gateway API 与优先级调度
java·kubernetes·gateway
敲上瘾12 小时前
Docker多容器编排:Compose 实战教程
linux·运维·docker·容器·架构