Configurare più pool di nodi usando i pool di nodi spot del servizio Azure Kubernetes con l'utilità di scalabilità automatica dei cluster

Completato

Azure fornisce istanze di macchine virtuali di Azure che offrono scalabilità riducendo i costi e sono l'ideale per i carichi di lavoro che possono essere interrotti. Queste macchine virtuali accedono alla capacità di calcolo di Azure inutilizzata a prezzi inferiori, ma supportano comunque scenari di calcolo ad alte prestazioni.

La soluzione di monitoraggio di droni dell'azienda è distribuita nel servizio Azure Kubernetes, come numerosi servizi e applicazioni in contenitori. Uno di questi servizi è un servizio di elaborazione batch che pianifica le traiettorie di volo dei droni. In seguito a un aumento improvviso dei clienti, il servizio di elaborazione batch riceve un numero molto elevato di richieste e crea un backlog di consegne. Questa situazione causa ritardi e frustrazione dei clienti.

Il ridimensionamento automatico del numero di repliche del servizio di elaborazione batch consente l'elaborazione tempestiva degli ordini. Tuttavia, richiede anche la distribuzione di più nodi per soddisfare le esigenze delle risorse di calcolo. Analizzando le tendenze di utilizzo in Monitoraggio di Azure, si nota che questi nodi vengono usati solo in momenti specifici e non in modo efficiente rispetto ai costi. Il servizio di elaborazione batch è senza stato e non salva i dati delle sessioni client. Ci si rende conto che è possibile risparmiare denaro:

  • Usando istanze del nodo a costo inferiore.
  • Scalabilità automatica del numero di nodi nel pool di nodi configurato per l'elaborazione batch.

Verrà ora esaminata l'infrastruttura alla base di questa soluzione di riduzione dei costi nel servizio Azure Kubernetes.

Che cos'è una macchina virtuale spot (VM spot) di Azure?

Una macchina virtuale spot è una macchina virtuale che consente di accedere alla capacità di calcolo di Azure inutilizzata con forti sconti sui costi. Le macchine virtuali spot sostituiscono le macchine virtuali con priorità bassa esistenti in Azure. È possibile usare le macchine virtuali spot per eseguire carichi di lavoro che includono:

  • Scenari di calcolo a prestazioni elevate, elaborazione batch o applicazioni di rendering visivo.

  • Applicazioni senza stato su larga scala.

  • Ambienti di test e sviluppo, inclusi carichi di lavoro di integrazione continua (CI) e recapito continuo (CD).

Disponibilità delle macchine virtuali spot

La disponibilità delle macchine virtuali spot dipende da fattori come la capacità, le dimensioni, l'area e l'ora del giorno. Azure alloca le VM solo se la capacità è disponibile. Di conseguenza, non esiste alcun contratto di servizio per questi tipi di macchine virtuali e non offre garanzie di disponibilità elevata.

Criteri di rimozione delle macchine virtuali spot

I criteri di rimozione predefiniti per le macchine virtuali spot sono impostati su Dealloca. Azure rimuove le macchine virtuali spot con un preavviso di 30 secondi quando la capacità in un'area diventa limitata. Una macchina virtuale impostata con il criterio Dealloca passa allo stato arrestato-deallocato quando viene rimossa. È possibile ridistribuire una macchina virtuale rimossa quando la capacità spot ritorna disponibile. Una macchina virtuale deallocata continua a venire conteggiata nella quota CPU virtuale (vCPU) spot e continuano a essere addebitati i costi per i dischi allocati sottostanti.

Che cos'è un set di scalabilità di macchine virtuali spot?

Un set di scalabilità di macchine virtuali spot è costituito da set di scalabilità di macchine virtuali che supportano le macchine virtuali spot di Azure. Queste macchine virtuali si comportano allo stesso modo delle normali macchine virtuali spot, ma con una differenza: quando si usa il supporto dei set di scalabilità di macchine virtuali per le macchine virtuali spot in Azure, è possibile scegliere tra due criteri di rimozione:

  • Deallocazione: Il criterio Dealloca funziona esattamente come descritto in precedenza.

  • Elimina: il criterio Elimina consente di evitare il costo dei dischi e di raggiungere i limiti di quota. Con il criterio di rimozione Elimina, le macchine virtuali rimosse vengono eliminate insieme ai dischi sottostanti. La funzionalità di scalabilità automatica del set di scalabilità può ora provare automaticamente a compensare la rimozione delle macchine virtuali creando nuove macchine virtuali. Sebbene la creazione di macchine virtuali non sia garantita, le macchine virtuali rimosse non vengono conteggiate per la quota vCPU e non vengono applicati i costi dei dischi sottostanti.

    Una procedura consigliata è usare la funzionalità di scalabilità automatica solo quando si impostano i criteri di rimozione nel set di scalabilità su Elimina.

Che cos'è un pool di nodi spot nel servizio Azure Kubernetes?

Un pool di nodi spot è un pool di nodi utente che usa un set di scalabilità di macchine virtuali spot. Il servizio Azure Kubernetes supporta le VM spot quando:

  • È necessario creare pool di nodi utente.
  • Si vogliono ottenere i vantaggi in termini di costi offerti dal supporto dei set di scalabilità di macchine virtuali per le VM spot di Azure.

Usare i pool di nodi spot per:

  • Sfruttare la capacità inutilizzata in Azure.
  • Usare le funzionalità del set di scalabilità con il criterio di rimozione Elimina.
  • Definire il prezzo massimo che si è disposti a pagare per ogni ora.
  • Abilitare l'utilità di scalabilità automatica dei cluster Kubernetes del servizio Azure Kubernetes consigliata quando si usano pool di nodi spot.

Ad esempio, per supportare il servizio di elaborazione batch dell'applicazione di rilevamento droni, è possibile creare un pool di nodi utente spot e abilitare il ridimensionamento automatico del cluster. È quindi possibile configurare il servizio di scalabilità orizzontale dei pod per distribuire più servizi di elaborazione batch in base alle esigenze delle risorse.

Quando la richiesta di nodi aumenta, l'utilità di scalabilità automatica dei cluster può ridimensionare il numero di nodi aumentandoli o riducendoli nel pool di nodi spot. Se si verificano rimozioni dei nodi, l'utilità di scalabilità automatica dei cluster continua a provare ad aumentare il numero di nodi, se sono ancora necessari nodi aggiuntivi.

Limitazioni dei pool di nodi spot

Prima di decidere di aggiungere un pool di nodi utente spot al cluster del servizio Azure Kubernetes, prendere in considerazione le limitazioni seguenti:

  • Il set di scalabilità spot sottostante viene distribuito solo in un singolo dominio di errore e non offre garanzie di disponibilità elevata.
  • Per il cluster del servizio Azure Kubernetes, è necessario abilitare il supporto per più pool di nodi.
  • È possibile usare i pool di nodi spot solo come pool di nodi utente.
  • Non è possibile aggiornare i pool di nodi spot.
  • La creazione di macchine virtuali spot non è garantita. La creazione di nodi spot dipende dalla capacità e dalla disponibilità delle quote nell'area di Azure distribuita per il cluster.

Ricordare che i pool di nodi spot devono essere usati solo per i carichi di lavoro che possono essere interrotti.

Importante

In alcune sottoscrizioni, ad esempio le sottoscrizioni Sponsorship, la possibilità di creare macchine virtuali spot e pool di nodi spot è limitata. Potrebbe non essere possibile creare un pool di nodi spot per il cluster.

Aggiungere un pool di nodi spot a un cluster del servizio Azure Kubernetes

Un pool di nodi spot non può essere il pool di nodi di sistema per un cluster del servizio Azure Kubernetes. Prima di tutto, è necessario creare il cluster e quindi usare il az aks nodepool add comando per aggiungere un nuovo pool di nodi utente.

È possibile impostare diversi parametri per un nuovo pool di nodi per configurarlo come pool di nodi spot.

Priorità

Per impostazione predefinita, il parametro --priority è impostato su Regular per un nuovo pool di nodi. Impostare il valore su Spot per indicare che il nuovo pool che si sta creando è un pool di nodi spot. Questo valore non può essere modificato dopo la creazione.

Criteri di rimozione

Un pool di nodi spot deve usare un set di scalabilità di macchine virtuali. Come accennato in precedenza, il pool di nodi spot usa un set di scalabilità spot. Impostare --eviction-policy su Delete per consentire al set di scalabilità di rimuovere sia il nodo che il disco allocato sottostante usato dal nodo. Non è possibile modificare questo valore dopo la creazione.

