Configurar uma política de alta disponibilidade para VMs

Neste documento, mostramos como configurar a política de alta disponibilidade para máquinas virtuais (VMs) executadas com o ambiente de execução de VMs do Anthos.

Quando você ativa o Anthos VM Runtime, o cluster cria um objeto VMHighDisponibilidadePolicy chamado default. Esse objeto especifica a estratégia de recuperação padrão caso um nó de cluster que esteja executando uma VM falhe. As possíveis estratégias de recuperação padrão são:

  • Reprogramar: reprograme a VM em outro nó de cluster.
  • Ignorar: não faça nada.

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

Uma estratégia de recuperação padrão de Reschedule é apropriada na seguinte situação:

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

  • Os discos da VM são provisionados usando uma classe de armazenamento baseada em arquivos de rede. Ou seja, a classe de armazenamento é baseada em um sistema de arquivos de rede que coordena bloqueios de arquivos POSIX em clientes diferentes. O Sistema de arquivos de rede (NFS, na sigla em inglês) é um exemplo de classe de armazenamento baseada em arquivos de rede.

Se as VMs estiverem usando armazenamento local ou um sistema de armazenamento com base em blocos, recomendamos que você defina a estratégia de recuperação padrão como Ignore. Fazemos essa recomendação pelos seguintes motivos:

  • Se as VMs usarem armazenamento local e um nó falhar, não será possível recuperar os dados armazenados e movê-los para um novo nó.

  • Se as VMs usarem um sistema de armazenamento baseado em bloco, o armazenamento pode não ter garantias de remoção suficientes. Isso pode levar ao acesso simultâneo ao disco e à corrupção de dados durante a programação da VM.

Inspecionar o objeto VMHighDisponibilidadePolicy

Verifique se há um objeto VMHighDisponibilidadePolicy:

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

Substitua USER_CLUSTER_KUBECONFIG pelo caminho do arquivo kubeconfig do cluster de usuário.

A saída mostra que há um objeto VMHighDisponibilidadePolicy chamado default. Na saída, também é possível ver o valor atual de defaultRecoveryStrategy. Por exemplo, a saída a seguir mostra que o valor atual de defaultRecoveryStrategy é Reschedule:

vm-system   default   5m55s   Reschedule   15s   1m30s

Tenha uma visualização detalhada do objeto VMHighDisponibilidadePolicy:

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

Mudar a estratégia de recuperação padrão

Em determinadas situações, recomendamos que você altere a estratégia de recuperação padrão. Por exemplo, se as VMs estiverem usando armazenamento local ou um sistema de arquivos que não é baseado em arquivos de rede, recomendamos que você altere o valor de defaultRecoveryStrategy para Ignore.

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

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

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

Substituir a estratégia de recuperação padrão de uma VM

A estratégia de recuperação padrão se aplica a todas as VMs em execução no cluster. No entanto, talvez seja necessário substituir a estratégia de recuperação padrão de VMs individuais.

Por exemplo, suponha que a maioria das VMs seja provisionada com uma classe de armazenamento baseada em arquivos de rede, mas algumas VMs são provisionadas com uma classe de armazenamento baseada em blocos. Para cada VM que usa armazenamento baseado em bloco, recomendamos que você modifique a estratégia de recuperação padrão definindo a estratégia de recuperação de cada VM para Ignore.

Para substituir a estratégia de recuperação padrão 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 chamada 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 você quiser remover as anotações mais tarde, use um hífen no final do nome da anotação. 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 padrão, você pode configurar o seguinte:

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

  • Período de carência do monitor de nós: o tempo máximo que um nó pode falhar ao enviar um batimento cardíaco antes de ser considerado não íntegro.

Na maioria dos casos, os valores padrão para o intervalo de batimentos cardíacos e o período de carência são apropriados. No entanto, é possível ajustar esses valores se quiser ajustar a compensação entre a velocidade de recuperação e a sobrecarga. Um intervalo de frequência cardíaca menor encurta o tempo de recuperação, mas também aumenta a sobrecarga. Em um cluster grande, é possível aumentar o intervalo de batimentos cardíacos, porque os batimentos cardíacos frequentes de muitos nós podem criar uma carga inaceitável no servidor da API Kubernetes.

Mantenha o intervalo de batimentos cardíacos abaixo do período de carência para evitar casos em que um único batimento cardíaco perdido resulta em um nó não considerado íntegro.

Execute kubectl edit para abrir o objeto VMHighDisponibilidadePolicy para edição. Defina nodeHeartbeatInterval e nodeMonitorGracePeriod como valores de sua escolha.

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