虚拟机生命周期管理
说虚拟机生命周期管理之前先说一下 virtualmachines.kubevirt.io
和 virtualmachineinstances.kubevirt.io
。
[root@base-k8s-master-1 kubevirt]# kubectl api-resources | grep -i virt
...output omitted...
virtualmachineinstances vmi,vmis kubevirt.io/v1 true VirtualMachineInstance
virtualmachines vm,vms kubevirt.io/v1 true VirtualMachine
...output omitted...
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 7m53s Running True
[root@base-k8s-master-1 kubevirt]# kubectl get vmis
NAME AGE PHASE IP NODENAME READY
vm-dv 5m1s Running 10.100.223.30 base-k8s-worker-1.example.com True
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 93s Stopped False
这个资源是 KubeVirt 中的 CRD(Custom Resource Definitions,自定义资源定义),用于管理虚拟机(VM)和虚拟机实例(VMI)。
-
VM(VirtualMachine)
- VM 是一个 KubeVirt 的 "虚拟机模板",用于创建 VMI。
- VM 本身不会运行,它只是定义了一个虚拟机的规格(CPU、内存、磁盘等)。
- 如果 spec.running=true,VM 会自动创建一个 VMI 并启动它。
- VM 可以停止(running=false)后再重新启动,VMI 不能。
-
VMI(VirtualMachineInstance)
- VMI 是 KubeVirt 中运行中的虚拟机实例。
- 每个 VMI 对应一个运行中的虚拟机 Pod,封装了一个 KVM/QEMU 虚拟机。
- 一旦 VMI 终止(如关机、崩溃),它不会自动重启。
简单点讲,VM 就类似 Deployment,VMI 就类似 POD,区别就是 VM 会一直存在并显示虚拟机当前的状态,而 VMI 只有虚拟机开机的时候才会被创建。
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 4s Stopped False
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 19s Starting False
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 21m Paused False
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 7m53s Running True
创建虚拟机
[root@base-k8s-master-1 kubevirt]# kubectl apply -f vm-dv.yml
virtualmachine.kubevirt.io/vm-dv created
具体
vm-dv.yml
怎么写看virtctl
章节。
列出虚拟机
# 列出所有虚拟机
[root@base-k8s-master-1 kubevirt]# kubectl get vmis
NAME AGE PHASE IP NODENAME READY
vm-dv 14s Running 10.100.223.32 base-k8s-worker-1.example.com True
# 列出特定虚拟机
[root@base-k8s-master-1 kubevirt]# kubectl get vmis vm-dv
NAME AGE PHASE IP NODENAME READY
vm-dv 39s Running 10.100.223.32 base-k8s-worker-1.example.com True
删除虚拟机
[root@base-k8s-master-1 kubevirt]# kubectl delete vm vm-dv
virtualmachine.kubevirt.io "vm-dv" deleted
启动和关闭虚拟机
启动
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 4s Stopped False
[root@base-k8s-master-1 kubevirt]# virtctl start vm-dv -n default
VM vm-dv was scheduled to start
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 19s Starting False
[root@base-k8s-master-1 kubevirt]# kubectl get vmis
NAME AGE PHASE IP NODENAME READY
vm-dv 8s Running 10.100.223.33 base-k8s-worker-1.example.com True
关闭
[root@base-k8s-master-1 kubevirt]# virtctl stop vm-dv
VM vm-dv was scheduled to stop
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 56s Stopping False
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 93s Stopped False
# 强制关机
[root@base-k8s-master-1 kubevirt]# virtctl stop vm-dv --grace-period 0 --force
VM vm-dv was scheduled to stop
暂停和取消暂停虚拟机
暂停
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 7m53s Running True
[root@base-k8s-master-1 kubevirt]# kubectl get vmis
NAME AGE PHASE IP NODENAME READY
vm-dv 5m1s Running 10.100.223.30 base-k8s-worker-1.example.com True
[root@base-k8s-master-1 kubevirt]# virtctl pause vm vm-dv
VMI vm-dv was scheduled to pause
[root@base-k8s-master-1 kubevirt]# kubectl get vmis
NAME AGE PHASE IP NODENAME READY
vm-dv 5m8s Running 10.100.223.30 base-k8s-worker-1.example.com False
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 8m4s Paused False
[root@base-k8s-master-1 kubevirt]# kubectl get vmi vm-dv -o=jsonpath='{.status.conditions[?(@.type=="Paused")].message}{"\n"}'
VMI was paused by user
virtctl pause vmi vm-dv
也可以。
取消暂停
[root@base-k8s-master-1 kubevirt]# virtctl unpause vm vm-dv
VMI vm-dv was scheduled to unpause
[root@base-k8s-master-1 kubevirt]# kubectl get vmis
NAME AGE PHASE IP NODENAME READY
vm-dv 7m8s Running 10.100.223.30 base-k8s-worker-1.example.com True
[root@base-k8s-master-1 kubevirt]# kubectl get vm
NAME AGE STATUS READY
vm-dv 10m Running True
virtctl unpause vmi vm-dv
也可以。