È possibile impostare i criteri di rimozione su Deallocate, ma quando questi nodi vengono rimossi, vengono comunque conteggiati rispetto alla quota di calcolo verso il ridimensionamento o l'aggiornamento del cluster.

Prezzo massimo per il nodo spot

I pool di nodi spot consentono di ottimizzare i costi impostando l'importo massimo che si è disposti a spendere per nodo spot all'ora. Per impostare l'importo desiderato, usare il parametro --spot-max-price. I nodi spot appena creati vengono rimossi quando viene raggiunto questo valore.

È possibile impostare questo valore su qualsiasi importo positivo fino a cinque posizioni decimali o impostarlo su -1. L'impostazione del --spot-max-price valore su -1 influisce sul pool di nodi nei modi seguenti:

  • I nodi non verranno rimossi in base al prezzo del nodo.
  • Il costo per i nuovi nodi corrisponderà al prezzo corrente per i nodi spot o al prezzo per un nodo Standard, a seconda di quale sia il valore minore.

Se, ad esempio, si imposta il valore su 0,98765, il prezzo massimo per un nodo sarà 0,98765 USD all'ora. Quando il consumo del nodo supera questo importo, il nodo viene rimosso.

Abilitare l'utilità di scalabilità automatica del cluster

Si consiglia di abilitare la scalabilità automatica del cluster usando il parametro --enable-cluster-autoscaler. Se non si usa l'utilità di scalabilità automatica del cluster, si rischia che il numero di nodi scenda a zero nel pool quando i nodi vengono rimossi a causa dei vincoli di capacità di Azure.

Numero minimo di nodi

Impostare il numero minimo di nodi su un valore compreso tra 1 e 100 usando il parametro --min-count. Un numero minimo di nodi è obbligatorio quando si abilita l'utilità di scalabilità automatica dei cluster.

Numero massimo di nodi

Impostare il numero massimo di nodi su un valore compreso tra 1 e 100 usando il parametro --max-count. Un numero massimo di nodi è obbligatorio quando si abilita l'utilità di scalabilità automatica dei cluster.

Configurazione di esempio

Ecco un comando az aks nodepool add di esempio che aggiunge un pool di nodi spot con un numero massimo di 3 e un numero minimo di 1. Si noti l'uso di --enable-cluster-autoscaler per abilitare le funzionalità dei nodi spot.

az aks nodepool add \
    --resource-group resourceGroup \
    --cluster-name aksCluster \
    --name spotpool01 \
    --enable-cluster-autoscaler \
    --max-count 3 \
    --min-count 1 \
    --priority Spot \
    --eviction-policy Delete \
    --spot-max-price -1 \
    --no-wait

Distribuire pod nei pool di nodi spot

Quando si distribuiscono carichi di lavoro in Kubernetes, è possibile fornire informazioni all'utilità di pianificazione per specificare i nodi in cui è possibile o non è possibile eseguire i carichi di lavoro. È possibile controllare la pianificazione dei carichi di lavoro configurando taint, tolleranza o affinità dei nodi. I nodi spot sono configurati con un'etichetta e un taint specifici.

Che cos'è un taint?

Un taint è un valore applicato a un nodo per indicare che è possibile pianificare solo pod specifici. I nodi spot sono configurati con un'etichetta impostata su kubernetes.azure.com/scalesetpriority:spot.

Che cos'è la tolleranza?

La tolleranza è una specifica applicata a un pod per consentire, ma non richiedere, che un pod venga pianificato in un nodo con il taint corrispondente. I nodi spot sono configurati con un taint impostato su kubernetes.azure.com/scalesetpriority=spot:NoSchedule.

Nota

I taint e le tolleranze non garantiscono che un pod venga incluso in un nodo specifico. Ad esempio, se un nodo non ha taint, è possibile che il pod con la tolleranza venga pianificato nel nodo non risolto. La specifica di un'affinità con taint e tolleranze può risolvere questo problema.

Che cos'è l'affinità dei nodi?

L'affinità dei nodi consente di descrivere i pod pianificati in un nodo. L'affinità viene specificata usando le etichette definite nel nodo. Nel servizio Azure Kubernetes, ad esempio, i pod di sistema sono configurati con anti-affinità verso i nodi spot per impedire che vengano pianificati in questi nodi.

Definire la tolleranza in un file manifesto di un pod

