Azure Kubernetes Service (AKS)上具有计划程序配置文件的 Bin Pack 节点(预览版)

本文介绍如何使用树内计划插件(NodeResourcesFit)打包节点,以提高Azure Kubernetes Service (AKS)群集的节点利用率。 默认的 AKS 计划程序在 NodeResourcesFit:LeastAllocated 模式下运行,该模式通过计划 Pod 对利用率较低的节点进行优先级排序。 AKS 上的可配置计划程序配置文件允许你更改此默认行为,并微调配置,以优先考虑利用率较高的节点。 本文档介绍三个不同的自定义计划程序配置文件,同时重点介绍了在减少节点热点的同时改进利用率的最佳做法建议。

节点打包是一种调度策略,通过在节点上提高 Pod 密度来最大化资源利用率,而不是过早地将 Pod 分布在节点池中或提前自动扩展节点。 箱打包有助于最大程度地减少浪费的资源,并减少维护空闲或未充分利用的节点的运营成本。 提高节点利用率至关重要,因为数据显示 CPU 和内存通常是过度请求的资源。 此外,随着 GPU 采用的增长,由于加速器相对稀缺性和成本,加速器的高效利用率同样重要。

局限性

  • AKS 当前不管理第三方计划程序或树外计划插件的部署。
  • AKS 不支持以 aks-system 调度器为目标的内置调度插件。 此限制有助于防止群集上启用的 AKS 加载项发生意外更改。 此外,不能定义名为 profileaks-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 群集上启用该功能后,使用 kubectl get 命令验证计划程序控制器的自定义资源定义(CRD)是否已成功安装。

    kubectl get crd schedulerconfigurations.aks.azure.com
    

    注释

    如果在 上一部分中未成功启用该功能,此命令将不会成功。

使用 RequestedtoCapacity 插件配置节点装箱

在这三个配置文件中,RequestedToCapacityRatio 提供了最细致的用户控制,以便将节点映射到明确的用途。 例如,此计划配置文件已配置为优先考虑利用率在 50-85% 范围内的节点,避免空节点,并严重降低利用率达到 90% 或以上的几乎满节点的优先级,以留出一些空间。 鉴于此级别的详细信息,建议将 RequestedtoCapacity 用作在 AKS 上进行节点装箱评分的策略,以适用于生产集群。

此配置使 CPU 利用率成为节点选择的主要因素,打包节点,同时仍避免 CPU 密集型应用程序的饱和。 最后,您必须禁用 PodTopologySpread 插件,因为如果默认保持启用,它可能会替代 NodeResourcesFit 的加权分数。

  • NodeResourcesFit 控制调度器评估节点是否有足够的资源来运行 Pod。
  • scoringStrategy: RequestedToCapacityRatio 根据请求的资源与总节点容量的比率(假设放置 Pod 后)对节点进行评分。
  • Resources 指定 CPUMemory 为被视为用于评分的主要资源。 权重为 88 倍的节点的 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 插件配置节点装箱

配置计划程序 MostAllocated 时,将根据资源使用情况专门优先考虑节点。 资源利用率越高,节点得分越高,从而避免未使用的节点,并仅在必要时进行扩展。 在单独使用时,此配置可能会使节点达到饱和状态,超出理想的限制,从而导致限流或产生额外的瓶颈。

此配置使 CPU 利用率成为节点选择中的主导因素。 若要确保一致的行为,必须禁用 PodTopologySpread 插件,因为它可以在默认情况下启用时替代加权分数 NodeResourcesFit

  • NodeResourcesFit 控制调度器评估节点是否有足够的资源来运行 Pod。
  • scoringStrategy: MostAllocated 根据 Pod 请求评分。 MostAllocated 告知计划程序首选资源使用率较高的节点。 此策略可促进密集的 Pod 放置,并帮助实现 更好的节点利用率
  • Resources 指定 CPUMemory 为被视为用于评分的主要资源。 权重为 88 倍的节点的 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 计划程序、其他配置和最佳做法,请参阅以下资源: