1.状态枚举(参考0.51.0版本)
1.1 vm状态(源码枚举)
// VirtualMachineStatusStopped indicates that the virtual machine is currently stopped and isn't expected to start. VirtualMachineStatusStopped VirtualMachinePrintableStatus = "Stopped" // VirtualMachineStatusProvisioning indicates that cluster resources associated with the virtual machine // (e.g., DataVolumes) are being provisioned and prepared. VirtualMachineStatusProvisioning VirtualMachinePrintableStatus = "Provisioning" // VirtualMachineStatusStarting indicates that the virtual machine is being prepared for running. VirtualMachineStatusStarting VirtualMachinePrintableStatus = "Starting" // VirtualMachineStatusRunning indicates that the virtual machine is running. VirtualMachineStatusRunning VirtualMachinePrintableStatus = "Running" // VirtualMachineStatusPaused indicates that the virtual machine is paused. VirtualMachineStatusPaused VirtualMachinePrintableStatus = "Paused" // VirtualMachineStatusStopping indicates that the virtual machine is in the process of being stopped. VirtualMachineStatusStopping VirtualMachinePrintableStatus = "Stopping" // VirtualMachineStatusTerminating indicates that the virtual machine is in the process of deletion, // as well as its associated resources (VirtualMachineInstance, DataVolumes, …). VirtualMachineStatusTerminating VirtualMachinePrintableStatus = "Terminating" // VirtualMachineStatusCrashLoopBackOff indicates that the virtual machine is currently in a crash loop waiting to be retried. VirtualMachineStatusCrashLoopBackOff VirtualMachinePrintableStatus = "CrashLoopBackOff" // VirtualMachineStatusMigrating indicates that the virtual machine is in the process of being migrated // to another host. VirtualMachineStatusMigrating VirtualMachinePrintableStatus = "Migrating" // VirtualMachineStatusUnknown indicates that the state of the virtual machine could not be obtained, // typically due to an error in communicating with the host on which it's running. VirtualMachineStatusUnknown VirtualMachinePrintableStatus = "Unknown" // VirtualMachineStatusUnschedulable indicates that an error has occurred while scheduling the virtual machine, // e.g. due to unsatisfiable resource requests or unsatisfiable scheduling constraints. VirtualMachineStatusUnschedulable VirtualMachinePrintableStatus = "ErrorUnschedulable" // VirtualMachineStatusErrImagePull indicates that an error has occured while pulling an image for // a containerDisk VM volume. VirtualMachineStatusErrImagePull VirtualMachinePrintableStatus = "ErrImagePull" // VirtualMachineStatusImagePullBackOff indicates that an error has occured while pulling an image for // a containerDisk VM volume, and that kubelet is backing off before retrying. VirtualMachineStatusImagePullBackOff VirtualMachinePrintableStatus = "ImagePullBackOff" // VirtualMachineStatusPvcNotFound indicates that the virtual machine references a PVC volume which doesn't exist. VirtualMachineStatusPvcNotFound VirtualMachinePrintableStatus = "ErrorPvcNotFound" // VirtualMachineStatusDataVolumeNotFound indicates that the virtual machine references a DataVolume volume which doesn't exist. VirtualMachineStatusDataVolumeNotFound VirtualMachinePrintableStatus = "ErrorDataVolumeNotFound" // VirtualMachineStatusDataVolumeError indicates that an error has been reported by one of the DataVolumes // referenced by the virtual machines. VirtualMachineStatusDataVolumeError VirtualMachinePrintableStatus = "DataVolumeError" // VirtualMachineStatusWaitingForVolumeBinding indicates that some PersistentVolumeClaims backing // the virtual machine volume are still not bound. VirtualMachineStatusWaitingForVolumeBinding VirtualMachinePrintableStatus = "WaitingForVolumeBinding" |
1.2 vmi状态(源码枚举)
//When a VirtualMachineInstance Object is first initialized and no phase, or Pending is present. VmPhaseUnset VirtualMachineInstancePhase = "" // Pending means the VirtualMachineInstance has been accepted by the system. Pending VirtualMachineInstancePhase = "Pending" // A target Pod exists but is not yet scheduled and in running state. Scheduling VirtualMachineInstancePhase = "Scheduling" // A target pod was scheduled and the system saw that Pod in runnig state. // Here is where the responsibility of virt-controller ends and virt-handler takes over. Scheduled VirtualMachineInstancePhase = "Scheduled" // Running means the pod has been bound to a node and the VirtualMachineInstance is started. Running VirtualMachineInstancePhase = "Running" // Succeeded means that the VirtualMachineInstance stopped voluntarily, e.g. reacted to SIGTERM or shutdown was invoked from // inside the VirtualMachineInstance. Succeeded VirtualMachineInstancePhase = "Succeeded" // Failed means that the vmi crashed, disappeared unexpectedly or got deleted from the cluster before it was ever started. Failed VirtualMachineInstancePhase = "Failed" // Unknown means that for some reason the state of the VirtualMachineInstance could not be obtained, typically due // to an error in communicating with the host of the VirtualMachineInstance. Unknown VirtualMachineInstancePhase = "Unknown" |
2. vm/vmi各状态具体判断条件/转换操作
vm状态
|
判断条件
|
---|---|
CrashLoopBackOff |
1.开机失败 2.失败次数大于0 3.运行策略为一直在运行或者失败重试 |
Stopped |
1.vmi为关机或崩溃状态(Failed/Succeeded) |
Provisioning |
1.绑定了pvc的datavolumn没有准备好 |
WaitingForVolumeBinding |
1.pvc状态为未绑定 |
Starting |
1.vmi状态为Pending或者空 2.vmi状态为Scheduling 3.vmi状态为Scheduled |
Running | 1.vmi状态为Running |
Paused |
1.vmi状态为Running 2.vmi有Paused的condition,Paused一般为宿主机问题,例如存储空间不足等 |
Stopping |
1.vmi不为关机或崩溃状态(Failed/Succeeded) 2.vmi未被标记为删除或者期望删除 |
Terminating |
1.vm.ObjectMeta.DeletionTimestamp不为空 |
Migrating |
1.根据vmi.Status.MigrationState的开始和结束时间,判断现在状态是否在迁移中 |
ErrorUnschedulable |
1.vmi状态为Pending vmi的condition中的PodScheduled为false,且原因为Unschedulable,pod不可调度,原因包括资源不足或调度限制 |
ErrImagePull |
1.vmi状态为Scheduling vmi的condition中的Synchronized为false,且原因为ErrImagePull,拉镜像错误 |
ImagePullBackOff |
1.vmi状态为Scheduling vmi的condition中的Synchronized为false,且原因为ImagePullBackOff,拉镜像错误且重试前kubelet崩溃 |
ErrorPvcNotFound |
1.vmi状态为Pending vmi的condition中的Synchronized为false,且原因为 FailedPvcNotFound,无时间限制,vmi事件触发更新,按照队列进行更新 |
ErrorDataVolumeNotFound |
1.vmi状态为Pending vmi的condition中的Synchronized为false,且原因为 FailedDataVolumeNotFound,无时间限制,vmi事件触发更新,按照队列进行更新 |
DataVolumeError |
1.vmi状态为Pending 只要vm关联的dv有一个Status.Phase为Failed,或者dv的condition的Running为false |
vmi原始状态
|
判断条件
|
vmi状态转换/操作
|
---|---|---|
pending/空 | pod存在,且不为临时pod |
Scheduling |
vmi删除时间不为空/关联的dv有一个没有ready(Status.Phase为WaitForFirstConsumer) |
Failed |
|
关联有dv为ready状态,存在临时pod(annotation:kubevirt.io/ephemeral-provisioning不为空),且pod状态为failed/容器状态为Terminated/pod标记删除 | Failed | |
同步pod/dv信息及状态失败,且失败原因为pvcNotFound/
DataVolumeNotFound |
添加condition (PodReasonUnschedulable) | |
Scheduling |
查看镜像错误,失败原因为ErrImagePull/ImagePullBackOff 其他同步错误(pod QOs正常分配/热插拔准备成功/磁盘状态ok) |
Scheduling |
pod状态ready且未被标记删除,且无任何同步错误 |
Scheduled |
|
pod状态为failed/容器状态为Terminated/pod标记删除 | Failed | |
pod不存在/pod为临时pod | Failed | |
Failed/Succeeded |
清空所有关联pod | |
状态为Scheduled后由virt-handler接管将按照队列更新状态(每当有操作时将虚机放入队列) Scheduled |
无domain,无socket,无pod/vmi | 重新丢回队列 |
|
无domain,virt-launcher找不到,vmi状态一直停留 | Failed |
无domain,其余情况 |
Scheduled |
|
domain状态shutoff/crash | 原因为crash/panic | Failed |
原因为destroy且ACPI不可用 | Failed | |
原因为destroy且ACPI可用 |
Succeeded |
|
原因为shutdown/saved/fromSnapshot |
Succeeded |
|
原因为migrated | 保留原状态 | |
domain状态Running/Paused/Blocked/PMSuspended | Running |
3. 虚机各阶段状态管理与变化
虚拟机创建分为创建DataVolume和VMI两个流程:
1. 创建DataVolume后,CDI组件创建对应的PVC并且关联到合适的PV,然后通过临时Importer Pod拉取虚拟机容器镜像绑定到DataVolume生成的PV中,并且将镜像转换成disk.img文件存储在PV中供虚拟机使用。
2. 创建VMI后,等待disk.img转换成功,然后在对应的Node上启动Launcher Pod,并将CDI流程生成的PV挂载到Pod内,当做虚拟机启动的系统盘。Launcher根据VMI的定义生成定义虚拟机的XML文件,然后调用libvirt进程调用Qemu命令创建并且启动虚拟机。VMI会对Launcher Pod状态进行同步,反应VM运行的状态。