Configurar una política de alta disponibilidad para máquinas virtuales

En este documento se explica cómo configurar la política de alta disponibilidad de las máquinas virtuales que se ejecutan con el tiempo de ejecución de VM en GDC.

Cuando habilitas el entorno de ejecución de máquinas virtuales en GDC, el clúster crea un objeto VMHighAvailabilityPolicy llamado default. Este objeto especifica la estrategia de recuperación predeterminada en caso de que falle un nodo de clúster que esté ejecutando una máquina virtual. Las posibles estrategias de recuperación predeterminadas son las siguientes:

  • Reprogramar: reprograma la VM en otro nodo del clúster.
  • Ignorar: no hacer nada.

Inicialmente, la estrategia de recuperación predeterminada es Reschedule.

Una estrategia de recuperación predeterminada de Reschedule es adecuada en la siguiente situación:

  • Tu clúster tiene al menos dos nodos de trabajo.

  • Tus discos de VM se aprovisionan mediante una clase de almacenamiento basada en archivos de red. Es decir, la clase de almacenamiento se basa en un sistema de archivos de red que coordina los bloqueos de archivos POSIX en diferentes clientes. Sistema de archivos de red (NFS) es un ejemplo de clase de almacenamiento basada en archivos de red.

Si tus VMs usan almacenamiento local o un sistema de almacenamiento basado en bloques, te recomendamos que definas la estrategia de recuperación predeterminada como Ignore. Te hacemos esta recomendación por los siguientes motivos:

  • Si tus VMs usan almacenamiento local y falla un nodo, no hay forma de recuperar los datos almacenados y moverlos a un nuevo nodo.

  • Si tus VMs usan un sistema de almacenamiento basado en bloques, es posible que el almacenamiento no tenga suficientes garantías de separación. Esto podría provocar un acceso simultáneo al disco y daños en los datos durante la programación de la VM.

Inspeccionar el objeto VMHighAvailabilityPolicy

Verifica que haya un objeto VMHighAvailabilityPolicy:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get VMHighAvailabilityPolicy --namespace vm-system

Sustituye USER_CLUSTER_KUBECONFIG por la ruta del archivo kubeconfig de tu clúster de usuario.

El resultado muestra que hay un objeto VMHighAvailabilityPolicy llamado default. En el resultado, también puedes ver el valor actual de defaultRecoveryStrategy. Por ejemplo, el siguiente resultado muestra que el valor actual de defaultRecoveryStrategy es Reschedule:

vm-system   default   5m55s   Reschedule   15s   1m30s

Obtén una vista detallada del objeto VMHighAvailabilityPolicy:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG get VMHighAvailabilityPolicy \
    --namespace vm-system --output yaml

Ejemplo:

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

Cambiar la estrategia de recuperación predeterminada

En determinadas situaciones, te recomendamos que cambies la estrategia de recuperación predeterminada. Por ejemplo, si tus máquinas virtuales usan almacenamiento local o un sistema de archivos que no está basado en archivos de red, te recomendamos que cambies el valor de defaultRecoveryStrategy a Ignore.

Para cambiar el valor de defaultRecoveryStrategy, abre el objeto VMHighAvailabilityPolicy para editarlo:

kubectl --kubeconfig USER_CLUSTER_KUBECONFIG edit VMHighAvailabilityPolicy \
    default --namespace vm-system

En el editor de texto, cambia el valor de defaultRecoveryStrategy por el que quieras: Reschedule o Ignore. Cierra el editor de texto.

Anular la estrategia de recuperación predeterminada de una VM

La estrategia de recuperación predeterminada se aplica a todas las máquinas virtuales que se ejecutan en el clúster. Sin embargo, es posible que tengas que anular la estrategia de recuperación predeterminada de máquinas virtuales concretas.

Por ejemplo, supongamos que la mayoría de tus VMs se aprovisionan con una clase de almacenamiento basada en archivos de red, pero algunas VMs se aprovisionan con una clase de almacenamiento basada en bloques. En el caso de cada VM que utilice almacenamiento basado en bloques, le recomendamos que anule la estrategia de recuperación predeterminada y defina la estrategia de recuperación de la VM en cuestión como Ignore.

Para anular la estrategia de recuperación predeterminada de una VM, añade una anotación vm.cluster.gke.io/vm-ha-recovery-strategy tanto al objeto VirtualMachineInstance (VMI) como al objeto GVM.

Por ejemplo, estos comandos definen la estrategia de recuperación como Ignore para una máquina virtual llamada my-vm:

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

Si quieres quitar las anotaciones más adelante, usa un guion al final del nombre de la anotación. Por ejemplo:

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-

Configuración avanzada

Además de configurar la estrategia de recuperación predeterminada, puede configurar lo siguiente:

  • Intervalo de latido de nodo: el tiempo entre los latidos que envía cada nodo del clúster.

  • Periodo de gracia del monitor de nodos: cantidad máxima de tiempo durante el cual un nodo puede no enviar una señal de latido antes de considerarse no saludable.

En la mayoría de los casos, los valores predeterminados del intervalo de latido y del periodo de gracia son adecuados. Sin embargo, puedes ajustar estos valores si quieres afinar el equilibrio entre la velocidad de recuperación y la sobrecarga. Un intervalo de latido más corto reducirá el tiempo de recuperación, pero también aumentará la sobrecarga. En un clúster grande, puedes alargar el intervalo de latido, ya que los latidos frecuentes de muchos nodos podrían crear una carga inaceptable en el servidor de la API de Kubernetes.

Mantén el intervalo de latidos inferior al periodo de gracia para evitar que se considere que un nodo no está en buen estado si se pierde un solo latido.

Ejecuta kubectl edit para abrir el objeto VMHighAvailabilityPolicy y editarlo. Asigna a nodeHeartbeatInterval y nodeMonitorGracePeriod los valores que quieras.

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