本文介绍如何使用树内计划插件(NodeResourcesFit)打包节点,以提高Azure Kubernetes Service (AKS)群集的节点利用率。 默认的 AKS 计划程序在 NodeResourcesFit:LeastAllocated 模式下运行,该模式通过计划 Pod 对利用率较低的节点进行优先级排序。 AKS 上的可配置计划程序配置文件允许你更改此默认行为,并微调配置,以优先考虑利用率较高的节点。 本文档介绍三个不同的自定义计划程序配置文件,同时重点介绍了在减少节点热点的同时改进利用率的最佳做法建议。
节点打包是一种调度策略,通过在节点上提高 Pod 密度来最大化资源利用率,而不是过早地将 Pod 分布在节点池中或提前自动扩展节点。 箱打包有助于最大程度地减少浪费的资源,并减少维护空闲或未充分利用的节点的运营成本。 提高节点利用率至关重要,因为数据显示 CPU 和内存通常是过度请求的资源。 此外,随着 GPU 采用的增长,由于加速器相对稀缺性和成本,加速器的高效利用率同样重要。
局限性
- AKS 当前不管理第三方计划程序或树外计划插件的部署。
- AKS 不支持以
aks-system调度器为目标的内置调度插件。 此限制有助于防止群集上启用的 AKS 加载项发生意外更改。 此外,不能定义名为profile的aks-system。
先决条件
- Azure CLI 版本
2.76.0或更高版本。 可通过运行az --version查找版本,运行az upgrade升级版本。 如果需要安装或升级,请参阅 Install Azure CLI。 - 在 AKS 群集上运行的 Kubernetes 版本
1.33或更高版本。 -
aks-previewAzure CLI 扩展版本18.0.0b27或更高版本。 - 在 Azure 订阅中注册
UserDefinedSchedulerConfigurationPreview功能标志。
在 AKS 群集上启用计划程序配置文件配置
可以在新的或现有的 AKS 群集上启用计划配置文件配置。
使用
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创建过程完成后,使用
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指定CPU和Memory为被视为用于评分的主要资源。 权重为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指定CPU和Memory为被视为用于评分的主要资源。 权重为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 群集
创建名为
cpu-bin-packing-scheduler.yaml的文件,CRD名为upstream使用
kubectl apply命令应用计划配置清单。kubectl apply -f cpu-bin-packing-scheduler.yaml要针对特定工作负载使用此调度机制,请使用以下内容
schedulerName更新 Pod 部署:... ... spec: schedulerName: binpacking-scheduler ... ...
后续步骤
若要详细了解 AKS 计划程序、其他配置和最佳做法,请参阅以下资源: