Aggiungere un pool di nodi Spot di Azure a un cluster del servizio Azure Kubernetes (AKS)

In questo articolo si aggiunge un pool di nodi Spot secondario a un cluster del servizio Azure Kubernetes (AKS) esistente.

Un pool di nodi Spot è un pool di nodi supportato da un set di scalabilità di macchine virtuali Spot di Azure. Con le macchine virtuali Spot nel cluster del servizio Azure Kubernetes, è possibile sfruttare la capacità di Azure non utilizzata con un significativo risparmio sui costi. La quantità di capacità disponibile non utilizzata varia in base a molti fattori, ad esempio le dimensioni del nodo, l'area e l'ora del giorno.

Quando si distribuisce un pool di nodi Spot, Azure alloca i nodi Spot se è disponibile la capacità e distribuisce un set di scalabilità Spot che esegue il backup del pool di nodi Spot in un singolo dominio predefinito. Non esiste alcun contratto di servizio per i nodi Spot. Non esistono garanzie di disponibilità elevata. Se Azure necessita di capacità, l'infrastruttura di Azure rimuove i nodi Spot.

I nodi Spot sono ideali per i carichi di lavoro che possono gestire interruzioni, terminazioni anticipate o rimozioni. Ad esempio, carichi di lavoro come processi di elaborazione batch, ambienti di sviluppo e test e carichi di lavoro di calcolo di grandi dimensioni potrebbero essere buoni candidati per la pianificazione in un pool di nodi spot.

Operazioni preliminari

  • Questo articolo presuppone una conoscenza di base dei concetti relativi a Kubernetes e Azure Load Balancer. Per altre informazioni, vedere Concetti di base relativi a Kubernetes per il servizio Azure Kubernetes.
  • Se non si ha una sottoscrizione di Azure, creare un account gratuito prima di iniziare.
  • Quando si crea un cluster per l'uso di un pool di nodi Spot, il cluster deve usare i set di scalabilità di macchine virtuali per i pool di nodi e il servizio di bilanciamento del carico dello SKU Standard. È inoltre necessario aggiungere un altro pool di nodi dopo aver creato il cluster, illustrato in questa esercitazione.
  • Questo articolo richiede l'esecuzione dell'interfaccia della riga di comando di Azure versione 2.14 o successiva. Eseguire az --version per trovare la versione. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure.

Limiti

Le seguenti limitazioni si applicano quando si creano e gestiscono cluster del servizio Azure Kubernetes con un pool di nodi Spot:

  • Un pool di nodi Spot non può essere un pool di nodi predefinito, ma può essere usato solo come pool secondario.
  • Non è possibile aggiornare contemporaneamente il piano di controllo e i pool di nodi. È necessario aggiornarli separatamente o rimuovere il pool di nodi Spot per aggiornare contemporaneamente il piano di controllo e i pool di nodi rimanenti.
  • Un pool di nodi Spot deve usare set di scalabilità di macchine virtuali.
  • Non è possibile modificare ScaleSetPriority o SpotMaxPrice dopo la creazione.
  • Quando si imposta SpotMaxPrice, il valore deve essere -1 o un valore positivo con un massimo di cinque posizioni decimali.
  • Un pool di nodi spot ha l'etichetta kubernetes.azure.com/scalesetpriority:spot, il taint kubernetes.azure.com/scalesetpriority=spot:NoSchedule e i pod di sistema presentano anti-affinità.
  • È necessario aggiungere una tolleranza e un'affinità corrispondenti per pianificare i carichi di lavoro in un pool di nodi Spot.

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

Quando si aggiunge un pool di nodi Spot a un cluster esistente, deve essere un cluster con più pool di nodi abilitati. Quando si crea un cluster del servizio Azure Kubernetes con più pool di nodi abilitati, per impostazione predefinita si crea un pool di nodi con un priority di Regular. Per aggiungere un pool di nodi Spot, è necessario specificare Spot come valore per priority. Per altre informazioni sulla creazione di un cluster del servizio Azure Kubernetes con più pool di nodi, vedere usare più pool di nodi.

  • Creare un pool di nodi con un priority di Spot usando il comando az aks nodepool add.

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

Nel comando precedente, il priority di Spot rende il pool di nodi un pool di nodi Spot. Il parametro eviction-policy è impostato su Delete, ovvero il valore predefinito. Quando si imposta il criterio di rimozione su Delete, i nodi nel set di scalabilità sottostante del pool di nodi vengono eliminati quando vengono rimossi.

È anche possibile impostare i criteri di rimozione su Deallocate, il che significa che i nodi del set di scalabilità sottostante vengono impostati nello stato arrestato-deallocato al momento della rimozione. I nodi nello stato arrestato-deallocato contano per la quota di calcolo e possono causare problemi con il ridimensionamento o l'aggiornamento del cluster. I valori priority e eviction-policy possono essere impostati solo durante la creazione del pool di nodi. Questi valori non possono essere aggiornati in un secondo momento.

Il comando precedente abilita anche l'autoscaler del cluster, che è consigliabile usare con i pool di nodi Spot. In base ai carichi di lavoro in esecuzione nel cluster, l'autoscaler del cluster aumenta e riduce il numero di nodi. Per i pool di nodi Spot, l'autoscaler del cluster aumenta il numero di nodi dopo una rimozione se sono ancora necessari altri nodi. Se si modifica il numero massimo di nodi che un pool di nodi può avere, è anche necessario modificare il valore maxCount associato all'autoscaler del cluster. Se non si usa un componente un autoscaler del cluster, al momento della rimozione, il pool Spot si ridurrà fino a 0 e richiederà un'operazione manuale per ricevere eventuali nodi Spot aggiuntivi.

Importante

Pianificate solo i carichi di lavoro nei pool di nodi Spot in grado di gestire le interruzioni, come ad esempio i processi di elaborazione batch e gli ambienti di test. È consigliabile configurare itaint e le tolleranze nel pool di nodi Spot per assicurarsi che solo i carichi di lavoro in grado di gestire le rimozioni dei nodi siano pianificati in un pool di nodi Spot. Ad esempio, il comando precedente aggiunge un taint di kubernetes.azure.com/scalesetpriority=spot:NoSchedule, quindi solo i pod con una tolleranza corrispondente vengono pianificati in questo nodo.

Verificare il pool di nodi Spot

  • Verificare che il pool di nodi sia stato aggiunto usando il comando az aks nodepool show e verificare che il scaleSetPriority sia Spot.

    az aks nodepool show --resource-group myResourceGroup --cluster-name myAKSCluster --name spotnodepool
    

Pianificare l'esecuzione di un pod nel nodo Spot

Per pianificare l'esecuzione di un pod in un nodo Spot, è possibile aggiungere una tolleranza e un'affinità di nodo che corrisponde al taint applicato al nodo Spot.

L'esempio seguente illustra una parte di un file YAML che definisce una tolleranza corrispondente al taint kubernetes.azure.com/scalesetpriority=spot:NoSchedule e un'affinità di nodo corrispondente all'etichetta kubernetes.azure.com/scalesetpriority=spot usata nel passaggio precedente con regole di affinità dei nodi requiredDuringSchedulingIgnoredDuringExecution e preferredDuringSchedulingIgnoredDuringExecution:

spec:
  containers:
  - name: spot-example
  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"
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value

Quando si distribuisce un pod con questa tolleranza e affinità di nodo, Kubernetes pianifica correttamente il pod nei nodi con il taint e l'etichetta applicati. In questo esempio si applicano le regole seguenti:

  • Il nodo deve avere un'etichetta con la chiave kubernetes.azure.com/scalesetprioritye il valore di tale etichetta deve essere spot.
  • Il nodo deve avere preferibilmente un'etichetta con la chiave another-node-label-key e il valore di tale etichetta deve essere another-node-label-value.

Per altre informazioni, vedere Assegnazione di pod ai nodi.

Aggiornare un pool di nodi Spot

Quando si aggiorna un pool di nodi Spot, il servizio Azure Kubernetes emette internamente un blocco e un avviso di rimozione, ma non viene applicato alcun svuotamento. Non sono disponibili nodi di picco per gli aggiornamenti del pool di nodi Spot. A parte queste modifiche, il comportamento durante l'aggiornamento dei pool di nodi Spot è coerente con quello degli altri tipi di pool di nodi.

Per altre informazioni sull'aggiornamento, vedere Aggiornare un cluster del servizio Azure Kubernetes.

Prezzo massimo per un pool Spot

I Prezzi delle istanze Spot sono variabili, in base all'area e alla SKU. Per altre informazioni, vedere le informazioni sui prezzi per Linux e Windows.

Con i prezzi variabili, è possibile impostare un prezzo massimo, in dollari USA (USD) usando fino a cinque cifre decimali. Ad esempio, il valore 0,98765 corrisponde a un prezzo massimo di $0,98765 USD all'ora. Se si imposta il prezzo massimo su -1, l'istanza non verrà rimossa in base al prezzo. Finché sono presenti capacità e quote disponibili, il prezzo dell'istanza sarà il più basso tra il prezzo corrente di un'istanza Spot e quello di un'istanza standard.

Passaggi successivi

In questo articolo si è appreso come aggiungere un pool di nodi Spot a un cluster del servizio Azure Kubernetes. Per altre informazioni su come controllare i pod tra pool di nodi, vedere Procedure consigliate per le funzionalità avanzate dell'utilità di pianificazione nel servizio Azure Kubernetes.