在 Azure Kubernetes Service (AKS) 上使用排程器設定檔進行節點 Bin Pack (預覽版)

在本文中,您將學習如何利用樹內排程外掛 NodeResourcesFit,將節點包裝成箱,以提升 Azure Kubernetes Service(AKS)叢集的節點利用率。 預設 AKS 排程器會以 NodeResourcesFit:LeastAllocated 模式運作,在排程 Pod 時優先選擇使用率較低的節點。 AKS 上的可設定排程器設定檔(Configurable Scheduler Profiles)允許你改變預設行為,並微調設定以優先處理使用率較高的節點。 本文件涵蓋三種不同的自訂排程器配置檔,並強調提升利用率並減少節點熱點的最佳實務建議。

節點分箱是一種排程策略,它透過增加節點上的 Pod 密度來優化資源利用率,而不是將 Pod 分散到節點池中或過早地自動擴展節點。 箱子包裝有助於減少資源浪費,並降低維護閒置或未充分利用節點的營運成本。 提升節點利用率至關重要,因為數據顯示 CPU 與記憶體常被過度請求。 此外,隨著GPU採用率提升,加速器的高效運用也變得同樣重要,因為其相對稀缺且成本高昂。

局限性

  • AKS 目前不會管理第三方排程器或樹狀結構外排程外掛程式的部署。
  • AKS 不支援以 aks-system 排程器為目標的樹狀結構內排程外掛程式。 此限制是為了協助防止叢集上啟用的 AKS 附加元件發生非預期的變更。 此外,你無法定義一個名為profile的aks-system。

先決條件

在 AKS 叢集中啟用排程設定檔配置

您可以在新的或現有的 AKS 叢集上啟用排程設定檔設定。

  1. 使用 az aks create 命令搭配 --enable-upstream-kubescheduler-user-configuration 旗標,建立已啟用排程器設定檔配置的 AKS 叢集。

    # 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. 建立程序完成後,請使用命令 az aks get-credentials 連線到叢集。

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

驗證排程器控制器的安裝

  • 在 AKS 叢集上啟用此功能之後,請確認排程器控制器的自訂資源定義 (CRD) 已使用命令 kubectl get 成功安裝。

    kubectl get crd schedulerconfigurations.aks.azure.com
    

    備註

    如果上 一節中未成功啟用此功能,則此命令將不會成功。

使用 RequestedtoCapacity 插件配置節點分箱

在三個設定檔中,RequestedToCapacityRatio 可讓使用者以最細緻的方式控制節點如何對應到明確的使用率。 例如,此排程設定檔偏好利用率區間 50-85%內的節點,避免空節點,並在 90% 以上時大幅降低幾乎滿員的節點優先權,留有一定餘裕。 基於這種細節程度,RequestedtoCapacity 是 AKS 生產叢集進行節點 Bin Pack 時建議的評分策略。

此配置使 CPU 利用率成為節點選擇的主要因素,既能包裝節點,又避免 CPU 密集型應用的過度飽和。 最後,您必須停用 PodTopologySpread 外掛程式,因為如果預設保持啟用,它可能會覆寫 NodeResourcesFit 的加權分數。

  • NodeResourcesFit 會控制排程器如何評估節點是否有足夠資源來執行 Pod。
  • scoringStrategy: RequestedToCapacityRatio 根據在假設將 pod 放置後,請求的資源與節點總容量的比例來評分節點。
  • Resources 指定 CPU 和 Memory 是主要的評分資源。 在權重為 8 時,具有 CPU 使用率的節點在 pod 排程週期中的得分是記憶體的 8 倍。 這增加了高利用率節點被選中的機率。
  • shape: 將節點利用率映射到排程器分數。 每一分代表利用率百分比及其對應分數,分數間為線性分數。
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

使用 MostAllocated 外掛程式設定節點 Bin Pack

設定排程器 MostAllocated 時,會根據資源使用來優先排序節點。 資源利用率越高,節點得分越高,避免未使用節點或在必要時進行擴展。 單獨看,這種配置可能導致節點過度飽和,導致節流或增加瓶頸。

此配置使 CPU 利用率成為節點選擇的主要因素。 為了確保一致的運行,你必須停用該 PodTopologySpread 外掛,因為它如果預設為啟用,可能會覆蓋來自 NodeResourcesFit 的加權計分。

  • NodeResourcesFit 會控制排程器如何評估節點是否有足夠資源來執行 Pod。
  • scoringStrategy: MostAllocated 分數是根據 POD 請求計算的。 MostAllocated 告訴排程器優先選擇資源使用量高的節點。 此策略促進密集的莢艙配置,並有助於 提升節點利用率。
  • Resources 指定 CPU 和 Memory 是主要的評分資源。 在權重為 8 時,具有 CPU 使用率的節點在 pod 排程週期中的得分是記憶體的 8 倍。 這增加了高利用率節點被選中的機率。
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

使用 MostAllocated 和 NodeResourcesBalancedAllocation 外掛來配置節點分箱

此配置旨在為簡單且高效的策略 MostAllocated 增添一些護欄,透過根據目標資源的平衡使用來評分節點。 NodeResourcesBalancedAllocation 會鼓勵將 Pod 放置在使用者定義之比例使用率的節點上,提高整體效率,同時避免因資源壓力不對稱而造成瓶頸。 例如,CPU 負載較重但記憶體未充分使用的節點,其評分會較低,而 CPU 與記憶體利用平衡良好的節點則會被優先考量。

  • NodeResourcesBalancedAllocation 根據多個資源間資源使用平衡程度來評分節點。 這個外掛程式不追求單一資源的最大化利用,而是優先選擇資源消耗按比例的節點。
  • Resources 指定在平衡評估中考慮哪些資源。 當 CPU 與記憶體權重相等時,當兩項資源的消耗量相近時,節點得分會較高。
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

將排程器設定檔指派給整個 AKS 叢集

  1. 建立一個名為 cpu-bin-packing-scheduler.yaml的檔案,CRD 名稱為 upstream

  2. 使用 kubectl apply 命令套用排程組態清單。

    kubectl apply -f cpu-bin-packing-scheduler.yaml
    
  3. 若要針對特定工作負載使用此排程機制,請使用下列 schedulerName 更新您的 Pod 部署:

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

下一步

欲了解更多關於 AKS 排程器、其他配置及最佳實務,請參閱以下資源: