Węzły bin Pack z profilami harmonogramu w usłudze Azure Kubernetes Service (AKS) (wersja zapoznawcza)

W tym artykule dowiesz się, jak spakować węzły w celu zwiększenia wykorzystania węzłów dla klastrów usługi Azure Kubernetes Service (AKS) przy użyciu wtyczki planowania w drzewie, NodeResourcesFit. Domyślny harmonogram usługi AKS działa w NodeResourcesFit:LeastAllocated trybie, który określa priorytety węzłów o niższym wykorzystaniu przy użyciu zasobników planowania. Konfigurowalne profile harmonogramu w usłudze AKS umożliwiają zmianę tego domyślnego zachowania i dostosowanie konfiguracji w celu nadania priorytetów węzłom o wyższym wykorzystaniu. Ta dokumentacja obejmuje trzy różne niestandardowe profile harmonizatora, podkreślając zalecenia dotyczące najlepszych praktyk w celu poprawy wykorzystania przy jednoczesnym zmniejszeniu gorących punktów węzłów.

Pakowanie węzłów to strategia planowania, która maksymalizuje wykorzystanie zasobów przez zwiększenie gęstości zasobników na węzłach, a nie rozłożenie zasobników w puli węzłów lub autoskalowanie węzłów przedwcześnie. Algorytm pakowania pomaga zminimalizować zmarnowane zasoby i może zmniejszyć koszty operacyjne związane z utrzymywaniem węzłów znajdujących się w stanie bezczynności lub niedostatecznie wykorzystanych. Poprawienie wydajności wykorzystania węzłów ma kluczowe znaczenie, ponieważ dane pokazują, że procesor CPU oraz pamięć są często nadmiernie przydzielanymi zasobami. Ponadto wraz ze wzrostem wdrażania procesora GPU efektywne wykorzystanie akceleratorów staje się równie krytyczne ze względu na ich względną niedobór i koszty.

Ograniczenia

  • Usługa AKS obecnie nie zarządza wdrażaniem harmonogramów innych firm ani wtyczek planowania poza drzewem.
  • Usługa AKS nie obsługuje wtyczek planowania typu "in-tree" przeznaczonych dla aks-system scheduler. To ograniczenie ma na celu zapobieganie nieoczekiwanym zmianom dodatków usługi AKS włączonym w klastrze. Ponadto nie można zdefiniować profile, który jest nazywany aks-system.

Wymagania wstępne

  • Wersja Azure CLI 2.76.0 lub nowsza. Uruchom polecenie az --version , aby znaleźć wersję i uruchomić polecenie az upgrade , aby uaktualnić wersję. Jeśli musisz zainstalować lub uaktualnić, zobacz Install Azure CLI.
  • Wersja 1.33 platformy Kubernetes lub nowsza działająca w klastrze AKS.
  • Wersja aks-preview.
  • Zarejestruj UserDefinedSchedulerConfigurationPreview w subskrypcji Azure.

Włącz profil konfiguracyjny harmonogramu w klastrze AKS

Można włączyć konfigurację profilu harmonogramu na nowym lub istniejącym klastrze AKS.

  1. Utwórz klaster AKS z włączoną konfiguracją profilu harmonogramu przy użyciu polecenia az aks create z użyciem flagi --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. Po zakończeniu procesu tworzenia połącz się z klastrem az aks get-credentials przy użyciu polecenia .

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

Weryfikowanie instalacji kontrolera harmonogramu

  • Po włączeniu funkcji w klastrze usługi AKS sprawdź, czy niestandardowa definicja zasobu (CRD) kontrolera harmonogramu została pomyślnie zainstalowana, używając polecenia kubectl get.

    kubectl get crd schedulerconfigurations.aks.azure.com
    

    Uwaga / Notatka

    To polecenie nie powiedzie się, jeśli funkcja nie została pomyślnie włączona w poprzedniej sekcji.

Konfigurowanie pakowania bin-węzła za pomocą wtyczki RequestedtoCapacity

Spośród trzech profilów RequestedToCapacityRatio zapewnia najbardziej szczegółową kontrolę użytkownika na potrzeby mapowania węzłów na jawne wykorzystanie. Na przykład ten profil planowania został skonfigurowany do faworyzowania węzłów w ramach przedziału wykorzystania 50–85%, unikać pustych węzłów i poważnie deprioritizować prawie pełne węzły na poziomie 90% wykorzystania lub więcej, pozostawiając trochę miejsca pracy. Biorąc pod uwagę ten poziom szczegółowości, RequestedtoCapacity jest zalecaną strategią oceny dla pakowania węzłów w usłudze AKS dla klastrów produkcyjnych.

