在本文中,您將學習如何利用樹內排程外掛 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。
先決條件
- Azure CLI 版本
2.76.0或更新版本。 執行az --version以尋找版本,然後執行az upgrade以升級版本。 如果您需要安裝或升級,請參閱 安裝 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 叢集上啟用此功能之後,請確認排程器控制器的自訂資源定義 (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 叢集
建立一個名為
cpu-bin-packing-scheduler.yaml的檔案,CRD 名稱為upstream使用
kubectl apply命令套用排程組態清單。kubectl apply -f cpu-bin-packing-scheduler.yaml若要針對特定工作負載使用此排程機制,請使用下列
schedulerName更新您的 Pod 部署:... ... spec: schedulerName: binpacking-scheduler ... ...
下一步
欲了解更多關於 AKS 排程器、其他配置及最佳實務,請參閱以下資源: