本文档介绍如何为在 GDC 上使用虚拟机运行时运行的虚拟机 (VM) 配置高可用性政策。
在 GDC 上启用虚拟机运行时时,集群会创建一个名为 default
的 VMHighAvailabilityPolicy 对象。此对象指定运行虚拟机的集群节点发生故障时的默认恢复策略。可能的默认恢复策略包括:
- 重新安排:在另一个集群节点上重新安排虚拟机。
- 忽略:不执行任何操作。
最初,默认恢复策略设置为 Reschedule
。
默认恢复策略 Reschedule
适用于以下情况:
集群至少有两个工作器节点。
虚拟机磁盘使用基于网络文件的存储类别进行预配。也就是说,存储类别基于协调跨不同客户端的 POSIX 文件锁的网络文件系统。网络文件系统 (NFS) 是一个基于网络文件的存储类别示例。
如果虚拟机使用本地存储或基于块的存储系统,我们建议您将默认恢复策略设置为 Ignore
。我们给出此建议的原因如下:
如果虚拟机使用本地存储,并且节点发生故障,则无法恢复存储的数据,也无法将其移动到新节点。
如果虚拟机使用基于块的存储系统,则存储可能无法保证充分的分离。这可能会导致在虚拟机调度期间出现并发磁盘访问和数据损坏。
检查 VMHighAvailabilityPolicy 对象
验证是否存在 VMHighAvailabilityPolicy 对象:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get VMHighAvailabilityPolicy --namespace vm-system
将 USER_CLUSTER_KUBECONFIG 替换为用户集群 kubeconfig 文件的路径。
输出显示有一个名为 default
的 VMHighAvailabilityPolicy 对象。在输出中,您还可以查看 defaultRecoveryStrategy
的当前值。例如,以下输出显示 defaultRecoveryStrategy
的当前值为 Reschedule
:
vm-system default 5m55s Reschedule 15s 1m30s
获取 VMHighAvailabilityPolicy 对象的详细视图:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get VMHighAvailabilityPolicy \ --namespace vm-system --output yaml
输出示例:
apiVersion: vm.cluster.gke.io/v1alpha1 kind: VMHighAvailabilityPolicy metadata: ... labels: app.kubernetes.io/component: kubevirt app.kubernetes.io/managed-by: virt-operator kubevirt.io: virt-api name: default namespace: vm-system .. spec: defaultRecoveryStrategy: Reschedule nodeHeartbeatInterval: 15s nodeMonitorGracePeriod: 1m30s
更改默认恢复策略
在某些情况下,我们建议您更改默认恢复策略。例如,如果您的虚拟机使用本地存储或不是基于网络文件的文件系统,则我们建议您将 defaultRecoveryStrategy
的值更改为 Ignore
。
如需更改 defaultRecoveryStrategy
的值,请打开 VMHighAvailabilityPolicy 对象进行修改:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG edit VMHighAvailabilityPolicy \ default --namespace vm-system
在文本编辑器中,将 defaultRecoveryStrategy
的值更改为您选择的值:Reschedule
或 Ignore
。关闭文本编辑器。
替换虚拟机的默认恢复策略
默认恢复策略适用于集群中运行的所有虚拟机。但是,您可能需要替换个别虚拟机的默认恢复策略。
例如,假设您的大多数虚拟机都预配了基于网络文件的存储类别,但少数虚拟机预配了基于块的存储类别。对于使用基于块的存储的每个虚拟机,我们建议您通过将单个虚拟机的恢复策略设置为 Ignore
来替换默认恢复策略。
如需替换虚拟机的默认恢复策略,请将 vm.cluster.gke.io/vm-ha-recovery-strategy
注解添加到 VirtualMachineInstance (VMI) 对象和 GVM 对象。
例如,以下命令会将名为 my-vm
的虚拟机的恢复策略设置为 Ignore
:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ annotate vmi my-vm \ vm.cluster.gke.io/vm-ha-recovery-strategy=Ignore --overwrite kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ annotate gvm my-vm \ vm.cluster.gke.io/vm-ha-recovery-strategy=Ignore --overwrite
如果要稍后移除注解,请在注解名称的末尾使用连字符。例如:
kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ annotate vmi my-vm \ vm.cluster.gke.io/vm-ha-recovery-strategy- kubectl --kubeconfig USER_CLUSTER_KUBECONFIG \ annotate gvm my-vm \ vm.cluster.gke.io/vm-ha-recovery-strategy-
高级配置
除了配置默认恢复策略外,您还可以进行以下配置:
节点检测信号间隔:每个集群节点发送的检测信号之间的时间
节点监控宽限期:节点在被视为健康状况不佳之前无法发送检测信号的最长时间
在大多数情况下,检测信号间隔和宽限期的默认值都是合适的。但是,如果您想微调恢复速度与开销之间的权衡,则可以选择调整这些值。较短的检测信号间隔将缩短恢复时间,但也会增加开销。 在大型集群中,您可能会选择延长检测信号间隔,因为来自许多节点的频繁检测信号可能会在 Kubernetes API 服务器上产生不可接受的负载。
保持检测信号间隔短于宽限期,以避免单个错过的检测信号导致节点被视为运行状况不佳。
运行 kubectl edit
以打开 VMHighAvailabilityPolicy 对象进行修改。将 nodeHeartbeatInterval
和 nodeMonitorGracePeriod
设置为您选择的值。
spec: defaultRecoveryStrategy: Reschedule nodeHeartbeatInterval: 15s nodeMonitorGracePeriod: 1m30s