Condividi tramite


Usare i nodi in un cluster del servizio Azure Kubernetes (servizio Azure Kubernetes AKS)

Questo articolo descrive come usare i nodi taints in un cluster del servizio Azure Kubernetes (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 itaints del nodo, che interagiscono con l'utilità di pianificazione del servizio Azure Kubernetes.

I nodi funzionano contrassegnando un nodo in modo che l'utilità di pianificazione eviti di posizionare determinati pod nei nodi contrassegnati. È possibile posizionare tolerazioni in un pod per consentire all'utilità di pianificazione di pianificare il pod in un nodo con un taint corrispondente. Taints e tolerations 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 taints e tolerations.

I taints sono coppie chiave-valore con un effetto. Esistono tre valori per il campo dell'effetto quando si usano i nodi taints: NoExecute, NoSchedulee PreferNoSchedule.

  • NoExecute: i pod già in esecuzione nel nodo vengono rimossi immediatamente se non hanno una tolleranza corrispondente. Se un pod ha una tollerazione corrispondente, potrebbe essere rimosso se tolerationSeconds specificato.
  • NoSchedule: solo i pod con una tolerazione 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: nodi taints etaints di inizializzazione dei nodi.

  • I nodi sono destinati a rimanere in modo permanente nel nodo per la pianificazione dei pod con affinità di nodo. I nodi possono essere aggiunti, aggiornati o rimossi completamente usando l'API del servizio Azure Kubernetes.
  • I contenitori 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 l'immagine. I nuovi nodi hanno ancora il taint di inizializzazione del nodo dopo il ridimensionamento. I contenitori 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 contenitori di inizializzazione dalla specifica del cluster usando l'API del servizio Azure Kubernetes, i nodi appena creati non vengono creati con tali contenitori 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 taints 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 contenitori di sistema non sono consentite.

Questo non si applica ai contenitori di inizializzazione dei nodi.

Usare i nodi taints

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 az aks nodepool add comando e usare il --node-taints parametro 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 az aks nodepool update comando e usare il --node-taints parametro 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 contenitori 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

  • È necessaria la versione 3.0.0b3 dell'interfaccia della riga di comando di Azure o successivamente installata e configurata. 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 contenitori 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 contenitori di inizializzazione dei nodi durante la creazione e l'aggiornamento del pool di nodi.
  • Non è possibile applicare i contenitori 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 az aks create comando e il --node-initialization-taints parametro da specificare sku=gpu:NoSchedule per il taint.

    Importante

    L'inizializzazione del nodo si applica 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 usando il az aks update comando e il --node-initialization-taints parametro da specificare sku=gpu:NoSchedule per il taint.

    Importante

    Quando si aggiorna un cluster con un taint di inizializzazione del nodo, letaints si applicano a tutti i pool di nodi nel cluster. È possibile visualizzare gli aggiornamenti per l'inizializzazione dei nodi nel nodo 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 az aks nodepool list comando .

    az aks nodepool list --resource-group $RESOURCE_GROUP_NAME --cluster-name $CLUSTER_NAME
    

    Se sono stati applicati nodi, l'output di esempio seguente mostra che il <node-pool-name> pool di nodi è 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 <node-pool-name> pool di nodi è 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 nodi taints e i contenitori di inizializzazione dei nodi nella configurazione del nodo usando il kubectl describe node comando .

    kubectl describe node $NODE_NAME
    

    Se sono stati applicati nodi, l'output di esempio seguente mostra che il <node-pool-name> pool di nodi ha specificato Taints:

    [
        ...
        Name: <node-pool-name>
        ...
        Taints: sku=gpu:NoSchedule
        ...
        ],
        ...
     ...
    ]
    

Rimuovere i nodi taints

Rimuovere un taint del nodo specifico

  • Rimuovere i nodi taints usando il az aks nodepool update comando . Il comando di esempio seguente rimuove il "sku=gpu:NoSchedule" taint del nodo 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 nodi taints

  • Rimuovere tutti i nodi taints da un pool di nodi usando il az aks nodepool update comando . Il comando di esempio seguente rimuove tutti i nodi taints 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 contenitori di inizializzazione dei nodi

Sono disponibili le opzioni seguenti per rimuovere i contenitori di inizializzazione dei nodi dal nodo:

  • Rimuovere temporaneamente i contenitori di inizializzazione dei nodi usando l'API Kubernetes. Se vengono rimossi in questo modo, i taints vengono nuovamente visualizzati dopo il ridimensionamento o l'aggiornamento dei nodi. I nuovi nodi hanno ancora il taint di inizializzazione del nodo dopo il ridimensionamento. I contenitori di inizializzazione del nodo vengono visualizzati in tutti i nodi dopo l'aggiornamento.
  • Rimuovere definitivamente l'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 taints 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 hanno piùtaint di inizializzazione.

Quando si rimuovono tutte le occorrenze del taint di inizializzazione dalle repliche del pool di nodi, il taint di inizializzazione esistente potrebbe essere nuovamente visualizzato dopo un aggiornamento con eventuali nuovi contenitori di inizializzazione.

Rimuovere temporaneamente i contenitori di inizializzazione dei nodi

  • Rimuovere temporaneamente i taints di inizializzazione del nodo usando il kubectl taint nodes comando .

    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, l'inizializzazione dei nodi viene nuovamente visualizzata dopo il ridimensionamento o l'aggiornamento dei nodi.

Rimuovere definitivamente i contenitori di inizializzazione dei nodi

  1. Seguire la procedura descritta in Rimuovere temporaneamente i taints 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 az aks update comando . 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 nodi taints e i contenitori di inizializzazione dei nodi nella configurazione del nodo usando il kubectl describe node comando .

    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 ha il taint rimosso in Taints:

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

Passaggi successivi