Nodi compattati con profili dell'unità di pianificazione nel servizio Azure Kubernetes (anteprima)

Questo articolo illustra come creare un bin pack dei nodi per migliorare l'utilizzo dei nodi per i cluster del servizio Azure Kubernetes usando il plug-in di pianificazione nell'albero, NodeResourcesFit. L'utilità di pianificazione predefinita del servizio Azure Kubernetes opera in una modalità NodeResourcesFit:LeastAllocated, che assegna priorità ai nodi con un utilizzo inferiore durante la pianificazione dei pod. I profili dell'utilità di pianificazione configurabili nel servizio Azure Kubernetes consentono di modificare questo comportamento predefinito e ottimizzare la configurazione per classificare in ordine di priorità i nodi con un utilizzo maggiore. Questa documentazione illustra tre diversi profili di pianificazione personalizzati, evidenziando allo stesso tempo le migliori pratiche raccomandate per migliorare l'utilizzo e ridurre gli hot spot dei nodi.

La compattazione del nodo è una strategia di pianificazione che ottimizza l'utilizzo delle risorse aumentando la densità dei pod nei nodi anziché distribuendo i pod in un pool di nodi o ridimensionando automaticamente i nodi in modo anomalo. La compressione dei contenitori consente di ridurre al minimo le risorse sprecate e può ridurre il costo operativo della gestione dei nodi inattive o sottoutilizzati. Il miglioramento dell'utilizzo dei nodi è fondamentale perché i dati mostrano che la CPU e la memoria sono in genere risorse sovra richieste. Inoltre, man mano che l'adozione della GPU aumenta, l'utilizzo efficiente degli acceleratori diventa altrettanto critico a causa della relativa scarsità e dei costi.

Limitazioni

  • AKS attualmente non gestisce la distribuzione di unità di pianificazione di terze parti o di plug-in di pianificazione esterni.
  • Il servizio Azure Kubernetes non supporta plug-in di pianificazione interni destinati all'unità di pianificazione di terze partiaks-system. Questa restrizione è stata abilitata per evitare modifiche impreviste ai componenti aggiuntivi del servizio Azure Kubernetes abilitati nel cluster. Inoltre, non è possibile definire un profile denominato aks-system.

Prerequisiti

  • Versione dell'interfaccia della riga di comando 2.76.0 di Azure o successiva. Eseguire az --version per trovare la versione ed eseguire az upgrade per aggiornare la versione. Se è necessario installare o aggiornare, vedere Installare Azure CLI.
  • Versione 1.33 di Kubernetes o successiva in esecuzione nel cluster AKS.
  • L'estensione dell'interfaccia della riga di comando di Azure aks-preview versione 18.0.0b27 o successiva.
  • Registrare il flag della funzionalitàUserDefinedSchedulerConfigurationPreview nella sottoscrizione di Azure.

Abilitare la configurazione del profilo dello scheduler in un cluster AKS di Azure

È possibile abilitare la configurazione del profilo di pianificazione in un cluster del servizio Azure Kubernetes nuovo o esistente.

  1. Creare un cluster AKS con la configurazione del profilo dello scheduler abilitata utilizzando il comando az aks create con il flag --enable-upstream-kubescheduler-user-configuration.

    # Set environment variables
    export RESOURCE_GROUP=<resource-group-name>
    export CLUSTER_NAME=<aks-cluster-name>
    
    # Create an AKS cluster with schedule profile configuration enabled
    az aks create \
    --resource-group $RESOURCE_GROUP \ 
    --name $CLUSTER_NAME \
    --enable-upstream-kubescheduler-user-configuration \
    --generate-ssh-keys
    
  2. Al termine del processo di creazione, connettersi al cluster usando il az aks get-credentials comando .

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    

Verificare l'installazione del controller del pianificatore

  • Dopo aver abilitato la funzionalità sul cluster AKS, verificare che la definizione di risorsa personalizzata del controller del programmatore (CRD)sia stata installata correttamente usando il comando kubectl get.

    kubectl get crd schedulerconfigurations.aks.azure.com
    

    Annotazioni

    Questo comando non riesce se la funzionalità non è stata abilitata correttamente nella sezione precedente.

Configurare la compattazione dei nodi con il plug-in RequestedtoCapacity

Tra i tre profili, RequestedToCapacityRatio fornisce il controllo utente più granulare per il mapping dei nodi a un utilizzo esplicito. Ad esempio, questo profilo di pianificazione è stato configurato per favorire i nodi all'interno di una banda di utilizzo di 50-85%, evitare nodi vuoti e deprioritizzare gravemente nodi quasi completi a 90% utilizzo o più, lasciando un po 'di spazio. Dato questo livello di dettaglio, RequestedtoCapacity è la strategia di assegnazione del punteggio consigliata per la compattazione dei nodi su AKS per i cluster di produzione.

Questa configurazione rende l'utilizzo della CPU il fattore dominante nella selezione dei nodi, la compressione dei nodi evitando al tempo stesso la saturazione per le applicazioni con utilizzo elevato della CPU. Infine, è necessario disabilitare il plug-in PodTopologySpread perché può eseguire l'override del punteggio ponderato da NodeResourcesFit se lasciato abilitato per impostazione predefinita.

  • NodeResourcesFit controlla come il gestore di pianificazione valuta se un nodo dispone di risorse sufficienti per eseguire un pod.
  • scoringStrategy: RequestedToCapacityRatio assegna punteggi ai nodi in base al rapporto tra le risorse richieste e la capacità totale dei nodi dopo che il pod viene posizionato ipoteticamente.
  • Resources specifica che CPU e Memory sono le risorse primarie considerate per l'assegnazione dei punteggi. Con un peso pari a 8, i nodi con utilizzo della CPU ottengono un punteggio 8 volte superiore rispetto alla memoria durante il ciclo di pianificazione dei pod. Ciò aumenta la probabilità che i nodi con utilizzo elevato siano selezionati.
  • shape: mappa l'utilizzo dei nodi al punteggio del pianificatore. Ogni punto rappresenta una percentuale di utilizzo e il relativo punteggio corrispondente, con un punteggio lineare tra i punti.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-RtC
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: RequestedToCapacityRatio
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1
                requestedToCapacityRatio:
                  shape:
                    - utilization: 0
                      score: 0
                    - utilization: 30
                      score: 9
                    - utilization: 50
                      score: 10
                    - utilization: 85
                      score: 10
                    - utilization: 90
                      score: 5
                    - utilization: 100
                      score: 0

Configurare il bin-packing dei nodi con il MostAllocated Plugin

La configurazione del pianificatore con MostAllocated prioritizza esclusivamente i nodi in base all'utilizzo delle risorse. Maggiore è l'utilizzo delle risorse, maggiore è il punteggio di un nodo, evitando nodi inutilizzati o ridimensionamento fino a quando necessario. In isolamento, questa configurazione rischia di saturare i nodi superando i limiti consentiti, causando rallentamenti e colli di bottiglia aggiuntivi.

Questa configurazione rende l'utilizzo della CPU il fattore dominante nella selezione dei nodi. Per garantire un comportamento coerente, è necessario disabilitare il plug-in PodTopologySpread perché può eseguire l'override del punteggio ponderato da NodeResourcesFit se lasciato abilitato per impostazione predefinita.

  • NodeResourcesFit controlla come il gestore di pianificazione valuta se un nodo dispone di risorse sufficienti per eseguire un pod.
  • scoringStrategy: MostAllocated punteggi in base alle richieste dei pod. MostAllocated indica al programmatore di preferire i nodi con un elevato utilizzo delle risorse. Questa strategia promuove il posizionamento di pod densi e consente di ottenere un migliore utilizzo dei nodi.
  • Resources specifica che CPU e Memory sono le risorse primarie considerate per l'assegnazione dei punteggi. Con un peso pari a 8, i nodi con utilizzo della CPU ottengono un punteggio 8 volte superiore rispetto alla memoria durante il ciclo di pianificazione dei pod. Ciò aumenta la probabilità che i nodi con utilizzo elevato siano selezionati.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-mA
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          # NodeResourcesFit configuration
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: MostAllocated
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1

Configurare la compattazione dei nodi con i plug-in MostAllocated e NodeResourcesBalancedAllocation

Questa configurazione cerca di aggiungere alcune protezioni alla strategia MostAllocated semplice ed efficiente tramite l'assegnazione di punteggi ai nodi in base all'utilizzo bilanciato delle risorse di destinazione. NodeResourcesBalancedAllocation incoraggia il posizionamento dei pod nei nodi con un utilizzo proporzionale definito dall'utente, aumentando l'efficienza complessiva, evitando colli di bottiglia causati dalla pressione asimmetrica delle risorse. Ad esempio, i nodi associati alla CPU con abbondante memoria inutilizzata vengono assegnati punteggi inferiori a favore dei nodi con un migliore bilanciamento dell'utilizzo della CPU e della memoria.

  • NodeResourcesBalancedAllocation assegna punteggi ai nodi in base a quanto è bilanciato l'utilizzo delle risorse tra più risorse. Anziché ottimizzare l'utilizzo di una singola risorsa, questo plug-in preferisce i nodi in cui il consumo di risorse è proporzionale.
  • Resources specifica quali risorse vengono considerate durante la valutazione del saldo. Con cpu e memoria ponderata equamente, i nodi vengono assegnati punteggi superiori quando entrambe le risorse vengono utilizzate a livelli simili.
apiVersion: aks.azure.com/v1alpha1
kind: SchedulerConfiguration
metadata:
  name: upstream
spec:
  rawConfig: |
    apiVersion: kubescheduler.config.k8s.io/v1
    kind: KubeSchedulerConfiguration
    profiles:
      - schedulerName: cpu-binpack-scheduler-mA-BalancedAllocation
        plugins:
          multiPoint:
            enabled:
              - name: NodeResourcesFit
              - name: NodeResourcesBalancedAllocation
            disabled:
              - name: PodTopologySpread
        pluginConfig:
          # NodeResourcesFit configuration
          - name: NodeResourcesFit
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesFitArgs
              scoringStrategy:
                type: MostAllocated
                resources:
                  - name: cpu
                    weight: 8
                  - name: memory
                    weight: 1
          - name: NodeResourcesBalancedAllocation
            args:
              apiVersion: kubescheduler.config.k8s.io/v1
              kind: NodeResourcesBalancedAllocationArgs
              resources:
                - name: cpu
                  weight: 1
                - name: memory
                  weight: 1

Assegnare un profilo di pianificazione a un intero cluster AKS

  1. Creare un file denominato cpu-bin-packing-scheduler.yaml con un CRD denominato upstream

  2. Applica il manifest della configurazione di pianificazione usando il comando kubectl apply.

    kubectl apply -f cpu-bin-packing-scheduler.yaml
    
  3. Per impostare come destinazione questo meccanismo di pianificazione per carichi di lavoro specifici, aggiornare le distribuzioni dei pod con quanto segue schedulerName:

    ...
    ...
        spec:
          schedulerName: binpacking-scheduler
    ...
    ...
    

Passaggi successivi

Per ulteriori informazioni sul pianificatore AKS, sulle configurazioni e best practice, vedere le risorse seguenti.