跳转至

Readme

VirtualMachine 的运行策略

Kubevirt中,VirtualMachine有一个名为running的设置,由它来决定虚拟机(guest OS)是否应该运行。当spec.running设置为true时,KubeVirt将确保对应的VirtualMachineInstance永远保持运行状态。 然而,仅依赖于一个布尔值并不足以完整描述所有期望的行为场景。例如,在某些情况下,用户可能希望能够在虚拟机内部来关闭系统。 如果此时spec.running设置为true,则无论用户从虚拟机内部如何操作,KubeVirt都会立即重启该VirtualMachineInstance,导致无法按照用户的意愿停止虚拟机的运行。

运行策略(RunStrategy)

为了允许用户状态有更多样化的设置,KubeVirt引入了spec.runStrategy字段。spec.runStrategyspec.running是互斥的,因为它们在某些情况下可能会重叠。目前spec.runStrategy支持四种不同的运行策略:

  • Always:表示始终会让vm处于运行状态,即使虚拟机(VMI)崩溃也会尝试重新启动,这与spec.running: true的行为相同。 表现形态:创建vm时就会自动运行,即便从 guest OS内部关闭vm,当检测到vm处于stopped状态时,会重新再次运行该vm。如需关闭,必须使用virtctl stop vm命令,这样runStrategy值会变成Halted
  • RerunOnFailure: 如果vm因为某个错误失败,则会尝试重新运行vm 。但如果是从guest OS内部关闭vm,则不会自动重新运行该vm。
  • Manual:完全由用户手动控制vm的启动、停止、重启。即创建vm时,需要手动执行virtctl start/restart/stop vm让vm处于启动/重启/停止状态。从 guest OS内部关闭vm后不会自动重新运行该vm。
  • Halted:停止,如果vm正在运行,当修改spec.runStrategy的值为Halted时,vm会被关闭,这同spec.running: false

注意 runStrategyrunning字段同时配置会产生冲突。当API服务器发现VirtualMachine资源同时定义了这两个字段时,将会拒绝接受该资源。 即在创建或更新VirtualMachine资源时,只能选择使用runStrategy或者设置running字段,而不能同时设置两者。

执行virtctl 命令的startstoprestart 方法会修改runStrategy的值,具体可参考下表:

runStrategy start stop restart
Always - Halted Always
RerunOnFailure - Halted RerunOnFailure
Manual Manual Manual Manual
Halted Always - -

runStrategy的值为RerunOnFailure时,执行virtctl stop命令将会修改runStrategy的值为Halted;从虚拟机内部关闭虚拟机,并不会改变runStrategy的值,即仍然为RerunOnFailure

runStrategy的值为Halted时,执行virtctl start命令将会修改runStrategy的值为Always

注意 表格中被标记为-的条目表示其含义不明确或与运行策略(RunStrategy)无关,因此不会对虚拟机实例的runStrategy产生任何影响。这意味着在配置VirtualMachine时,这些设置将被忽略,或者至少不会改变虚拟机基于选定runStrategy的启动、停止和重启行为。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-ubuntu01-bootdisk
  namespace: default
spec:
  storageClassName: "ceph-hdd-block"
  volumeMode: Block
  accessModes:
    - ReadWriteMany
  dataSource:
    kind: PersistentVolumeClaim
    name: img-ubuntu2204
  resources:
    requests:
      storage: 10Gi
---
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: vm-ubuntu01
spec:
  instancetype:
    kind: VirtualMachineInstancetype
    name: p1-1
  #running: true
  #runStrategy: Always
  runStrategy: Halted
  template:
    metadata:
      labels:
        kubevirt.io/domain: vm-ubuntu01
    spec:
      architecture: amd64
      domain:
        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-ubuntu01-bootdisk
      - name: cloudinitdisk
        cloudInitConfigDrive:
          userData: |-
            #cloud-config
            hostname: vm-ubuntu01
            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