Usare il componente di scalabilità automatica del cluster nel servizio Azure Kubernetes (AKS)

Per restare al passo con le richieste delle applicazioni nel servizio Azure Kubernetes, potrebbe essere necessario modificare il numero di nodi che eseguono i carichi di lavoro. Il componente autoscaler del cluster controlla i pod nel cluster che non possono essere pianificati a causa di vincoli di risorse. Quando il ridimensionamento automatico del cluster rileva i problemi, aumenta il numero di nodi nel pool di nodi per soddisfare le esigenze dell'applicazione. Controlla regolarmente anche la mancanza di pod in esecuzione e riduce il numero di nodi in base alle esigenze.

Questo articolo illustra come abilitare e gestire il ridimensionamento automatico del cluster nel servizio Azure Kubernetes, basato sulla versione di Kubernetes open source.

Operazioni preliminari

Questo articolo richiede l'interfaccia della riga di comando di Azure 2.0.76 o versioni successive. 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.

Usare il ridimensionamento automatico del cluster in un cluster del servizio Azure Kubernetes

Importante

Il ridimensionamento automatico del cluster è un componente di Kubernetes. Anche se il cluster del servizio Azure Kubernetes usa un set di scalabilità di macchine virtuali per i nodi, non abilitare o modificare manualmente le impostazioni per la scalabilità automatica del set di scalabilità. Consentire il ridimensionamento automatico del cluster Kubernetes di gestire le impostazioni di scalabilità necessaria. Per altre informazioni, consultare È possibile modificare le risorse del servizio Azure Kubernetes nel gruppo di risorse del nodo?

Abilitare l'utilità di scalabilità automatica del cluster in un nuovo cluster

  1. Creare un gruppo di risorse usando il comando az group create.

    az group create --name myResourceGroup --location eastus
    
  2. Creare un cluster del servizio Azure Kubernetes usando il comando az aks create e abilitare e configurare il ridimensionamento automatico del cluster nel pool di nodi per il cluster usando il parametro --enable-cluster-autoscaler e specificando un nodo --min-count e --max-count. Il comando di esempio seguente crea un cluster con un singolo nodo supportato da un set di scalabilità di macchine virtuali, abilita il ridimensionamento automatico del cluster, imposta un minimo di uno e un massimo di tre nodi:

    az aks create \
    --resource-group myResourceGroup \
    --name myAKSCluster \
    --node-count 1 \
    --vm-set-type VirtualMachineScaleSets \
    --load-balancer-sku standard \
    --enable-cluster-autoscaler \
    --min-count 1 \
    --max-count 3 \
    --generate-ssh-keys
    

    Sono necessari alcuni minuti per creare il cluster e configurare le impostazioni del componente di scalabilità automatica del cluster.

Abilitare l'utilità di scalabilità automatica del cluster per un cluster esistente

  • Aggiornare un cluster esistente usando il comando az aks update e abilitare e configurare l'utilità di scalabilità automatica nel pool di nodi usando il parametro --enable-cluster-autoscaler e specificando un nodo --min-count e--max-count. Il comando di esempio seguente aggiorna un cluster del servizio Azure Kubernetes esistente per abilitare l'utilità di scalabilità automatica del cluster nel pool di nodi per il cluster e imposta un minimo di uno e un massimo di tre nodi:

    az aks update \
      --resource-group myResourceGroup \
      --name myAKSCluster \
      --enable-cluster-autoscaler \
      --min-count 1 \
      --max-count 3
    

    Sono necessari alcuni minuti per aggiornare il cluster e configurare le impostazioni dell'utilità di scalabilità automatica del cluster.

Disabilitare l'utilità di scalabilità automatica del cluster in un cluster

  • Disabilitare il ridimensionamento automatico del cluster usando il comando az aks update e il parametro --disable-cluster-autoscaler.

    az aks update \
      --resource-group myResourceGroup \
      --name myAKSCluster \
      --disable-cluster-autoscaler
    

    I nodi non vengono rimossi quando il componente di scalabilità automatica del cluster è disabilitato.

Nota

È possibile ridimensionare manualmente il cluster dopo aver disabilitato l'utilità di scalabilità automatica del cluster usando il comando az aks scale. Se si usa l'autoscaler orizzontale dei pod, questo continua a funzionare con l'autoscaler del cluster disabilitato, ma i pod potrebbero finire per non poter essere pianificati se tutte le risorse dei nodi sono in uso.

Riabilitare il ridimensionamento automatico del cluster in un cluster

È possibile riabilitare il ridimensionamento automatico del cluster in un cluster esistente usando il comando az aks update e specificando i parametri --enable-cluster-autoscaler, --min-counte --max-count.

Usare il ridimensionamento automatico del cluster nei pool di nodi

Usare il ridimensionamento automatico del cluster in più pool di nodi

È possibile usare il ridimensionamento automatico del cluster con più pool di nodi e abilitare il ridimensionamento automatico del cluster in ogni singolo pool di nodi e passarvi regole di scalabilità automatica univoche.

  • Aggiornare le impostazioni in un pool di nodi esistente usando il comando az aks nodepool update.

    az aks nodepool update \
      --resource-group myResourceGroup \
      --cluster-name myAKSCluster \
      --name nodepool1 \
      --update-cluster-autoscaler \
      --min-count 1 \
      --max-count 5
    

Disabilitare il ridimensionamento automatico del cluster in un pool di nodi

  • Disabilitare il ridimensionamento automatico del cluster in un pool di nodi usando il comando az aks nodepool update e il parametro --disable-cluster-autoscaler.

    az aks nodepool update \
      --resource-group myResourceGroup \
      --cluster-name myAKSCluster \
      --name nodepool1 \
      --disable-cluster-autoscaler
    

Riabilitare il ridimensionamento automatico del cluster in un pool di nodi

È possibile riabilitare il ridimensionamento automatico del cluster in un pool di nodi usando il comando az aks nodepool update e specificando i parametri --enable-cluster-autoscaler, --min-counte --max-count.

Nota

Se si prevede di usare il ridimensionamento automatico del cluster con pool di nodi che si estendono su più zone e sfruttare le funzionalità di pianificazione correlate alle zone, ad esempio la pianificazione topologica del volume, è consigliabile avere un pool di nodi per zona e abilitare --balance-similar-node-groups tramite il profilo di scalabilità automatica. In questo modo il ridimensionamento automatico può aumentare e mantenere bilanciate le dimensioni dei pool di nodi.

Aggiornare le impostazioni del componente di scalabilità automatica del cluster

Man mano che le esigenze dell'applicazione cambiano, potrebbe essere necessario modificare il numero di nodi del ridimensionamento automatico del cluster in modo da ridimensionare in modo efficiente.

  • Modificare il numero di nodi usando il comando az aks update e aggiornare il ridimensionamento automatico del cluster usando il parametro --update-cluster-autoscaler e specificando il nodo aggiornato --min-count e --max-count.

    az aks update \
      --resource-group myResourceGroup \
      --name myAKSCluster \
      --update-cluster-autoscaler \
      --min-count 1 \
      --max-count 5
    

Nota

Il componente di scalabilità automatica del cluster applica il conteggio minimo nei casi in cui il conteggio effettivo scende al di sotto del minimo a causa di fattori esterni, ad esempio durante una rimozione spot o quando si modifica il valore minimo del conteggio dall'API del servizio Azure Kubernetes.

Usare il profilo del componente di scalabilità automatica del cluster

È anche possibile configurare dettagli più granulari del componente di scalabilità automatica del cluster modificando i valori predefiniti nel profilo di scalabilità automatica a livello di cluster. Ad esempio, un evento di riduzione si verifica quando i nodi sono sottoutilizzati dopo 10 minuti. Se si hanno carichi di lavoro che vengono eseguiti ogni 15 minuti, può essere opportuno modificare il profilo di scalabilità automatica in modo da ridurre i nodi sottoutilizzati dopo 15 o 20 minuti. Quando si abilita il componente di scalabilità automatica del cluster, viene usato un profilo predefinito, a meno che non si specifichino impostazioni diverse.

Importante

Il profilo di scalabilità automatica del cluster interessa tutti i pool di nodi che usano il componente di scalabilità automatica del cluster. Non è possibile impostare un profilo di scalabilità automatica per ogni pool di nodi. Quando si imposta il profilo, tutti i pool di nodi esistenti con il ridimensionamento automatico del cluster abilitato iniziano immediatamente a usare il profilo.

Impostazioni del profilo di scalabilità automatica del cluster

La tabella seguente elenca le impostazioni disponibili per il profilo di scalabilità automatica del cluster:

Impostazione Descrizione Default value
scan-interval Frequenza della rivalutazione del cluster per l'aumento o la riduzione. 10 secondi
scale-down-delay-after-add Intervallo di tempo tra l'aumento e la ripresa della valutazione per la riduzione. 10 minuti
scale-down-delay-after-delete Intervallo di tempo tra l'eliminazione del nodo e la ripresa della valutazione per la riduzione. scan-interval
scale-down-delay-after-failure Intervallo di tempo tra un errore di riduzione e la ripresa della valutazione per la riduzione. Tre minuti
scale-down-unneeded-time Per quanto tempo un nodo non deve essere necessario prima di essere idoneo per la riduzione. 10 minuti
scale-down-unready-time Per quanto tempo un nodo non pronto non deve essere necessario prima di essere idoneo per la riduzione. 20 minuti
ignore-daemonsets-utilization Indica se i pod DaemonSet verranno ignorati durante il calcolo dell'utilizzo delle risorse per ridurre le prestazioni. false
daemonset-eviction-for-empty-nodes Indica se i pod DaemonSet verranno terminati normalmente da nodi vuoti. false
daemonset-eviction-for-occupied-nodes Indica se i pod DaemonSet verranno terminati normalmente da nodi non vuoti. true
scale-down-utilization-threshold Livello di utilizzo del nodo, definito come somma delle risorse richieste divisa per la capacità, in cui un nodo può essere considerato per la riduzione. 0.5
max-graceful-termination-sec Numero massimo di secondi di attesa del componente di scalabilità automatica del cluster prima della terminazione del pod durante il tentativo di riduzione di un nodo. 600 secondi
balance-similar-node-groups Rileva pool di nodi simili e bilancia il numero di nodi tra di essi. false
expander Il tipo di espansione del pool di nodi usa in aumento delle prestazioni. I valori possibili comprendono most-pods, random, least-waste, e priority. random
skip-nodes-with-local-storage Se true, il ridimensionamento automatico del cluster non elimina i nodi con pod con archiviazione locale, ad esempio EmptyDir o HostPath. false
skip-nodes-with-system-pods Se true, il componente di scalabilità automatica del cluster non elimina i nodi con pod da kube-system (ad eccezione di DaemonSet o pod mirror). true
max-empty-bulk-delete Numero massimo di nodi vuoti che possono essere eliminati contemporaneamente. 10 nodi
new-pod-scale-up-delay Per scenari come la scalabilità burst/batch in cui non si vuole che l'autorità di certificazione agisca prima che l'utilità di pianificazione kubernetes possa pianificare tutti i pod, è possibile indicare alla CA di ignorare i pod non pianificati prima che raggiungano una determinata età. 0 secondi
max-total-unready-percentage Percentuale massima di nodi non letti nel cluster. Dopo il superamento di questa percentuale, l'autorità di certificazione interrompe le operazioni. 45%
max-node-provision-time Tempo massimo di attesa per il provisioning di un nodo da parte dell'utilità di scalabilità automatica. 15 minuti
ok-total-unready-count Numero di nodi non letti consentiti, indipendentemente da max-total-unready-percentage. Tre nodi

Nota

I parametri ignore-daemonsets-utilization, daemonset-eviction-for-empty-nodes e daemonset-eviction-for-occupied-nodes sono disponibili a livello generale dall'API versione 2024-05-01. Se si usa l'interfaccia della riga di comando per aggiornare questi flag, assicurarsi di usare la versione 2.63 o successiva.

Impostare il profilo di scalabilità automatica del cluster in un nuovo cluster

  • Creare un cluster del servizio Azure Kubernetes usando il comando az aks create e impostare il profilo di scalabilità automatica del cluster usando il parametro cluster-autoscaler-profile.

    az aks create \
        --resource-group myResourceGroup \
        --name myAKSCluster \
        --node-count 1 \
        --enable-cluster-autoscaler \
        --min-count 1 \
        --max-count 3 \
        --cluster-autoscaler-profile scan-interval=30s \
        --generate-ssh-keys
    

Impostare il profilo del componente di scalabilità automatica del cluster in un cluster esistente

  • Impostare il ridimensionamento automatico del cluster in un cluster esistente usando il comando az aks update e il parametro cluster-autoscaler-profile. Nell'esempio seguente l'intervallo di analisi viene impostato su 30 s:

    az aks update \
      --resource-group myResourceGroup \
      --name myAKSCluster \
      --cluster-autoscaler-profile scan-interval=30s
    

Configurare il profilo di scalabilità automatica del cluster per la riduzione aggressiva

Nota

La riduzione in modo aggressivo non è consigliata per i cluster che riscontrano frequenti scale-out e scale-in entro brevi intervalli, poiché potrebbe comportare tempi di provisioning estesi dei nodi in tali circostanze. L'aumento di scale-down-delay-after-add può essere utile in queste circostanze se si mantiene più a lungo il nodo per gestire i carichi di lavoro in ingresso.

 az aks update \
     --resource-group myResourceGroup \
     --name myAKSCluster \
     --cluster-autoscaler-profile scan-interval=30s,scale-down-delay-after-add=0m,scale-down-delay-after-failure=1m,scale-down-unneeded-time=3m,scale-down-unready-time=3m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=1000,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

Configurare il profilo di scalabilità automatica del cluster per carichi di lavoro di burst

 az aks update \   
     --resource-group "myResourceGroup" \
     --name myAKSCluster \ 
     --cluster-autoscaler-profile scan-interval=20s,scale-down-delay-after-add=10m,scale-down-delay-after-failure=1m,scale-down-unneeded-time=5m,scale-down-unready-time=5m,max-graceful-termination-sec=30,skip-nodes-with-local-storage=false,max-empty-bulk-delete=100,max-total-unready-percentage=100,ok-total-unready-count=1000,max-node-provision-time=15m

Reimpostare il profilo di scalabilità automatica del cluster sui valori predefiniti

  • Reimpostare il profilo di scalabilità automatica del cluster usando il comando az aks update.

    az aks update \
      --resource-group myResourceGroup \
      --name myAKSCluster \
      --cluster-autoscaler-profile ""
    

Recuperare i log e lo stato del componente di scalabilità automatica del cluster

È possibile recuperare i log e gli aggiornamenti dello stato dal componente di scalabilità automatica del cluster per diagnosticare ed eseguire il debug degli eventi di scalabilità automatica. AKS gestisce il componente di scalabilità automatica per conto dell'utente e lo esegue nel piano di controllo gestito. È possibile abilitare il nodo del piano di controllo per visualizzare i log e le operazioni dal componente di scalabilità automatica del cluster.

  1. Configurare una regola per i log delle risorse per eseguire il push dei log di scalabilità automatica del cluster in Log Analytics seguendo le istruzioni riportate qui. Assicurarsi di selezionare la casella per cluster-autoscaler quando si selezionano le opzioni per Log.

  2. Selezionare la sezione Log nel cluster.

  3. Immettere la seguente query di esempio in Log Analytics:

    AzureDiagnostics
    | where Category == "cluster-autoscaler"
    

    Verranno visualizzati log simili all'esempio seguente, purché siano presenti log da recuperare:

    Screenshot dei log di Log Analytics.

  4. Visualizzare gli eventi non attivati per la scalabilità automatica del cluster nell'interfaccia della riga di comando

    kubectl get events --field-selector source=cluster-autoscaler,reason=NotTriggerScaleUp
    
  5. Visualizzare gli eventi di avviso di scalabilità automatica del cluster nell'interfaccia della riga di comando

    kubectl get events --field-selector source=cluster-autoscaler,type=Warning
    
  6. Il componente di scalabilità automatica del cluster scrive anche lo stato di integrità in un configmap denominato cluster-autoscaler-status. È possibile recuperare questi log usando il comando seguente kubectl:

    kubectl get configmap -n kube-system cluster-autoscaler-status -o yaml
    

Per altre informazioni, vedere domande frequenti sul progetto GitHub Kubernetes/componente di scalabilità automatica.

Metriche del ridimensionamento automatico del cluster

È possibile abilitare le metriche del piano di controllo (anteprima) per visualizzare i log e le operazioni dal ridimensionamento automatico del cluster con il componente aggiuntivo del servizio gestito per Prometheus di Monitoraggio di Azure

Passaggi successivi

Questo articolo ha descritto come ridimensionare automaticamente il numero di nodi del servizio Azure Kubernetes. È anche possibile usare il componente di scalabilità automatica orizzontale dei pod per regolare automaticamente il numero di pod che eseguono l'applicazione. Per istruzioni sull'uso del componente di scalabilità automatica orizzontale dei pod, vedere Ridimensionare le applicazioni nel servizio Azure Kubernetes.

Per migliorare ulteriormente l'utilizzo delle risorse del cluster e liberare CPU e memoria per altri pod, vedere Scalabilità automatica verticale dei pod.