首先需要登录跳板机,并使用 qssh root@(你的测试机)来登录要操作的机器

k get vm -A -o wide 使用指令查看当前正在运行的虚拟机

选择一个工作目录,编写 VirtualMachine YAML 配置文件(包含 CPU、内存、存储卷配置)(如果要部署其他虚拟机,将此文件中的全部 01 换成 02,03 即可)例如:vim vm-01-fix.yml
yaml
# j2 每个节点一个 vm 哨兵
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
namespace: must-alive
name: tyk-vm01
spec:
runStrategy: Always
dataVolumeTemplates:
spec:
storage:
accessModes:
requests:
storage: 50Gi
source:
blank: {}
template:
metadata:
labels:
kubevirt.io/size: large
kubevirt.io/domain: tyk-vm01
name: tyk-vm01
spec:
domain:
cpu:
model: host-passthrough
cores: 8
devices:
disks:
- name: containerdisk
disk:
bus: virtio
- name: harddisk
disk:
bus: virtio
- name: cloudinitdisk
disk:
bus: virtio
interfaces:
- name: default
bridge: {}
resources:
requests:
memory: 16384Mi
networks:
- name: default
pod: {}
volumes:
- containerDisk:
image: tedezed/ubuntu-container-disk:24.04
name: containerdisk
- dataVolume:
name: tyk-vm01-disk
name: harddisk
- cloudInitNoCloud:
userData: |
#cloud-config
password: ubuntu
chpasswd: { expire: False }
runcmd:
- sudo apt update
- sudo apt install nginx -y
- echo "IyEvYmluL2Jhc2gKCiMgR2VuZXJhdGUgdGhlIFNlY3JldCBQYWdlCmVjaG8gIjxoMT5TZWNyZXQgUGFnZTwvaDE+PHAgc2VjcmV0IHBhZ2U8L3A+IiA+IC92YXIvd3d3L2h0bWwvc2VjcmV0Lmh0bWwKCkdlbmVyYXRlIFZNIERldGFpbHMgUGFnZSB3aXRoIEhvc3RuYW1lIGFuZCBJUAplY2hvICJcbjxoMT5WTURldGFpbHM8L2gxPjxwPk5hbWU6ICQoaG9zdG5hbWUpPC9wPjxwPklQOiAkKGhvc3RuYW1lIC1JKTwvcD48cD5Mb2NhbGU6ICQobG9jYWxlKTwvcD4iID4gL3Zhci93d3cvaHRtbC9kZXRhaWxzLmh0bWwK" | base64 --decode | sudo bash
- sudo sed -i 's|try_files $uri $uri/ =404;|try_files $uri $uri/ $uri.html =404;|' /etc/nginx/sites-available/default
- sudo systemctl restart nginx
name: cloudinitdisk
---
apiVersion: v1
kind: Service
metadata:
name: tyk-vm01
namespace: must-alive
spec:
ports:
- port: 80
targetPort: 80
protocol: TCP
selector:
kubevirt.io/domain: tyk-vm01
以下是参数重点,可简单做了解:
yaml
KubeVirt VirtualMachine YAML 重点参数讲解:
1. 基础元数据
metadata:
namespace: must-alive # 命名空间
name: tyk-vm01 # 虚拟机名称
2. 运行策略
spec:
runStrategy: Always # 自动启动并保持运行(还有 Manual、RerunOnFailure、Halted)
3. 存储配置(重点)
dataVolumeTemplates: # 定义持久化存储
- metadata:
name: tyk-vm01-disk # 数据卷名称
spec:
storage:
accessModes:
- ReadWriteOnce # 单节点读写(必须)
resources:
requests:
storage: 50Gi # 磁盘大小
source:
blank: {} # 空白磁盘(还可用 pvc、http、registry)
4. 虚拟机硬件
domain:
cpu:
model: host-passthrough # CPU 透传模式(性能最好)
cores: 8 # 8 核 CPU
resources:
requests:
memory: 16384Mi # 16GB 内存
5. 磁盘挂载(重点)
devices:
disks:
- name: containerdisk # 系统盘(只读镜像)
disk:
bus
配置完文件后,就可以使用指令部署虚拟机:kubectl apply -f vm-01-fix.yml

(注意)当前我为了演示先把原虚拟机删掉:kubectl delete vm tyk-vm01 -n must-alive

部署完成:

进入虚拟机:virtctl console tyk-vm01 -n must-alive
账号密码都输入 ubuntu 即可

进入虚拟机后输入 sudo -i 转为root用户即可

退出虚拟机使用 ctrl + ] ,建议后续配置好ssh登录,因为这种方式登录有bug
如果创建过程中发现准备时间很长,通常是大于三分钟,那就可能是有bug,此时可能是yaml文件编写的问题,以下三个指令可以查看相关报错信息:
查看数据卷的详细描述:k describe dv -n must-alive tyk-vm01-disk
yaml
root@xs4772:~/tyk# k describe dv -n must-alive tyk-vm01-disk
Name: tyk-vm01-disk
Namespace: must-alive
Labels: kubevirt.io/created-by=75acef72-0bd6-41a0-a7ee-3e6aea85455a
Annotations: cdi.kubevirt.io/allowClaimAdoption: true
cdi.kubevirt.io/storage.usePopulator: false
API Version: cdi.kubevirt.io/v1beta1
Kind: DataVolume
Metadata:
Creation Timestamp: 2026-03-10T02:35:53Z
Generation: 1
Owner References:
API Version: kubevirt.io/v1
Block Owner Deletion: true
Controller: true
Kind: VirtualMachine
Name: tyk-vm01
UID: 75acef72-0bd6-41a0-a7ee-3e6aea85455a
Resource Version: 59077321
UID: ccaaaac6-49c2-4dd4-9da8-b93b75d257c2
Spec:
Source:
Blank:
Storage:
Access Modes:
ReadWriteOnce
Resources:
Requests:
Storage: 50Gi
Status:
Claim Name: tyk-vm01-disk
Conditions:
Last Heartbeat Time: 2026-03-10T02:36:10Z
Last Transition Time: 2026-03-10T02:36:10Z
Message: PVC tyk-vm01-disk Bound
Reason: Bound
Status: True
Type: Bound
Last Heartbeat Time: 2026-03-10T02:36:21Z
Last Transition Time: 2026-03-10T02:36:21Z
Status: True
Type: Ready
Last Heartbeat Time: 2026-03-10T02:36:19Z
Last Transition Time: 2026-03-10T02:36:19Z
Message: Import Complete
Reason: Completed
Status: False
Type: Running
Phase: Succeeded
Progress: 100.0%
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Pending 44s (x2 over 44s) datavolume-import-controller target PVC tyk-vm01-disk Pending and waiting for first consumer to be created before binding
Normal Pending 43s (x5 over 44s) datavolume-import-controller target PVC tyk-vm01-disk Pending and waiting for pod importer-tyk-vm01-disk to be scheduled
Normal Pending 41s (x13 over 45s) datavolume-import-controller PVC tyk-vm01-disk Pending
Normal Pending 41s (x5 over 42s) datavolume-import-controller target PVC tyk-vm01-disk Pending and Waiting for a volume to be created either by the external provisioner 'rancher.io/local-path' or manually by the system administrator. If volume creation is delayed, please verify that the provisioner is running and correctly registered.
获取数据卷的完整 YAML 配置:k get dv -n must-alive tyk-vm01-disk -o yaml
yaml
root@xs4772:~/tyk# k get dv -n must-alive tyk-vm01-disk -o yaml
apiVersion: cdi.kubevirt.io/v1beta1
kind: DataVolume
metadata:
annotations:
cdi.kubevirt.io/allowClaimAdoption: "true"
cdi.kubevirt.io/storage.usePopulator: "false"
creationTimestamp: "2026-03-10T02:35:53Z"
generation: 1
labels:
kubevirt.io/created-by: 75acef72-0bd6-41a0-a7ee-3e6aea85455a
name: tyk-vm01-disk
namespace: must-alive
ownerReferences:
- apiVersion: kubevirt.io/v1
blockOwnerDeletion: true
controller: true
kind: VirtualMachine
name: tyk-vm01
uid: 75acef72-0bd6-41a0-a7ee-3e6aea85455a
resourceVersion: "59077321"
uid: ccaaaac6-49c2-4dd4-9da8-b93b75d257c2
spec:
source:
blank: {}
storage:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 50Gi
status:
claimName: tyk-vm01-disk
conditions:
- lastHeartbeatTime: "2026-03-10T02:36:10Z"
lastTransitionTime: "2026-03-10T02:36:10Z"
message: PVC tyk-vm01-disk Bound
reason: Bound
status: "True"
type: Bound
- lastHeartbeatTime: "2026-03-10T02:36:21Z"
lastTransitionTime: "2026-03-10T02:36:21Z"
status: "True"
type: Ready
- lastHeartbeatTime: "2026-03-10T02:36:19Z"
lastTransitionTime: "2026-03-10T02:36:19Z"
message: Import Complete
reason: Completed
status: "False"
type: Running
phase: Succeeded
progress: 100.0%
查看存储类的配置:k get sc local-path -o yaml
lua
root@xs4772:~/tyk# k get sc local-path -o yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"storage.k8s.io/v1","kind":"StorageClass","metadata":{"annotations":{},"name":"local-path"},"provisioner":"rancher.io/local-path","reclaimPolicy":"Delete","volumeBindingMode":"WaitForFirstConsumer"}
storageclass.kubernetes.io/is-default-class: "true"
creationTimestamp: "2026-01-07T03:52:36Z"
name: local-path
resourceVersion: "15180097"
uid: 73f99732-35a5-4877-9f88-0f0a06bdca57
provisioner: rancher.io/local-path
reclaimPolicy: Delete
volumeBindingMode: WaitForFirstConsumer
命令详解:
三个命令简单讲解:
- k describe dv -n must-alive tyk-vm01-disk
查看数据卷的详细描述(人类可读)
- describe = 显示详细信息
- dv = DataVolume(数据卷)
- 重点看 Events 部分,能看到错误信息
用途: 排查问题首选,能看到创建过程中的报错
- k get dv -n must-alive tyk-vm01-disk -o yaml
获取数据卷的完整 YAML 配置
- get -o yaml = 以 YAML 格式输出
- 显示所有字段(配置 + 状态)
用途: 查看完整配置、复制配置、深入分析
- k get sc local-path -o yaml
查看存储类的配置
- sc = StorageClass(存储类)
- local-path = 存储类名称
- 存储类是集群级别资源,定义如何创建存储
用途: 了解集群有哪些存储、存储规则
三者关系: StorageClass ← 定义存储规则(集群级) ↓ DataVolume ← 申请 50G 存储(根据 StorageClass 创建) ↓ 挂载到 VM ← 虚拟机使用这个磁盘
快速记忆:
- describe = 看问题(有日志)
- get -o yaml = 看完整配置
- StorageClass = 存储规则模板