Configure uma política de alta disponibilidade para VMs

Este documento mostra como configurar a política de alta disponibilidade para máquinas virtuais (VMs) executadas com o tempo de execução de VMs no GDC.

Quando ativa o tempo de execução de VMs no GDC, o cluster cria um objeto VMHighAvailabilityPolicy denominado default. Este objeto especifica a estratégia de recuperação predefinida caso ocorra uma falha num nó do cluster que esteja a executar uma VM. As estratégias de recuperação predefinidas possíveis são:

  • Reagendar: reagende a VM noutro nó do cluster.
  • Ignorar: não fazer nada.

Inicialmente, a estratégia de recuperação predefinida está definida como Reschedule.

Uma estratégia de recuperação predefinida de Reschedule é adequada na seguinte situação:

  • O cluster tem, pelo menos, dois nós de trabalho.

  • Os discos da VM são aprovisionados através de uma classe de armazenamento baseada em ficheiros de rede. Isto é, a classe de armazenamento baseia-se num sistema de ficheiros de rede que coordena os bloqueios de ficheiros POSIX em diferentes clientes. O Sistema de Arquivos de Rede (NFS) é um exemplo de uma classe de armazenamento baseada em ficheiros de rede.

Se as suas VMs estiverem a usar armazenamento local ou um sistema de armazenamento baseado em blocos, recomendamos que defina a estratégia de recuperação predefinida como Ignore. Fazemos esta recomendação pelos seguintes motivos:

  • Se as suas VMs usarem armazenamento local e um nó falhar, não existe forma de recuperar os dados armazenados e movê-los para um novo nó.

  • Se as suas VMs usarem um sistema de armazenamento baseado em blocos, o armazenamento pode não ter garantias de desanexação suficientes. Isso pode levar a acesso simultâneo ao disco e danos nos dados durante o agendamento de VMs.

Inspeccione o objeto VMHighAvailabilityPolicy

Verifique se existe um objeto VMHighAvailabilityPolicy:

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

Substitua USER_CLUSTER_KUBECONFIG pelo caminho do ficheiro kubeconfig do cluster de utilizadores.

O resultado mostra que existe um objeto VMHighAvailabilityPolicy com o nome default. No resultado, também pode ver o valor atual de defaultRecoveryStrategy. Por exemplo, a saída seguinte mostra que o valor atual de defaultRecoveryStrategy é Reschedule:

vm-system   default   5m55s   Reschedule   15s   1m30s

Obtenha uma vista detalhada do objeto VMHighAvailabilityPolicy:

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

Exemplo de saída:

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

Altere a estratégia de recuperação predefinida

Em determinadas situações, recomendamos que altere a estratégia de recuperação predefinida. Por exemplo, se as suas VMs estiverem a usar armazenamento local ou um sistema de ficheiros que não seja baseado em ficheiros de rede, recomendamos que altere o valor de defaultRecoveryStrategy para Ignore.

Para alterar o valor de defaultRecoveryStrategy, abra o objeto VMHighAvailabilityPolicy para edição:

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

No editor de texto, altere o valor de defaultRecoveryStrategy para um valor à sua escolha: Reschedule ou Ignore. Feche o editor de texto.

Substitua a estratégia de recuperação predefinida de uma VM

A estratégia de recuperação predefinida aplica-se a todas as VMs em execução no cluster. No entanto, pode ter de substituir a estratégia de recuperação predefinida para VMs individuais.

Por exemplo, suponha que a maioria das suas VMs é aprovisionada com uma classe de armazenamento baseada em ficheiros de rede, mas algumas VMs são aprovisionadas com uma classe de armazenamento baseada em blocos. Para cada VM que use armazenamento baseado em blocos, recomendamos que substitua a estratégia de recuperação predefinida definindo a estratégia de recuperação para a VM individual como Ignore.

Para substituir a estratégia de recuperação predefinida de uma VM, adicione uma anotação vm.cluster.gke.io/vm-ha-recovery-strategy ao objeto VirtualMachineInstance (VMI) e ao objeto GVM.

Por exemplo, estes comandos definem a estratégia de recuperação como Ignore para uma VM com o nome 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 quiser remover as anotações mais tarde, use um hífen no final do nome da anotação. Por exemplo:

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-

Configuração avançada

Além de configurar a estratégia de recuperação predefinida, pode configurar o seguinte:

  • Intervalo de batimentos cardíacos do nó: o tempo entre os batimentos cardíacos enviados por cada nó do cluster

  • Período de tolerância do monitor de nós: o período máximo durante o qual um nó pode não enviar um sinal de pulsação antes de ser considerado não saudável

Na maioria dos casos, os valores predefinidos para o intervalo de sinal de pulsação e o período de tolerância são adequados. No entanto, pode optar por ajustar estes valores se quiser ajustar a troca entre a velocidade de recuperação e a sobrecarga. Um intervalo de pulsação mais curto reduz o tempo de recuperação, mas também aumenta a sobrecarga. Num cluster grande, pode optar por aumentar o intervalo de pulsação, porque as pulsações frequentes de muitos nós podem criar uma carga inaceitável no servidor da API Kubernetes.

Mantenha o intervalo de pulsação inferior ao período de tolerância para evitar casos em que uma única pulsação em falta faz com que um nó seja considerado danificado.

Execute kubectl edit para abrir o objeto VMHighAvailabilityPolicy para edição. Defina nodeHeartbeatInterval e nodeMonitorGracePeriod para os valores da sua escolha.

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