为虚拟机配置高可用性政策

本文档介绍如何为使用 Anthos 虚拟机运行时运行的虚拟机 (VM) 配置高可用性政策。

如果启用 Anthos 虚拟机运行时,则集群会创建名为 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 的值更改为您选择的值:RescheduleIgnore。关闭文本编辑器。

替换虚拟机的默认恢复策略

默认恢复策略适用于集群中运行的所有虚拟机。但是,您可能需要替换个别虚拟机的默认恢复策略。

例如,假设您的大多数虚拟机都预配了基于网络文件的存储类别,但少数虚拟机预配了基于块的存储类别。对于使用基于块的存储的每个虚拟机,我们建议您通过将单个虚拟机的恢复策略设置为 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 对象进行修改。将 nodeHeartbeatIntervalnodeMonitorGracePeriod 设置为您选择的值。

spec:
  defaultRecoveryStrategy: Reschedule
  nodeHeartbeatInterval: 15s
  nodeMonitorGracePeriod: 1m30s