Readme
VirtualMachine 的运行策略¶
在
Kubevirt中,VirtualMachine有一个名为running的设置,由它来决定虚拟机(guest OS)是否应该运行。当spec.running设置为true时,KubeVirt将确保对应的VirtualMachineInstance永远保持运行状态。 然而,仅依赖于一个布尔值并不足以完整描述所有期望的行为场景。例如,在某些情况下,用户可能希望能够在虚拟机内部来关闭系统。 如果此时spec.running设置为true,则无论用户从虚拟机内部如何操作,KubeVirt都会立即重启该VirtualMachineInstance,导致无法按照用户的意愿停止虚拟机的运行。
运行策略(RunStrategy)¶
为了允许用户状态有更多样化的设置,
KubeVirt引入了spec.runStrategy字段。spec.runStrategy与spec.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。
注意 runStrategy和running字段同时配置会产生冲突。当API服务器发现VirtualMachine资源同时定义了这两个字段时,将会拒绝接受该资源。
即在创建或更新VirtualMachine资源时,只能选择使用runStrategy或者设置running字段,而不能同时设置两者。
执行virtctl 命令的start、stop、restart 方法会修改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