Configura un criterio ad alta disponibilità per le VM

Questo documento mostra come configurare il criterio di alta disponibilità per le macchine virtuali (VM) in esecuzione utilizzando VM Runtime su Google Distributed Cloud.

Quando abiliti VM Runtime su Google Distributed Cloud, il cluster crea un oggetto VMHighAvailabilityPolicy denominato default. Questo oggetto specifica la strategia di recupero predefinita in caso di errore di un nodo cluster che esegue una VM. Le possibili strategie di ripristino predefinite sono:

  • Ripianifica: ripianifica la VM su un altro nodo del cluster.
  • Ignora: non fare nulla.

Inizialmente, la strategia di recupero predefinita è impostata su Reschedule.

Una strategia di recupero predefinita di Reschedule è appropriata nella seguente situazione:

  • Il cluster ha almeno due nodi worker.

  • Il provisioning dei dischi VM viene eseguito utilizzando una classe di archiviazione basata su file di rete. In altre parole, la classe di archiviazione si basa su un file system di rete che coordina i blocchi dei file POSIX in diversi client. Network File System (NFS) è un esempio di classe di archiviazione basata su file di rete.

Se le tue VM utilizzano lo spazio di archiviazione locale o un sistema di archiviazione a blocchi, ti consigliamo di impostare la strategia di recupero predefinita su Ignore. Ti suggeriamo questo consiglio per i seguenti motivi:

  • Se le VM utilizzano l'archiviazione locale e un nodo si guasta, non hai modo di recuperare i dati archiviati e spostarli in un nuovo nodo.

  • Se le VM utilizzano un sistema di archiviazione basato su blocchi, lo spazio di archiviazione potrebbe non avere garanzie di scollegamento sufficienti. Ciò potrebbe causare l'accesso simultaneo al disco e il danneggiamento dei dati durante la pianificazione delle VM.

Ispeziona l'oggetto VMHighAvailabilityPolicy

Verifica che esista un oggetto VMHighAvailabilityPolicy:

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

Sostituisci USER_CLUSTER_KUBECONFIG con il percorso del file kubeconfig del cluster utente.

L'output mostra che esiste un oggetto VMHighAvailabilityPolicy denominato default. Nell'output puoi anche vedere il valore attuale di defaultRecoveryStrategy. Ad esempio, l'output seguente mostra che il valore corrente di defaultRecoveryStrategy è Reschedule:

vm-system   default   5m55s   Reschedule   15s   1m30s

Ottieni una visualizzazione dettagliata dell'oggetto VMHighAvailabilityPolicy:

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

Output di esempio:

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

Cambiare la strategia di recupero predefinita

In determinate situazioni, ti consigliamo di modificare la strategia di recupero predefinita. Ad esempio, se le VM utilizzano l'archiviazione locale o un file system non basato su file di rete, ti consigliamo di modificare il valore di defaultRecoveryStrategy in Ignore.

Per modificare il valore di defaultRecoveryStrategy, apri l'oggetto VMHighAvailabilityPolicy per la modifica:

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

Nell'editor di testo, modifica il valore di defaultRecoveryStrategy in un valore a tua scelta: Reschedule o Ignore. Chiudi l'editor di testo.

Esegui l'override della strategia di recupero predefinita per una VM

La strategia di recupero predefinita si applica a tutte le VM in esecuzione nel cluster. Tuttavia, potrebbe essere necessario eseguire l'override della strategia di ripristino predefinita per le singole VM.

Ad esempio, supponiamo che per la maggior parte delle VM sia stato eseguito il provisioning con una classe di archiviazione basata su file di rete e che per alcune VM sia stato eseguito il provisioning di una classe di archiviazione basata su blocchi. Per ogni VM che utilizza l'archiviazione basata su blocchi, ti consigliamo di sostituire la strategia di ripristino predefinita impostando la strategia di ripristino per la singola VM su Ignore.

Per eseguire l'override della strategia di recupero predefinita per una VM, aggiungi un'annotazione vm.cluster.gke.io/vm-ha-recovery-strategy sia all'oggetto VirtualMachineInstance (VMI) sia all'oggetto GVM.

Ad esempio, questi comandi impostano la strategia di recupero su Ignore per una VM denominata 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

Se vorrai rimuovere le annotazioni in un secondo momento, utilizza un trattino alla fine del nome dell'annotazione. Ad esempio:

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-

Configurazione avanzata

Oltre a configurare la strategia di recupero predefinita, puoi configurare quanto segue:

  • Intervallo heartbeat dei nodi: il tempo tra i battiti cardiaci inviati da ciascun nodo del cluster.

  • Periodo di tolleranza per il monitoraggio dei nodi: il periodo di tempo massimo durante il quale un nodo può non inviare un heartbeat prima che sia considerato non integro

Nella maggior parte dei casi, i valori predefiniti per l'intervallo di battito cardiaco e il periodo di tolleranza sono appropriati. Tuttavia, puoi scegliere di regolare questi valori se vuoi perfezionare il compromesso tra velocità di ripristino e overhead. Un intervallo del battito cardiaco più breve accorcia il tempo di recupero, ma aumenta anche l'overhead. In un cluster di grandi dimensioni, potresti scegliere di allungare l'intervallo di heartbeat, poiché battiti cardiaci frequenti provenienti da molti nodi potrebbero creare un carico inaccettabile sul server dell'API Kubernetes.

Mantieni l'intervallo di battito cardiaco inferiore al periodo di tolleranza per evitare i casi in cui un singolo battito cardiaco perso determina lo stato non integro di un nodo.

Esegui kubectl edit per aprire l'oggetto VMHighAvailabilityPolicy per la modifica. Imposta nodeHeartbeatInterval e nodeMonitorGracePeriod sui valori che preferisci.

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