Usare i taint nodi in un cluster del servizio Azure Kubernetes
Questo articolo descrive come usare i taint nodi in un cluster del servizio Azure Kubernetes.
Panoramica
Il meccanismo di pianificazione del servizio Azure Kubernetes è responsabile dell'inserimento di pod nei nodi e si basa sull'utilità di pianificazione Kubernetes upstream, kube-scheduler. È possibile vincolare un pod per l'esecuzione in nodi specifici collegando i pod a un set di nodi usando l'affinità del nodo o indicando al nodo di respingere un set di pod usando i taint del nodo, che interagiscono con l'utilità di pianificazione del servizio Azure Kubernetes.
I taint nodi funzionano contrassegnando un nodo in modo che l'utilità di pianificazione eviti di posizionare determinati pod nei nodi contrassegnati. È possibile posizionare tolleranze in un pod per consentire all'utilità di pianificazione di pianificare il pod in un nodo con un taint corrispondente. Taint e tolleranze interagiscono per controllare il modo in cui l'utilità di pianificazione inserisce i pod nei nodi. Per altre informazioni, vedere esempi di casi d'uso di taint e tolleranze.
I taint sono coppie chiave-valore con un effetto. Esistono tre valori per il campo dell'effetto quando si usano i taint nodi: NoExecute
, NoSchedule
e PreferNoSchedule
.
NoExecute
: i pod già in esecuzione nel nodo vengono rimossi immediatamente se non hanno una tolleranza corrispondente. Se un pod presenta una tolleranza corrispondente, potrebbe essere rimosso se vengono specificatitolerationSeconds
.NoSchedule
: solo i pod con una tolleranza corrispondente vengono inseriti in questo nodo. I pod esistenti non vengono rimossi.PreferNoSchedule
: l'utilità di pianificazione evita di posizionare i pod che non dispongono di una tolleranza corrispondente.
Opzioni taint del nodo
Esistono due tipi di nodi che possono essere applicati ai nodi del servizio Azure Kubernetes: taint nodi e taint di inizializzazione dei nodi.
- I taint nodi sono destinati a rimanere in modo permanente nel nodo per la pianificazione dei pod con affinità di nodo. I taint nodi possono essere aggiunti, aggiornati o rimossi completamente utilizzando l'API del servizio Azure Kubernetes.
- I taint di inizializzazione dei nodi vengono inseriti nel nodo in fase di avvio e devono essere usati temporaneamente, ad esempio negli scenari in cui potrebbe essere necessario tempo aggiuntivo per configurare i nodi. È possibile rimuovere il taint di inizializzazione dei nodi usando l'API Kubernetes e non sono garantiti durante il ciclo di vita del nodo. Vengono visualizzati solo dopo che un nodo viene ridimensionato o aggiornato/ricreato in termini di immagine. I nuovi nodi presentano ancora il taint di inizializzazione del nodo dopo il ridimensionamento. I taint di inizializzazione del nodo vengono visualizzati in tutti i nodi dopo l'aggiornamento. Se si vuole rimuovere completamente i contenitori di inizializzazione, è possibile rimuoverli usando l'API del servizio Azure Kubernetes dopo aver rimosso i nodi usando l'API Kubernetes. Dopo aver rimosso i taint di inizializzazione dalla specifica del cluster usando l'API del servizio Azure Kubernetes, i nodi appena creati non presentano tali taint di inizializzazione. Se il taint di inizializzazione è ancora presente nei nodi esistenti, è possibile rimuoverlo definitivamente eseguendo un'operazione di aggiornamento dell'immagine del nodo.
Nota
I taint e le etichette dei nodi applicati usando l'API del pool di nodi del servizio Azure Kubernetes non sono modificabili dall'API Kubernetes e viceversa. Le modifiche ai taint di sistema non sono consentite.
Questo non si applica ai taint di inizializzazione dei nodi.
Usare i taint nodi
Prerequisiti
Questo articolo presuppone che sia presente un cluster del servizio Azure Kubernetes esistente. Se è necessario un cluster del servizio Azure Kubernetes, è possibile crearne uno usando l'interfaccia della riga di comando di Azure, Azure PowerShell o il portale di Azure.
Creare un pool di nodi con un taint del nodo
Creare un pool di nodi con un taint usando il comando
az aks nodepool add
e usare il parametro--node-taints
per specificaresku=gpu:NoSchedule
per il taint.az aks nodepool add \ --resource-group $RESOURCE_GROUP_NAME \ --cluster-name $CLUSTER_NAME \ --name $NODE_POOL_NAME \ --node-count 1 \ --node-taints "sku=gpu:NoSchedule" \ --no-wait
Aggiornare un pool di nodi per aggiungere un taint del nodo
Aggiornare un pool di nodi per aggiungere un taint del nodo usando il comando
az aks nodepool update
e usare il parametro--node-taints
per specificaresku=gpu:NoSchedule
per il taint.az aks nodepool update \ --resource-group $RESOURCE_GROUP_NAME \ --cluster-name $CLUSTER_NAME \ --name $NODE_POOL_NAME \ --node-taints "sku=gpu:NoSchedule" \ --no-wait
Usare i taint di inizializzazione dei nodi (anteprima)
Importante
Le funzionalità di anteprima del servizio Azure Kubernetes sono disponibili in modalità self-service e opzionale. Le anteprime vengono fornite "così come sono" e "come disponibili" e sono escluse dai contratti di servizio e dalla garanzia limitata. Le anteprime del servizio Azure Kubernetes sono parzialmente coperte dal supporto clienti con la massima diligenza possibile. Di conseguenza, queste funzionalità non sono destinate all'uso in produzione. Per altre informazioni, vedere gli articoli di supporto seguenti:
Prerequisiti e limitazioni
- È necessario che sia installata e configurata l'interfaccia della riga di comando di Azure
3.0.0b3
o versione successiva. Eseguireaz --version
per trovare la versione. Se è necessario eseguire l'installazione o l'aggiornamento, vedere Installare l'interfaccia della riga di comando di Azure. - È possibile applicare i taint di inizializzazione solo tramite la creazione o l'aggiornamento del cluster quando si usa l'API del servizio Azure Kubernetes. Se si usano i modelli di Resource Manager, è possibile specificare i taint di inizializzazione dei nodi durante la creazione e l'aggiornamento del pool di nodi.
- Non è possibile applicare i taint di inizializzazione ai pool di nodi Windows usando l'interfaccia della riga di comando di Azure.
Ottenere le credenziali per il cluster
Ottenere le credenziali per il cluster del servizio Azure Kubernetes usando il comando
az aks get-credentials
.az aks get-credentials --resource-group $RESOURCE_GROUP_NAME --name $CLUSTER_NAME
Installare l'estensione aks-preview
dell'interfaccia della riga di comando di Azure.
Registrare o aggiornare l'estensione aks-preview usando il comando
az extension add
oaz extension update
.# Register the aks-preview extension az extension add --name aks-preview # Update the aks-preview extension az extension update --name aks-preview
Registrare il flag di funzionalità NodeInitializationTaintsPreview
Registrare il flag di funzionalità
NodeInitializationTaintsPreview
usando il comandoaz feature register
.az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
Sono necessari alcuni minuti per visualizzare lo stato Registered.
Verificare lo stato della registrazione usando il comando
az feature show
.az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
Quando lo stato riflette Registrato, aggiornare la registrazione del provider di risorse Microsoft.ContainerService usando il comando
az provider register
.az provider register --namespace Microsoft.ContainerService
Creare un cluster con un taint di inizializzazione del nodo
Creare un cluster con un taint di inizializzazione del nodo usando il comando
az aks create
e il parametro--node-initialization-taints
da specificaresku=gpu:NoSchedule
per il taint.Importante
I taint di inizializzazione dei nodi si applicano a tutti i pool di nodi nel cluster. Per applicare il taint di inizializzazione a un nodo specifico, è possibile usare un modello di Resource Manager anziché l'interfaccia della riga di comando.
az aks create \ --resource-group $RESOURCE_GROUP_NAME \ --name $CLUSTER_NAME \ --node-count 1 \ --node-init-taints "sku=gpu:NoSchedule" \ --generate-ssh-keys
Aggiornare un cluster per aggiungere un taint di inizializzazione del nodo
Aggiornare un cluster per aggiungere un taint di inizializzazione del nodo utilizzando il comando
az aks update
e il parametro--node-initialization-taints
per specificaresku=gpu:NoSchedule
per il taint.Importante
Quando si aggiorna un cluster con un taint di inizializzazione del nodo, i taint si applicano a tutti i pool di nodi nel cluster. È possibile visualizzare gli aggiornamenti per i taint di inizializzazione dei nodi dopo un'operazione di ricreazione dell'immagine.
az aks update \ --resource-group $RESOURCE_GROUP_NAME \ --name $CLUSTER_NAME \ --node-init-taints "sku=gpu:NoSchedule"
Controllare lo stato del pool di nodi
Dopo aver applicato il taint del nodo o il taint di inizializzazione, controllare lo stato del pool di nodi usando il comando
az aks nodepool list
.az aks nodepool list --resource-group $RESOURCE_GROUP_NAME --cluster-name $CLUSTER_NAME
Se sono stati applicati taint di nodi, l'output di esempio seguente mostra che il pool di nodi
<node-pool-name>
èCreating
nodi con l'oggetto specificatonodeTaints
:[ { ... "count": 1, ... "name": "<node-pool-name>", "orchestratorVersion": "1.15.7", ... "provisioningState": "Creating", ... "nodeTaints": [ "sku=gpu:NoSchedule" ], ... }, ... ]
Se è stata applicata l'inizializzazione dei nodi, l'output di esempio seguente mostra che il pool di nodi
<node-pool-name>
èCreating
nodi con l'oggetto specificatonodeInitializationTaints
:[ { ... "count": 1, ... "name": "<node-pool-name>", "orchestratorVersion": "1.15.7", ... "provisioningState": "Creating", ... "nodeInitializationTaints": [ "sku=gpu:NoSchedule" ], ... }, ... ]
Verificare che il taint sia impostato nel nodo
Controllare i taint nodi e i taint di inizializzazione dei nodi nella configurazione del nodo utilizzando il comando
kubectl describe node
.kubectl describe node $NODE_NAME
Se sono stati applicati taint nodi, l'output di esempio seguente mostra che il pool di nodi
<node-pool-name>
presenti l’oggetto specificatoTaints
:[ ... Name: <node-pool-name> ... Taints: sku=gpu:NoSchedule ... ], ... ... ]
Rimuovere i taint nodi
Rimuovere un taint del nodo specifico
Rimuovere i taint nodi usando il comando
az aks nodepool update
. Il comando di esempio seguente rimuove il taint del nodo"sku=gpu:NoSchedule"
dal pool di nodi.az aks nodepool update \ --cluster-name $CLUSTER_NAME \ --name $NODE_POOL_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --node-taints "sku=gpu:NoSchedule"
Rimuovere tutti i taint nodi
Rimuovere tutti i taint nodi da un pool di nodi utilizzando il comando
az aks nodepool update
. Il comando di esempio seguente rimuove tutti i taint nodi dal pool di nodi.az aks nodepool update \ --cluster-name $CLUSTER_NAME \ --resource-group $RESOURCE_GROUP_NAME \ --name $NODE_POOL_NAME \ --node-taints ""
Rimuovere i taint di inizializzazione dei nodi
Sono disponibili le opzioni seguenti per rimuovere i taint di inizializzazione dei nodi dal nodo:
- Rimuovere temporaneamente i taint di inizializzazione dei nodi usando l'API Kubernetes. Se vengono rimossi in questo modo, i taint vengono nuovamente visualizzati dopo il ridimensionamento o l'aggiornamento dei nodi. I nuovi nodi presentano ancora il taint di inizializzazione del nodo dopo il ridimensionamento. I taint di inizializzazione del nodo vengono visualizzati in tutti i nodi dopo l'aggiornamento.
- Rimuovere definitivamente i taint di inizializzazione dei nodi rimuovendo il nodo usando l'API Kubernetes e quindi rimuovendo il taint usando l'API del servizio Azure Kubernetes. Dopo aver rimosso i taint di inizializzazione dalla specifica del cluster usando l'API del servizio Azure Kubernetes, i nodi appena creati dopo le operazioni di ricreazione dell'immagine non presentano più taint di inizializzazione.
Quando si rimuovono tutte le occorrenze dei taint di inizializzazione dalle repliche del pool di nodi, il taint di inizializzazione esistente potrebbe essere nuovamente visualizzato dopo un aggiornamento con eventuali nuovi taint di inizializzazione.
Rimuovere temporaneamente i taint di inizializzazione dei nodi
Rimuovere temporaneamente i taint di inizializzazione dei nodi usando il comando
kubectl taint nodes
.Questo comando rimuove il taint solo dal nodo specificato. Se si vuole rimuovere il taint da ogni nodo nel pool di nodi, è necessario eseguire il comando per ogni nodo da cui si vuole rimuovere il taint.
kubectl taint nodes $NODE_POOL_NAME sku=gpu:NoSchedule-
Una volta rimosso, i taint di inizializzazione dei nodi vengono nuovamente visualizzati dopo il ridimensionamento o l'aggiornamento dei nodi.
Rimuovere definitivamente i taint di inizializzazione dei nodi
Seguire la procedura descritta in Rimuovere temporaneamente i taint di inizializzazione dei nodi per rimuovere il taint di inizializzazione del nodo usando l'API Kubernetes.
Rimuovere il taint dal nodo usando l'API del servizio Azure Kubernetes usando il comando
az aks update
. Questo comando rimuove il taint di inizializzazione del nodo da ogni nodo del cluster.az aks update \ --resource-group $RESOURCE_GROUP_NAME \ --name $CLUSTER_NAME \ --node-init-taints ""
Verificare che il taint sia stato rimosso dal nodo
Controllare i taint nodi e i taint di inizializzazione dei nodi nella configurazione del nodo utilizzando il comando
kubectl describe node
.kubectl describe node $NODE_NAME
Se è stato rimosso un taint del nodo, l'output di esempio seguente mostra che il
<node-pool-name>
pool di nodi non presenta il taint rimosso inTaints
:[ ... Name: <node-pool-name> ... Taints: ... ], ... ... ]
Passaggi successivi
- Altre informazioni sui casi d'uso di esempio per i taint e le tolleranze.
- Altre informazioni sulle procedure consigliate per le funzionalità avanzate dell'utilità di pianificazione del servizio Azure Kubernetes.
- Altre informazioni sulle etichette Kubernetes sono disponibili nella documentazione sulle etichette di Kubernetes.
Azure Kubernetes Service