虚拟机生命周期
虚拟机生命周期管理¶
在
Kubevirt中,每一个VMI代表一个独立的虚拟机实例。VMI的管理方式与k8s的Pod类似。集群中定义的所有虚拟机都期望处于运行状态,就像Pod一样,这就意味着一旦创建了VMI,Kubevirt将尽力保证其处于运行状态。
Kubevirt有了VirtualMachineInstance为什么还要有VirtualMachine ?
首先,在
KubeVirt中,VirtualMachine和VirtualMachineInstance可以理解为是一种父子关系。VirtualMachine定义了虚拟机规范的对象,描述了虚拟机的配置、镜像、存储、网络等信息,类似于虚拟机的模板。 而VirtualMachineInstance则是VirtualMachine的实例,它代表了实际运行的虚拟机。其次,
VirtualMachine和VirtualMachineInstance关注的层面不同。VirtualMachine是静态的,描述了虚拟机的规范和配置属性;而VirtualMachineInstance则关注的实际运行的虚拟机, 它是动态的,包括了虚拟机的状态、运行时信息等。VirtualMachine类似于k8s中Deployment或StatefulSet。 因此,通过将虚拟机的定义和实例分开,KubeVirt可以更好地管理虚拟机的生命周期。
虚拟机实例的生命周期是怎么管理的?
在每个虚拟机实例中,会有一个virt-launcher Pod负责管理虚拟机的运行状态。virt-launcher Pod是由kubevirt自动去创建的,Pod里面运行了一些必要的组件和资源,如QEMU、libvirtd进程等。 虚拟机实例与virt-launcher Pod之间是一对一的关系。virt-launcher Pod负责启动和管理虚拟机实例的运行,包括与宿主机之间的资源交互、虚拟机的生命周期(包括启动、停止、监控等)管理等。
如果我们在创建虚拟机时,只创建VirtualMachineInstance(VMI),而没有定义VirtualMachine(VM),结果会怎么样呢?
当VMI所在的节点故障时,VMI对应的virt-launcher Pod在最后被驱逐并删除掉(或者因为存储原因,会一直处于
Terminating状态,VMI会变成Failed状态),VMI也会被删除或一直处于Failed,VMI无法再达到运行状态。
- 启动虚拟机实例
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: pvc-centos01-bootdisk namespace: default spec: storageClassName: "ceph-hdd-block" volumeMode: Block accessModes: - ReadWriteMany dataSource: kind: PersistentVolumeClaim name: img-centos7 resources: requests: storage: 10Gi --- apiVersion: kubevirt.io/v1 kind: VirtualMachineInstance metadata: name: vmi-centos01 namespace: default spec: domain: cpu: cores: 1 model: host-passthrough memory: guest: 1Gi devices: disks: - disk: bus: virtio name: root-disk - disk: bus: virtio name: cloudinitdisk rng: {} interfaces: - name: default masquerade: {} resources: requests: memory: 2Gi networks: - name: default pod: {} terminationGracePeriodSeconds: 0 volumes: - name: root-disk persistentVolumeClaim: claimName: pvc-centos01-bootdisk - name: cloudinitdisk cloudInitConfigDrive: userData: |- #cloud-config hostname: vm-centos01 ssh_pwauth: True disable_root: False timezone: Asia/Shanghai password: 123456 chpasswd: {"list":"root:12345678",expire: False} runcmd: - setenforce 0 - sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config - sed -i "/PermitRootLogin/s/^.*$/PermitRootLogin yes/g" /etc/ssh/sshd_config - systemctl restart sshd.service - 列出虚拟机
- 检索虚拟机实例定义
- 停止虚拟机
VMI是实际运行的虚拟机实例实体,它直接消耗集群中的计算、内存和存储等资源。只要VMI在集群中被定义并创建成功,它就会始终处于运行状态,并持续占用资源,除非它被明确地删除或者由于
VirtualMachine的运行策略而被停止,所以在管理VM时,我们通常是定义VirtualMachine。apiVersion: kubevirt.io/v1 kind: VirtualMachine metadata: name: vm-centos01 spec: runStrategy: RerunOnFailure template: metadata: labels: kubevirt.io/domain: vm-centos01 spec: architecture: amd64 domain: cpu: cores: 1 model: host-passthrough memory: guest: 1Gi devices: disks: - disk: bus: virtio name: root-disk - disk: bus: virtio name: cloudinitdisk rng: {} interfaces: - name: default masquerade: {} networks: - name: default pod: {} terminationGracePeriodSeconds: 0 volumes: - name: root-disk persistentVolumeClaim: claimName: pvc-centos01-bootdisk - name: cloudinitdisk cloudInitConfigDrive: userData: |- #cloud-config hostname: vm-centos01 ssh_pwauth: True disable_root: False timezone: Asia/Shanghai password: 123456 chpasswd: {"list":"root:12345678",expire: False} bootcmd: - setenforce 0 - sed -i 's/^SELINUX=enforcing$/SELINUX=disabled/' /etc/selinux/config runcmd: - sed -i "/PermitRootLogin/s/^.*$/PermitRootLogin yes/g" /etc/ssh/sshd_config - systemctl restart sshd.service #- echo root:12345678 |chpasswd - 启动或停止虚拟机
- 重启虚拟机
- 暂停和取消暂停虚拟机