跳转至

虚拟机生命周期

虚拟机生命周期管理

Kubevirt中,每一个VMI代表一个独立的虚拟机实例。VMI的管理方式与k8s的Pod类似。集群中定义的所有虚拟机都期望处于运行状态,就像Pod一样,这就意味着一旦创建了VMI,Kubevirt将尽力保证其处于运行状态。

Kubevirt有了VirtualMachineInstance为什么还要有VirtualMachine ?

首先,在KubeVirt中,VirtualMachineVirtualMachineInstance 可以理解为是一种父子关系。VirtualMachine定义了虚拟机规范的对象,描述了虚拟机的配置、镜像、存储、网络等信息,类似于虚拟机的模板。 而VirtualMachineInstance 则是VirtualMachine的实例,它代表了实际运行的虚拟机。

其次,VirtualMachineVirtualMachineInstance 关注的层面不同。VirtualMachine是静态的,描述了虚拟机的规范和配置属性;而VirtualMachineInstance则关注的实际运行的虚拟机, 它是动态的,包括了虚拟机的状态、运行时信息等。VirtualMachine类似于k8s中DeploymentStatefulSet。 因此,通过将虚拟机的定义和实例分开,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
    
    # kubectl create -f vmi.yaml
    
  • 列出虚拟机
    # kubectl get vmis 
    
  • 检索虚拟机实例定义
    # kubectl get vmis vm_name
    
  • 停止虚拟机
    # kubectl delete -f vmi.yaml
    

    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
    

  • 启动或停止虚拟机
    # virtctl start vm_name
    # virtctl stop vm_name
    # 强制停止虚拟机
    # virtctl stop vm_name --grace-period=0 --force
    
  • 重启虚拟机
    ## vmi 会被删除并重新创建
    virtctl restart vm-centos01
    
  • 暂停和取消暂停虚拟机
    # 暂停虚拟机
    # virtctl pause vm vm_name
    
    # 取消暂停虚拟机
    # virtctl unpause vm vm_name