跳转至

vmController

vmController

代码位于kubevirt/pkg/virt-controller/watch/vm.go文件中。

  1. 监听VM对象、VMI对象、DataVolume对象并添加对应的EventHandler
  2. 收到Event事件之后加入到workQueue。
    • VM对象的Event事件直接加入workQueue。
    • VMI对象的Event事件先判断是否由VM对象所控制,如果是则将该VM对象加入workQueue,否则找到匹配的VM,将匹配的VM加入到workQueue,尝试收养孤儿的VMI对象。
    • DataVolume对象的Event事件先判断是否由VM对象所控制,如果是则将该VM对象加入workQueue,否则不处理。
  3. 通过Run()->runWorker()->Execute()->execute(),从workQueue中取出对象的key,然后在execute中处理。
  4. execute() 函数的处理逻辑
    • 根据key,从Informer的本地缓存中获取VM对象。
    • 创建VirtualMachineControllerRefManager
    • 根据key,从Informer的本地缓存中获取VMI对象
    • 如果获取VMI对象成功,则VirtualMachineControllerRefManager尝试收养或遗弃VMI。
    • 根据Spec.DataVolumeTemplates,从Informer的本地缓存中获取dataVolumes。
    • 检查dataVolumes是否已经ready,若已经ready则调用startStop()
      • RunStrategy==Always:虚拟机实例VMI应该总是存在,如果虚拟机实例VMI crash,会创建一个新的虚拟机。等同于spec.running:true
      • RunStrategy==RerunOnFailure:如果虚拟机实例VMI运行失败,会创建一个新的虚拟机。如果是由客户端主动成功关闭,则不会再重新创建。
      • RunStrategy==Manual:虚拟机实例VMI运行状况通过start/stop/restart手工来控制。
      • RunStrategy==Halted:虚拟机实例VMI应该总是挂起。等同于spec.running:false
    • 更新VMStatus
      • 修改vm.Status.Createdvm.Status.Ready
      • 修改vm.Status.StateChangeRequests
      • 修改vm.Status.Conditions
      • 更新VMStatus

最后更新: 2023-08-15
创建日期: 2023-08-14

评论