この記事では、ツリー内スケジューリング プラグイン ( NodeResourcesFit) を使用して、ノードをビン パックして Azure Kubernetes Service (AKS) クラスターのノード使用率を向上させる方法について説明します。 既定の AKS スケジューラは、 NodeResourcesFit:LeastAllocated モードで動作します。このモードでは、ポッドのスケジュール設定により使用率が低いノードに優先順位が付けられます。 AKS の構成可能なスケジューラ プロファイルを使用すると、この既定の動作を変更し、使用率が高いノードに優先順位を付けるために構成を微調整できます。 このドキュメントでは、ノードのホット スポットを減らしながら使用率を向上させるためのベスト プラクティスの推奨事項を強調しながら、3 つの異なるカスタム スケジューラ プロファイルについて説明します。
ノード ビンパッキングは、ノード プール全体にポッドを分散させたり、ノードを途中で自動スケールしたりするのではなく、ノードのポッド密度を上げることでリソース使用率を最大化するスケジューリング戦略です。 ビンパッキングは、無駄なリソースを最小限に抑え、アイドル状態または使用率の低いノードを維持するための運用コストを削減するのに役立ちます。 データは、CPU とメモリが一般的に過剰に要求されたリソースであることを示すので、ノード使用率の向上は非常に重要です。 さらに、GPU の導入が拡大すると、相対的な希少性とコストが原因でアクセラレータの効率的な使用率が同様に重要になります。
制限事項
- AKS は現在、サードパーティのスケジューラやツリー外スケジューリング プラグインのデプロイを管理していません。
- AKS では、
aks-systemスケジューラを対象とするツリー内スケジューリング プラグインはサポートされていません。 この制限は、クラスターで有効になっている AKS アドオンに対する予期しない変更を防ぐために適用されます。 さらに、profileと呼ばれるaks-systemを定義することはできません。
前提条件
- Azure CLI バージョン
2.76.0以降。az --versionを実行してバージョンを見つけ、az upgradeを実行してバージョンをアップグレードします。 インストールまたはアップグレードが必要な場合は、Azure CLI のインストールを参照してください。 - AKS クラスターで
1.33以降のバージョンの Kubernetes が稼働しています。 -
aks-previewAzure CLI 拡張機能のバージョン18.0.0b27以降。 -
UserDefinedSchedulerConfigurationPreview機能フラグを Azure サブスクリプションに登録します。
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 プラグインを使用してノードのビンパッキングを構成する
3 つのプロファイルのうち、 RequestedToCapacityRatio は、ノードを明示的な使用率にマッピングするための最も詳細なユーザー制御を提供します。 たとえば、このスケジュール プロファイルは、使用率が 50 から 85%の帯域内のノードを優先するように構成されており、空のノードを回避し、使用率が 90% 以上でほぼ完全なノードを深刻に枯渇させ、ヘッドルームを残しています。 このレベルの詳細を考えると、 RequestedtoCapacity は、運用クラスターの AKS でのノード ビンパッキングに推奨されるスコア付け戦略です。
この構成により、CPU 使用率がノード選択の主要な要因になり、CPU 負荷の高いアプリケーションの飽和状態を回避しながら、ノードがパッキングされます。 最後に、 PodTopologySpread プラグインを無効にする必要があります。既定で有効のままにすると、 NodeResourcesFit の加重スコアをオーバーライドできます。
-
NodeResourcesFitは、ポッドを実行するのに十分なリソースがノードにあるかどうかをスケジューラが評価する方法を制御します。 -
scoringStrategy: RequestedToCapacityRatioは、ポッドが仮想的に配置された後のノード容量全体に対する要求されたリソースの比率に基づいてノードをスコア付けします。 -
Resourcesは、CPUとMemoryがスコア付けのために考慮される主要なリソースであることを指定します。8の重み付けでは、CPU 使用率を持つノードは、ポッドのスケジューリング サイクル中にメモリより 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は、ポッドを実行するのに十分なリソースがノードにあるかどうかをスケジューラが評価する方法を制御します。 -
scoringStrategy: MostAllocatedポッドリクエストに基づくスコア。MostAllocatedは、リソース使用率が高いノードを優先するようにスケジューラに指示します。 この戦略は、高密度ポッドの配置を促進し、 ノード使用率の向上に役立ちます。 -
Resourcesは、CPUとMemoryがスコア付けのために考慮される主要なリソースであることを指定します。8の重み付けでは、CPU 使用率を持つノードは、ポッドのスケジューリング サイクル中にメモリより 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 では、ユーザー定義の比例使用率を持つノードでのポッドの配置が促進され、非対称リソースの負荷によって引き起こされるボトルネックを回避しながら、全体的な効率が向上します。 たとえば、未使用のメモリが豊富なCPUに依存するノードは、CPUとメモリ使用率のバランスが良いノードに優先されて、優先度が低くなります。
-
NodeResourcesBalancedAllocationは、複数のリソース間でのリソース使用量のバランスに基づいてノードをスコア付けします。 このプラグインは、1 つのリソースの使用率を最大化するのではなく、リソース消費量が比例するノードを優先します。 -
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を使用してポッドのデプロイを更新します。... ... spec: schedulerName: binpacking-scheduler ... ...
次のステップ
AKS スケジューラ、その他の構成、ベスト プラクティスの詳細については、次のリソースを参照してください。