Usar Máquinas Virtuais de Spot do Azure em um cluster ARO (Red Hat OpenShift no Azure)

Este artigo fornece os detalhes necessários para configurar seu cluster ARO (Red Hat OpenShift no Azure) para usar Máquinas Virtuais de Spot do Azure.

O uso deMáquinas Virtuais de Spotpermite aproveitar vantagem da capacidade não usada com uma economia de custos significativa. A qualquer momento que o Azure precisar da capacidade de volta, a infraestrutura do Azure removerá as Máquinas Virtuais de Spot do Azure. Para obter mais informações sobre Instâncias Spot, confira Máquinas Virtuais de Spot.

Antes de começar

Antes de começar, verifique se você tem um cluster Red Hat Openshift do Azure implantado. Se você precisar de um cluster ARO, consulte o Início rápido do ARO para um cluster público ou o tutorial de cluster privado para um cluster privado. As etapas de configuração do cluster para usar VMs Spot são iguais para clusters públicos e privados.

Um cluster ARO deve sempre ter pelo menos três nós de trabalho que não sejam VMs Spot e três nós de controle. Um cluster ARO não pode ter nós de controle baseados em VMs spot.

Adicionar VMs Spot

O gerenciamento de máquinas no Red Hat Openshift do Azure é realizado usando o MachineSet. Os recursos MachineSet são grupos de computadores. MachineSets estão para computadores assim como ReplicaSets estão para pods. Se você precisar de mais computadores ou redimensioná-los, altere o campo Réplicas no computador definido para atender à sua necessidade de computação. Para saber mais, confira nossa documentação do OpenShift MachineSet

O uso de VMs Spot é especificado pela adição do campo spotVMOptions na especificação de modelo de um MachineSet. Para que este MachineSet seja criado, nós iremos:

  1. Obter uma cópia de um MachineSet em execução no cluster.
  2. Criar uma configuração MachineSet modificada.
  3. Implantar este MachineSet em seu cluster

Primeiro, conecte-se ao cluster do OpenShift usando a CLI.

oc login $apiServer -u kubeadmin -p <kubeadmin password>

Em seguida, você listará os MachineSets no cluster. Um cluster padrão terá 3 MachineSets implantados:

oc get machinesets -n openshift-machine-api

Veja o seguinte exemplo de saída deste comando:

NAME                                    DESIRED   CURRENT   READY   AVAILABLE   AGE
aro-cluster-5t2dj-worker-eastus1   1         1         1       1           2d22h
aro-cluster-5t2dj-worker-eastus2   1         1         1       1           2d22h
aro-cluster-5t2dj-worker-eastus3   1         1         1       1           2d22h

Depois você descreverá o MachineSet implantado. Substitua o <conjunto de computadores> por um dos MachineSets listados acima e gere-o para um arquivo.

oc get machineset <machineset> -n openshift-machine-api -o yaml > spotmachineset.yaml

Você precisará alterar os seguintes parâmetros no MachineSet:

  • metadata.name
  • spec.selector.matchLabels.machine.openshift.io/cluster-api-machineset
  • spec.template.metadata.labels.machine.openshift.io/cluster-api-machineset
  • spec.template.spec.providerSpec.value.spotVMOptions (Adicione esse campo e defina-o como {}.)

Veja abaixo um exemplo resumido de YAML do Spot MachineSet que realça as principais alterações que você precisa fazer ao basear um novo Spot MachineSet em um MachineSet de trabalho existente, incluindo algumas informações adicionais para o contexto. (O exemplo não representa um MachineSet completo e funcional; muitos campos foram omitidos abaixo).

apiVersion: machine.openshift.io/v1beta1
kind: MachineSet
metadata:
  name: aro-cluster-abcd1-spot-eastus
spec:
  replicas: 2
  selector:
    matchLabels:
      machine.openshift.io/cluster-api-cluster: aro-cluster-abcd1
      machine.openshift.io/cluster-api-machineset: aro-cluster-abcd1-spot-eastus
  template:
    metadata:
        machine.openshift.io/cluster-api-machineset: aro-cluster-abcd1-spot-eastus
    spec:
      providerSpec:
        value:
          spotVMOptions: {}
      taints:
        - effect: NoExecute
          key: spot
          value: 'true'

Depois que o arquivo for atualizado, aplique-o.

oc create -f spotmachineset.yaml

Para validar que o seu MachineSet foi criado com êxito, execute o seguinte comando:

oc get machinesets -n openshift-machine-api

Aqui está um exemplo de saída. O seu Machineset estará pronto assim que você tiver computadores no estado "Pronto".

  NAME                                    DESIRED   CURRENT   READY   AVAILABLE   AGE
aro-cluster-5t2dj-worker-eastus1           1         1         1       1           3d1h
aro-cluster-5t2dj-worker-eastus2           1         1         1       1           3d1h
aro-cluster-5t2dj-worker-eastus3           1         1         1       1           3d1h
spot                                       1         1         1       1           2m47s

Agendar cargas de trabalho interrompíveis

Recomenda-se adicionar uma mancha aos nós Spot para evitar que nós não ininterruptos sejam agendados neles e adicionar tolerâncias desse taint a todos os pods que você quer que sejam agendados neles. Você pode colocar taint nos nós por meio da especificação do MachineSet.

Por exemplo, você pode adicionar o seguinte YAML ao spec.template.spec:

     taints:
        - effect: NoExecute
          key: spot
          value: 'true'

Isso evita que os pods sejam agendados no nó resultante, a menos que tenham uma tolerância ao taint spot='true', e expulsa todos os pods que não tenham essa tolerância.

Para saber mais sobre como aplicar taints e tolerâncias, leia o Controlar o posicionamento do pod usando taints de nó.

Quota

Os computadores podem entrar em estado de falha em função de problemas de cota se a cota para o tipo de computador que você está usando for muito baixa por um breve momento, mesmo que, eventualmente, ele seja suficiente (por exemplo, um nó ainda está sendo excluído quando outro está sendo criado). Por isso, é recomendável definir a cota para o tipo de computador que você usará para que as instâncias Spot sejam um pouco mais altas do que o necessário (talvez por 2*n, em que n é o número de núcleos usados por um computador). Essa sobrecarga evitaria ter que corrigir máquinas com falha, o que, embora seja relativamente simples, ainda é uma intervenção manual.

Preparação do nó

Conforme explicado na documentação da VM Spot vinculada acima, as VMs entram no estado de provisionamento Desalocado quando não estão mais disponíveis ou não estão mais acessíveis pelo preço máximo especificado.

Isso se manifesta no OpenShift como nós Não Prontos. Os computadores permanecerão íntegros, na fase Provisionado como nó.

Eles voltarão a estar Prontos quando as VMs estiverem disponíveis novamente

Solução de problemas

Nó paralisado no estado Não Pronto, VM subjacente desalocada

Se um nó estiver paralisado por um longo período no estado Não Pronto depois que sua VM for desalocada, você poderá tentar excluí-lo ou excluir o objeto de computador OpenShift correspondente.

Computador Spot paralisado no estado de Falha

Se um computador (objeto OpenShift) que usa uma VM Spot estiver paralisado em um estado de Falha, tente excluí-lo manualmente. Se ele não puder ser excluído por causa de um erro 403 porque a VM não existe mais, edite o computador e remova os finalizadores.