Ta konfiguracja sprawia, że wykorzystanie procesora jest dominującym czynnikiem w wyborze węzła, optymalizując użycie węzłów przy jednoczesnym unikaniu nadmiernego przeciążenia aplikacji wymagających dużej mocy obliczeniowej. Na koniec należy wyłączyć wtyczkę PodTopologySpread, ponieważ w przeciwnym razie może zastąpić ważony wynik z NodeResourcesFit przy ustawieniu jej domyślnie na włączony.

  • NodeResourcesFit steruje sposobem, w jaki harmonogram ocenia, czy węzeł ma wystarczające zasoby do uruchomienia pod.
  • scoringStrategy: RequestedToCapacityRatio ocenia węzły na podstawie stosunku żądanych zasobów do całkowitej pojemności węzła po hipotetycznym umieszczeniu zasobnika.
  • Resources określa, że CPU i Memory są zasobami podstawowymi, które są brane pod uwagę do oceniania. Z wagą 8 węzły z zużyciem zasobów procesora są oceniane 8 razy wyżej niż pamięć podczas cyklu planowania zasobników. Zwiększa to prawdopodobieństwo wybrania węzłów o wysokim wykorzystaniu.
  • shape: mapuje wykorzystanie węzła do wyniku harmonogramu. Każdy punkt reprezentuje wartość procentową wykorzystania i odpowiadający jej wynik z liniowym wynikiem między punktami.
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

Konfigurowanie pakowania węzła za pomocą wtyczki MostAllocated

Konfigurowanie harmonogramu z MostAllocated wyłącznie ustawia węzły według priorytetu na podstawie użycia zasobów. Im wyższe wykorzystanie zasobów, tym wyższą ocenę uzyskuje węzeł, unikając nieużywanych węzłów lub skalowania aż do momentu, gdy jest to konieczne. W izolacji ta konfiguracja ryzykuje przeciążeniem węzłów przekraczając pożądane limity, co powoduje zmniejszenie przepustowości lub powstawanie dodatkowych wąskich gardeł.

Ta konfiguracja sprawia, że użycie procesora CPU jest dominującym czynnikiem w wyborze węzła. Aby zapewnić spójne zachowanie, należy wyłączyć wtyczkę PodTopologySpread, ponieważ może zastąpić ważony wynik z NodeResourcesFit, jeśli domyślnie jest włączona.

  • NodeResourcesFit steruje sposobem, w jaki harmonogram ocenia, czy węzeł ma wystarczające zasoby do uruchomienia pod.
  • scoringStrategy: MostAllocated punktuje na podstawie żądań podów. MostAllocated informuje harmonizer, aby preferować węzły o wysokim użyciu zasobów. Ta strategia promuje gęste umieszczanie zasobników i pomaga osiągnąć lepsze wykorzystanie węzłów.
  • Resources określa, że CPU i Memory są zasobami podstawowymi, które są brane pod uwagę do oceniania. Z wagą 8 węzły z zużyciem zasobów procesora są oceniane 8 razy wyżej niż pamięć podczas cyklu planowania zasobników. Zwiększa to prawdopodobieństwo wybrania węzłów o wysokim wykorzystaniu.
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

Konfigurowanie pakowania bin-węzła przy użyciu wtyczek MostAllocated i NodeResourcesBalancedAllocation

Ta konfiguracja ma na celu dodanie pewnych barier zabezpieczających do prostej i wydajnej strategii MostAllocated przez ocenianie węzłów w oparciu o zrównoważone użycie zasobów docelowych. NodeResourcesBalancedAllocation zachęca do umieszczania zasobników w węzłach z proporcjonalnym wykorzystaniem zdefiniowanym przez użytkownika, zwiększając ogólną wydajność przy jednoczesnym unikaniu wąskich gardeł spowodowanych przez asymetryczne wykorzystanie zasobów. Na przykład węzły obciążone obliczeniami CPU z obfitą nieużywaną pamięcią otrzymałyby niższą ocenę na rzecz węzłów z lepszą równowagą wykorzystania CPU i pamięci.

  • NodeResourcesBalancedAllocation ocenia węzły w oparciu o sposób zrównoważonego użycia zasobów w wielu zasobach. Zamiast maksymalizować wykorzystanie pojedynczego zasobu, wtyczka ta preferuje węzły, w których zużycie zasobów jest proporcjonalne.
  • Resources określa, które zasoby są brane pod uwagę podczas oceny salda. Przy równym ważeniu procesora i pamięci węzły są oceniane wyżej, gdy oba zasoby są w równym stopniu wykorzystywane.
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

Przypisz profil harmonogramu do całego klastra AKS

  1. Utwórz plik o nazwie cpu-bin-packing-scheduler.yaml, z CRD o nazwie upstream

  2. Zastosuj manifest konfiguracji planowania przy użyciu kubectl apply polecenia .

    kubectl apply -f cpu-bin-packing-scheduler.yaml
    
  3. Aby skierować ten mechanizm planowania dla określonych obciążeń, zaktualizuj wdrożenia podów używając następującego schedulerName:

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

Następne kroki

Aby dowiedzieć się więcej o harmonogramie usługi AKS, innych konfiguracjach i najlepszych rozwiązaniach, zobacz następujące zasoby: