Condividi tramite


Ridimensionare i pool di nodi nel servizio Azure Kubernetes (AKS)

È possibile modificare le dimensioni delle macchine virtuali per supportare un numero crescente di distribuzioni o per eseguire un carico di lavoro più grande. Il ridimensionamento delle istanze del servizio Azure Kubernetes direttamente non è supportato quando si usano set di scalabilità di macchine virtuali nel servizio Azure Kubernetes, come descritto nei criteri di supporto per il servizio Azure Kubernetes:

I nodi dell'agente del servizio Azure Kubernetes vengono visualizzati nel portale di Azure come normali risorse IaaS di Azure. Tuttavia, queste macchine virtuali vengono distribuite in un gruppo di risorse di Azure personalizzato (in genere preceduto da MC_*). Non è possibile eseguire personalizzazioni dirette a questi nodi usando le API O le risorse IaaS. Le modifiche personalizzate non eseguite tramite l'API di AKS non verranno mantenute durante un aggiornamento, una scalatura, un aggiornamento o un riavvio.

In questo articolo viene illustrato il metodo consigliato per ridimensionare un pool di nodi creando un nuovo pool di nodi con le dimensioni dello SKU desiderate, il blocco e lo svuotamento dei nodi esistenti e quindi la rimozione del pool di nodi esistente.

Importante

Questo metodo è specifico per i cluster AKS basati su set di scalabilità di macchine virtuali. Quando si usano pool di nodi basati su macchine virtuali, è possibile aggiornare facilmente le dimensioni delle macchine virtuali in un pool di nodi esistente usando un singolo comando dell'interfaccia della riga di comando di Azure e avere più dimensioni della macchina virtuale nello stesso pool di nodi. Per altre informazioni, vedere la documentazione relativa ai pool di nodi delle macchine virtuali.

Creare un nuovo pool di nodi con lo SKU desiderato

Note

Ogni cluster del servizio Azure Kubernetes deve contenere almeno un pool di nodi di sistema con almeno un nodo. In questo esempio viene usato un --mode di System per aggiungere un pool di nodi di sistema in sostituzione del pool di nodi di sistema da ridimensionare. È possibile aggiornare la modalità di un pool di nodi in qualsiasi momento. È anche possibile aggiungere un pool di nodi utente impostando --mode su User.

Durante il ridimensionamento, assicurarsi di prendere in considerazione tutti i requisiti del carico di lavoro, ad esempio le zone di disponibilità, e di configurare di conseguenza il pool di nodi del set di scalabilità di macchine virtuali. Potrebbe essere necessario modificare il comando seguente in base alle proprie esigenze. Per un elenco completo delle opzioni di configurazione, vedere la pagina di riferimento az aks nodepool add.

  1. Creare un nuovo pool di nodi usando il az aks nodepool add comando . In questo esempio, creiamo un nuovo pool di nodi, mynodepool, con tre nodi e lo SKU della macchina virtuale Standard_DS3_v2 per sostituire un pool di nodi esistente, nodepool1, che ha lo SKU della macchina virtuale Standard_DS2_v2.

    az aks nodepool add \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name mynodepool \
        --node-count 3 \
        --node-vm-size Standard_DS3_v2 \
        --mode System \
        --no-wait
    

    La creazione del nuovo pool di nodi richiede alcuni minuti.

  2. Ottenere lo stato del nuovo pool di nodi usando il kubectl get nodes comando .

    kubectl get nodes
    

    L'output dovrebbe essere simile all'output di esempio seguente, che mostra sia il nuovo pool mynodepool di nodi che il pool nodepool1di nodi esistente:

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   23m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   23m   v1.21.9
    aks-nodepool1-12345678-vmss000000    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000001    Ready    agent   10d   v1.21.9
    aks-nodepool1-12345678-vmss000002    Ready    agent   10d   v1.21.9
    

Blocco dei nodi esistenti

Il blocco contrassegna i nodi specificati come non pianificabili e impedisce l'aggiunta di altri pod ai nodi.

  1. Ottieni i nomi dei nodi che vuoi isolare usando il comando kubectl get nodes.

    kubectl get nodes
    

    L'output dovrebbe essere simile al seguente esempio, che mostra i nodi nel pool di nodi esistente nodepool1 che desideri isolare.

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-12345678-vmss000000   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000001   Ready    agent   7d21h   v1.21.9
    aks-nodepool1-12345678-vmss000002   Ready    agent   7d21h   v1.21.9
    
  2. Bloccare i nodi esistenti usando il comando kubectl cordon, specificando i nodi desiderati in un elenco delimitato da spazi. Per esempio:

    kubectl cordon aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002
    

    L'output dovrebbe essere simile all'output di esempio seguente, che mostra che i nodi sono delimitati:

    node/aks-nodepool1-12345678-vmss000000 cordoned
    node/aks-nodepool1-12345678-vmss000001 cordoned
    node/aks-nodepool1-12345678-vmss000002 cordoned
    

Svuotare i nodi esistenti

Importante

Per svuotare correttamente i nodi e rimuovere i pod in esecuzione, assicurarsi che qualsiasi PodDisruptionBudgets (PDB) consenta lo spostamento di almeno una replica pod alla volta. In caso contrario, l'operazione di svuotamento/rimozione ha esito negativo. Per eseguire la verifica, è possibile eseguire kubectl get pdb -A e verificare che ALLOWED DISRUPTIONS sia almeno 1 o superiore.

Lo svuotamento dei nodi causerà la rimozione e la ricreazione dei pod negli altri nodi pianificabili.

  1. Svuotare i nodi esistenti usando il comando kubectl drain con le opzioni --ignore-daemonsets e --delete-emptydir-data, specificando i nodi desiderati in un elenco separato da spazi. Per esempio:

    Importante

    L'uso di --delete-emptydir-data è necessario per rimuovere il coredns creato dal servizio Azure Kubernetes e i pod metrics-server. Se non si usa questo flag, viene visualizzato un errore. Per altre informazioni, vedere la documentazione su emptydir.

    kubectl drain aks-nodepool1-12345678-vmss000000 aks-nodepool1-12345678-vmss000001 aks-nodepool1-12345678-vmss000002 --ignore-daemonsets --delete-emptydir-data
    
  2. Al termine dell'operazione di svuotamento, tutti i pod (esclusi quelli controllati dai set daemon) devono essere operativi nel nuovo pool di nodi. È possibile verificarlo usando il comando kubectl get pods.

    kubectl get pods -o wide -A
    

Risolvere i problemi di rimozione dei pod

Durante lo svuotamento dei nodi potrebbe verificarsi l'errore seguente:

Error when evicting pods/[podname] -n [namespace] (will retry after 5s): Cannot evict pod as it would violate the pod's disruption budget.

Per impostazione predefinita, il cluster prevede budget di interruzione dei pod gestiti dal servizio Azure Kubernetes (ad esempio coredns-pdb o konnectivity-agent) con MinAvailable pari a 1. Ad esempio, se sono in esecuzione due pod coredns, è possibile interromperne uno solo alla volta. Mentre un pod è in corso di creazione e non è disponibile, non è possibile rimuovere l'altro pod coredns a causa del budget di interruzione del pod. Questo problema si risolve dopo la pianificazione e l'esecuzione del pod coredns iniziale, consentendo al secondo pod di essere rimosso e ricreato correttamente.

Suggerimento

Valutare la possibilità di svuotare i nodi uno per uno per un'esperienza di rimozione più fluida ed evitare limitazioni. Per altre informazioni, vedere:

Rimuovere il pool di nodi esistente

Importante

Quando si elimina un pool di nodi, il servizio Azure Kubernetes non esegue il blocco e lo svuotamento. Per ridurre al minimo l'interruzione dei pod di riprogrammazione attualmente in esecuzione nel pool di nodi che si prevede di eliminare, eseguire un blocco e svuotamento di tutti i nodi del pool, prima di eliminarli.

  1. Eliminare il pool di nodi originale usando il az aks nodepool delete comando .

    az aks nodepool delete \
        --resource-group myResourceGroup \
        --cluster-name myAKSCluster \
        --name nodepool1
    
  2. Verificare che il cluster AKS abbia solo il nuovo pool di nodi con le applicazioni e i pod correttamente in esecuzione utilizzando il comando kubectl get nodes.

    kubectl get nodes
    

    L'output dovrebbe essere simile all'output di esempio seguente, che mostra solo il nuovo pool mynodepooldi nodi :

    NAME                                 STATUS   ROLES   AGE   VERSION
    aks-mynodepool-98765432-vmss000000   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000001   Ready    agent   63m   v1.21.9
    aks-mynodepool-98765432-vmss000002   Ready    agent   63m   v1.21.9
    

Passaggi successivi

Dopo il ridimensionamento di un pool di nodi tramite il blocco e lo svuotamento, vedere altre informazioni sull’uso di più pool di nodi.