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 specificati tolerationSeconds.
  • 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

  1. Creare un pool di nodi con un taint usando il comando az aks nodepool add e usare il parametro --node-taints per specificare sku=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
    
  2. Controllare lo stato del pool di nodi.

  3. Verificare che il taint sia impostato nel nodo.

Aggiornare un pool di nodi per aggiungere un taint del nodo

  1. 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 specificare sku=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
    
  2. Controllare lo stato del pool di nodi.

  3. Verificare che il taint sia stato impostato nel nodo.

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. 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.
  • È 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 o az 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

  1. Registrare il flag di funzionalità NodeInitializationTaintsPreview usando il comando az feature register.

    az feature register --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    

    Sono necessari alcuni minuti per visualizzare lo stato Registered.

  2. Verificare lo stato della registrazione usando il comando az feature show.

    az feature show --namespace "Microsoft.ContainerService" --name "NodeInitializationTaintsPreview"
    
  3. 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

  1. Creare un cluster con un taint di inizializzazione del nodo usando il comando az aks create e il parametro --node-initialization-taints da specificare sku=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
    
  2. Controllare lo stato del pool di nodi.

  3. Verificare che il taint sia impostato nel nodo.

Aggiornare un cluster per aggiungere un taint di inizializzazione del nodo

  1. Aggiornare un cluster per aggiungere un taint di inizializzazione del nodo utilizzando il comando az aks update e il parametro --node-initialization-taints per specificare sku=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"
    
  2. Controllare lo stato del pool di nodi.

  3. Verificare che il taint sia impostato nel nodo.

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 specificato nodeTaints:

    [
      {
        ...
        "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 specificato nodeInitializationTaints:

    [
      {
        ...
        "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 specificato Taints:

    [
        ...
        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

  1. 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.

  2. 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 in Taints:

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: 
        ...
        ],
        ...
     ...
    ]
    

Passaggi successivi