Bin Pack-noder med scheduler-profiler i Azure Kubernetes Service (AKS) (förhandsversion)

I den här artikeln får du lära dig hur du paketerar dina noder för att förbättra nodanvändningen för AKS-kluster (Azure Kubernetes Service) med hjälp av det inbyggda schemaläggningspluginet, NodeResourcesFit. AKS-standardschemaläggaren fungerar i ett NodeResourcesFit:LeastAllocated läge som prioriterar noder med lägre användning med schemaläggningspoddar. Med konfigurerbara Scheduler-profiler i AKS kan du ändra det här standardbeteendet och finjustera konfigurationen för att prioritera noder med högre användning. Den här dokumentationen beskriver tre olika anpassade scheduler-profiler samtidigt som vi lyfter fram rekommendationen om bästa praxis för att förbättra användningen samtidigt som nodernas hot spots minskas.

Bin-packning av noder är en schemaläggningsstrategi som maximerar resursanvändningen genom att öka podddensiteten på noder i stället för att sprida poddar över en nodpool eller att autoskalning av noder sker i förtid. Lagerplatsförpackning hjälper till att minimera bortkastade resurser och kan minska driftkostnaden för att underhålla inaktiva eller underutnyttjade noder. Att förbättra nodanvändningen är viktigt eftersom data visar att PROCESSOR och minne ofta är över begärda resurser. I takt med att GPU-implementeringen växer blir dessutom effektiv användning av acceleratorer lika kritisk på grund av deras relativa knapphet och kostnader.

Begränsningar

  • AKS hanterar för närvarande inte distributionen av schemaläggare från tredje part eller plugin-program för schemaläggning utanför träd.
  • AKS stöder inte plugin-program för schemaläggning i träd som riktar sig till aks-system schemaläggaren. Den här begränsningen finns för att förhindra oväntade ändringar av AKS-tillägg som är aktiverade i klustret. Dessutom kan du inte definiera en profile som heter aks-system.

Förutsättningar

Aktivera konfiguration av schemaläggarprofil i ett AKS-kluster

Du kan aktivera schemaprofilkonfiguration i ett nytt eller befintligt AKS-kluster.

  1. Skapa ett AKS-kluster med scheduler profilkonfiguration aktiverad med kommandot az aks create och --enable-upstream-kubescheduler-user-configuration-flaggan.

    # 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. När skapandet är klart ansluter du till klustret med kommandot az aks get-credentials.

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

Kontrollera installationen av scheduler-kontrollanten

  • När du har aktiverat funktionen i AKS-klustret kontrollerar du att den anpassade resursdefinitionen (CRD) för scheduler-kontrollanten har installerats med kommandot kubectl get .

    kubectl get crd schedulerconfigurations.aks.azure.com
    

    Anmärkning

    Det här kommandot lyckas inte om funktionen inte har aktiverats i föregående avsnitt.

Konfigurera bin-packning av noder med Plugin-programmet RequestedtoCapacity

Av de tre profilerna RequestedToCapacityRatio ger den mest detaljerade användarkontrollen för att mappa noder till en explicit användning. Den här schemaläggningsprofilen har till exempel konfigurerats för att gynna noder inom ett användningsband på 50–85%, undvika tomma noder och kraftigt deprioritera nästan fullständiga noder vid 90% användning eller mer, vilket lämnar lite utrymme. Med tanke på den här detaljnivån är RequestedtoCapacity den rekommenderade strategin för att packa noder i bin på AKS för produktionskluster.

Den här konfigurationen gör cpu-användning till den dominerande faktorn vid val av nod, paketering av noder samtidigt som övermättnad undviks för cpu-tunga program. Slutligen måste du inaktivera PodTopologySpread plugin-programmet eftersom det kan åsidosätta den viktade poängen från NodeResourcesFit om det lämnas aktiverat som standard.

  • NodeResourcesFit styr hur schemaläggaren utvärderar om en nod har tillräckligt med resurser för att köra en podd.
  • scoringStrategy: RequestedToCapacityRatio poängsätter noder baserat på förhållandet mellan begärda resurser och total nodkapacitet efter den hypotetiska placeringen av podden.
  • Resources anger det CPU och Memory är de primära resurser som övervägs för bedömning. Med en vikt på 8får noder med CPU-användning 8x högre poäng än minne under poddschemaläggningscykeln. Detta ökar sannolikheten för att noder med hög användning väljs.
  • shape: mappar nodanvändningen till schemaläggarens poäng. Varje punkt representerar en användningsprocent och dess motsvarande poäng, med en linjär poäng mellan punkterna.
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

Konfigurera bin-packning av noder med MostAllocated Plugin

När du konfigurerar schemaläggaren med MostAllocated prioriteras endast noder baserat på resursanvändning. Desto högre resursanvändning, desto högre poängsätts en nod, vilket undviker oanvända noder eller skalning tills det behövs. Isolerat riskerar den här konfigurationen att mätta noder över önskvärda gränser, vilket orsakar trottling eller fler flaskhalsar.

Den här konfigurationen gör CPU-användning till den dominerande faktorn i valet av nod. För att säkerställa konsekvent beteende måste du inaktivera PodTopologySpread plugin-programmet eftersom det kan åsidosätta den viktade poängen från NodeResourcesFit om den lämnas aktiverad som standard.

  • NodeResourcesFit styr hur schemaläggaren utvärderar om en nod har tillräckligt med resurser för att köra en podd.
  • scoringStrategy: MostAllocated poäng baserat på poddbegäranden. MostAllocated instruerar schemaläggaren att föredra noder med hög resursanvändning. Den här strategin främjar tät poddplacering och ger bättre nodanvändning.
  • Resources anger det CPU och Memory är de primära resurser som övervägs för bedömning. Med en vikt på 8får noder med CPU-användning 8x högre poäng än minne under poddschemaläggningscykeln. Detta ökar sannolikheten för att noder med hög användning väljs.
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

Konfigurera node bin-packning med insticksprogrammen MostAllocated och NodeResourcesBalancedAllocation

Den här konfigurationen ser ut att lägga till några skyddsräcken i den enkla och effektiva strategin MostAllocated genom att bedöma noder baserat på balanserad användning av målresurser. NodeResourcesBalancedAllocation uppmuntrar placering av pods på noder med användardefinierad proportionell resursanvändning, vilket ökar den övergripande effektiviteten samtidigt som flaskhalsar orsakade av asymmetriskt resurstryck undviks. Till exempel skulle CPU-bundna noder med rikligt oanvänt minne få lägre poäng till förmån för noder med en bättre balans mellan PROCESSOR- och minnesanvändning.

  • NodeResourcesBalancedAllocation poängsätter noder baserat på hur balanserad resursanvändning är mellan flera resurser. I stället för att maximera användningen av en enskild resurs föredrar det här plugin-programmet noder där resursförbrukningen är proportionell.
  • Resources anger vilka resurser som ska beaktas under balansutvärderingen. När processorn och minnet är lika viktade får noderna högre poäng när båda resurserna förbrukas på liknande nivåer.
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

Tilldela en scheduler-profil till ett helt AKS-kluster

  1. Skapa en fil med namnet cpu-bin-packing-scheduler.yaml, med crd-namnet upstream

  2. Använd schemaläggningskonfigurationsmanifestet kubectl apply med kommandot .

    kubectl apply -f cpu-bin-packing-scheduler.yaml
    
  3. Om du vill använda den här schemaläggningsmekanismen för specifika arbetslaster uppdaterar du pod-distributionerna med följande schedulerName:

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

Nästa steg

Mer information om AKS-schemaläggaren, andra konfigurationer och metodtips finns i följande resurser: