【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
相关推荐
IT199516 小时前
Docker笔记-对docker-compose.yml基本认识
笔记·docker·容器
阿里云云原生16 小时前
同学,你好!阿里云云原生 2027 实习生招聘启动
云原生
阿里云云原生16 小时前
一行命令,给你的 OpenClaw 龙虾装上 X 光机——阿里云可观测,让养虾更经济更安全
云原生
阿里云云原生18 小时前
SLS 智能问答助手:秒解游戏运营客服难题
云原生
一殊酒18 小时前
【Docker】常用命令大全及解析
docker·容器·eureka
天远数科19 小时前
分布式系统实战:基于天远二手车估值API构建高可用车辆估值微服务
大数据·微服务·云原生·架构
Uncertainty!!19 小时前
将docker镜像上传到github镜像存储仓库(GitHub 容器仓库(GHCR)使用流程)
docker·容器·github
我是谁??19 小时前
Rocky9+ Docker + 容器内Linux桌面环境 + Web远程
运维·docker·容器
中国胖子风清扬19 小时前
Camunda 8 概念详解:梳理新一代工作流引擎的核心概念与组件
java·spring boot·后端·spring cloud·ai·云原生·spring webflux
殷紫川19 小时前
吃透云原生可观测:Metrics、Logging、Tracing 架构底层逻辑与实战全指南
云原生·架构