Azure Kubernetes Service (AKS) 上のスケジューラ プロファイルを含む Bin Pack ノード (プレビュー)

この記事では、ツリー内スケジューリング プラグイン ( NodeResourcesFit) を使用して、ノードをビン パックして Azure Kubernetes Service (AKS) クラスターのノード使用率を向上させる方法について説明します。 既定の AKS スケジューラは、 NodeResourcesFit:LeastAllocated モードで動作します。このモードでは、ポッドのスケジュール設定により使用率が低いノードに優先順位が付けられます。 AKS の構成可能なスケジューラ プロファイルを使用すると、この既定の動作を変更し、使用率が高いノードに優先順位を付けるために構成を微調整できます。 このドキュメントでは、ノードのホット スポットを減らしながら使用率を向上させるためのベスト プラクティスの推奨事項を強調しながら、3 つの異なるカスタム スケジューラ プロファイルについて説明します。

ノード ビンパッキングは、ノード プール全体にポッドを分散させたり、ノードを途中で自動スケールしたりするのではなく、ノードのポッド密度を上げることでリソース使用率を最大化するスケジューリング戦略です。 ビンパッキングは、無駄なリソースを最小限に抑え、アイドル状態または使用率の低いノードを維持するための運用コストを削減するのに役立ちます。 データは、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 クラスターで機能を有効にした後、 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 は、 CPUMemory がスコア付けのために考慮される主要なリソースであることを指定します。 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 は、 CPUMemory がスコア付けのために考慮される主要なリソースであることを指定します。 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 クラスター全体にスケジューラ プロファイルを割り当てる

  1. cpu-bin-packing-scheduler.yamlという名前のファイルを作成し、CRDとしてupstreamを名付ける

  2. kubectl apply コマンドを使用して、スケジュール構成マニフェストを適用します。

    kubectl apply -f cpu-bin-packing-scheduler.yaml
    
  3. 特定のワークロードに対してこのスケジュールメカニズムをターゲットにするには、次の schedulerNameを使用してポッドのデプロイを更新します。

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

次のステップ

AKS スケジューラ、その他の構成、ベスト プラクティスの詳細については、次のリソースを参照してください。