Per specificare la tolerazione node-taint, creare una tolerations voce di dizionario nel file manifesto del carico di lavoro. In questo dizionario è possibile impostare le proprietà seguenti per ogni taint del nodo che il carico di lavoro deve tollerare in questa sezione:

Proprietà Descrizione
key Identifica una coppia chiave-valore del taint del nodo specificata nel nodo. In un pool di nodi spot, ad esempio, la coppia chiave-valore è kubernetes.azure.com/scalesetpriority:spot. La chiave è kubernetes.azure.com/scalesetpriority.
operator Consente la corrispondenza tra tolleranza e taint. L'operatore predefinito è Equal. È anche possibile specificare Exists per trovare la corrispondenza con la tolleranza. Tuttavia, quando si usa Exists, non si specifica la proprietà seguente (value).
value Rappresenta la parte del valore della coppia chiave-valore node-taint specificata nel nodo. Si consideri, ad esempio, un pool di nodi spot con una coppia chiave-valore kubernetes.azure.com/scalesetpriority:spot, il valore è spot.
effect Indica in che modo viene gestita la pianificazione di un pod nel sistema. Sono disponibili tre opzioni: NoSchedule, PreferNoSchedule e NoExecute. NoSchedule garantisce che il sistema non possa pianificare il pod. PreferNoSchedule consente al sistema di provare a non pianificare il pod. NoExecute rimuove i pod già in esecuzione nel nodo con taint o non pianifica il pod.

Definire l'affinità dei nodi in un file manifesto del pod

Per specificare l'affinità, creare una voce affinity nel file manifesto del carico di lavoro. In questa voce vengono impostate le proprietà seguenti per ogni etichetta di nodo che deve corrispondere a un carico di lavoro:

Proprietà Descrizione
nodeAffinity Descrive le regole di pianificazione dell'affinità dei nodi per il pod.
requiredDuringSchedulingIgnoredDuringExecution Se i requisiti di affinità specificati da questo campo non vengono soddisfatti in fase di pianificazione, non sarà possibile pianificare il pod sul nodo. Se i requisiti di affinità specificati da questo campo cessano di essere soddisfatti in un determinato momento durante l'esecuzione del pod, ad esempio a causa di un aggiornamento, il sistema potrebbe o meno tentare di rimuovere il pod dal relativo nodo.
nodeSelectorTerms Elenco dei termini del selettore di nodi. I termini restituiti corrispondono a uno qualsiasi dei filtri, anziché a tutti i filtri.
matchExpressions Elenco dei requisiti del selettore di nodi in base alle etichette del nodo.
key Chiave dell'etichetta a cui si applica il selettore. La chiave è kubernetes.azure.com/scalesetpriority
operator Rappresenta la relazione di una chiave con un set di valori. Gli operatori validi sono In, NotIn, Exists, DoesNotExistGt e Lt
values Corrisponde alla parte del valore della coppia chiave-valore dell'etichetta del nodo specificata nel nodo. In un pool di nodi spot con una coppia chiave-valore kubernetes.azure.com/scalesetpriority:spot, il valore è spot.

Di seguito è riportato un esempio di carico di lavoro a cui sono state aggiunte tolleranza e affinità per i pool di nodi spot.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    env: test
spec:
  containers:
  - name: nginx
    image: nginx
    imagePullPolicy: IfNotPresent
  tolerations:
  - key: "kubernetes.azure.com/scalesetpriority"
    operator: "Equal"
    value: "spot"
    effect: "NoSchedule"
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: "kubernetes.azure.com/scalesetpriority"
            operator: In
            values:
            - "spot"

Verificare le conoscenze

1.

Si supponga di avere un servizio senza stato che elabora gli ordini online ed eseguito in un cluster del servizio Azure Kubernetes (AKS). Si decide di usare pool di nodi spot nel cluster del servizio Azure Kubernetes per ottimizzare i costi di calcolo nel cluster. Come è possibile aggiungere pool di nodi spot a un cluster del servizio Azure Kubernetes?

2.

Per il servizio descritto nella domanda precedente, quale criterio di rimozione è l'opzione più conveniente per la configurazione del pool di nodi spot?

3.

Per il servizio descritto nelle domande precedenti, come è possibile assicurarsi che i carichi di lavoro siano pianificati nei nodi del pool di nodi utente spot?