Condividi tramite


Usare macchine virtuali spot di Azure in un cluster Azure Red Hat OpenShift

Questo articolo fornisce i dettagli necessari che consentono di configurare il cluster Azure Red Hat OpenShift per l'uso di macchine virtuali spot di Azure.

L'uso delle Azure Spot Virtual Machines consente di sfruttare la capacità inutilizzata con un notevole risparmio sui costi. Ogni volta che Azure necessita di nuovo di capacità, l'infrastruttura di Azure eliminerà le macchine virtuali di Azure Spot Virtual Machines. Per altre informazioni sulle istanze Spot, vedere Spot Virtual Machines.

Prima di iniziare

Prima di iniziare, assicurarsi di avere distribuito un cluster Azure Red Hat Openshift. Se è necessario un cluster, vedere la guida introduttiva per un cluster pubblico o l'esercitazione sul cluster privato per un cluster privato. La procedura per configurare il cluster per l'uso di VM spot non presenta differenze per i cluster privati e pubblici.

Un cluster deve avere sempre almeno tre nodi di lavoro non spot e tre nodi di controllo. Un cluster non può avere nodi di controllo basati su vm spot.

Aggiungere macchine virtuali spot

Per gestire i computer in Azure Red Hat Openshift si usa MachineSet. Le risorse di MachineSet sono gruppi di computer. I MachineSet e i computer hanno la stessa relazione dei ReplicaSet e i pod. Se sono necessari più computer o se devono essere ridimensionati, modificare il campo Repliche nel set di computer per soddisfare le esigenze di calcolo. Per altre informazioni, vedere la documentazione di MachineSet di OpenShift

L'uso di macchine virtuali spot viene specificato aggiungendo il campo spotVMOptions all'interno della specifica di modello di un MachineSet. Per creare questo MachineSet, verranno eseguire le operazioni seguenti:

  1. Ottenere una copia di un MachineSet in esecuzione nel cluster.
  2. Creare una configurazione MachineSet modificata.
  3. Distribuire questo MachineSet nel cluster

Prima di tutto, connettersi al cluster OpenShift usando l'interfaccia della riga di comando.

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

Verranno quindi elencati i MachineSet nel cluster. Un cluster predefinito avrà 3 MachineSet distribuiti:

oc get machinesets -n openshift-machine-api

Di seguito viene mostrato un output di esempio di questo 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

Verrà quindi descritto il MachineSet distribuito. Sostituire <machineset> con uno dei MachineSet elencati in precedenza e restituirlo in un file.

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

Sarà necessario modificare i parametri seguenti in 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 (aggiungere questo campo e impostarlo su {}).

Di seguito è riportato un esempio abbreviato di YAML per MachineSet spot che evidenzia le modifiche chiave da apportare quando si basa un nuovo MachineSet spot in un MachineSet di lavoro esistente, incluse alcune informazioni aggiuntive per il contesto. L'esempio non rappresenta un intero MachineSet funzionante. Molti campi sono stati omessi di seguito.

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'

Dopo aver aggiornato il file, applicarlo.

oc create -f spotmachineset.yaml

Per verificare che MachineSet sia stato creato correttamente, eseguire il comando seguente:

oc get machinesets -n openshift-machine-api

Di seguito è riportato un output di esempio. Quando lo stato dei computer è "Pronto", il Machineset è 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

Pianificare carichi di lavoro interrompibili

È consigliabile aggiungere un taint ai nodi spot per evitare che i nodi non interrompibili vengano pianificati su di essi e aggiungere tolleranze di questo taint in tutti i pod che si vogliono pianificare su di essi. È possibile aggiungere taint ai nodi tramite la specifica MachineSet.

È ad esempio possibile aggiungere il codice YAML seguente a spec.template.spec:

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

Questo approccio impedisce la pianificazione dei pod nel nodo risultante, a meno che non abbiano una tolleranza per il taint spot='true'. Tutti i pod privi di tale tolleranza verranno rimossi.

Per altre informazioni sull'applicazione di taint e tolleranze, leggere Controllare il posizionamento dei pod usando i taint di nodi.

Quota

I computer potrebbero entrare in uno stato di errore a causa di problemi di quota se la quota per il tipo di computer in uso risulta troppo bassa per un breve momento, anche se alla fine dovrebbe essere sufficiente, ad esempio se un nodo è ancora in fase di eliminazione quando ne viene creato un altro. Per questo motivo, è consigliabile impostare la quota per il tipo di computer che si userà per le istanze Spot in modo che sia leggermente superiore a quella necessaria, forse di 2*n, dove n è il numero di core usati da un computer. Questo sovraccarico eviterebbe di dover risolvere errori dei computer, operazione che, anche se relativamente semplice, è ancora un intervento manuale.

Idoneità dei nodi

Come illustrato nella documentazione relativa alle macchine virtuali spot collegata in precedenza, le macchine virtuali passano allo stato di provisioning Deallocato quando non sono più disponibili o non sono più disponibili al prezzo massimo specificato.

Questa situazione si rifletterà in OpenShift sotto forma di nodi Non pronto. I computer rimarranno integri, nella fase Provisioning come nodo.

Torneranno allo stato Pronto quando le macchine virtuali sono nuovamente disponibili

Risoluzione dei problemi

Nodo bloccato nello stato Non pronto, con macchina virtuale sottostante deallocata

Se un nodo rimane bloccato per un lungo periodo di tempo nello stato Non pronto dopo la deallocazione della rispettiva macchina virtuale, è possibile provare a eliminarlo o eliminare l'oggetto computer OpenShift corrispondente.

Macchina virtuale spot bloccata nello stato Errore

Se un computer (oggetto OpenShift) che usa una macchina virtuale spot è bloccato in uno stato Errore, provare a eliminarlo manualmente. Se non può essere eliminato a causa di un errore 403 perché la macchina virtuale non esiste più, modificare il computer e rimuovere i finalizzatori.