すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:負荷ベースのホットスポットデスケジューリングの使用

最終更新日:Jan 31, 2026

ack-koordinator コンポーネントは、負荷ベースのホットスポットデスケジューリング機能を提供します。この機能は、クラスター内のノード負荷の変動を検出し、安全な負荷しきい値を超えたノードから Pod を自動的にデスケジュールします。これにより、深刻な負荷の不均衡を防ぎます。このトピックでは、負荷ベースのホットスポットデスケジューリングの使用方法と、その詳細設定パラメーターについて説明します。

制限事項

  • ACK マネージド版 Pro クラスター のみがサポートされています。

  • 関連コンポーネントは、次のバージョン要件を満たす必要があります。

    コンポーネント

    バージョン要件

    ACK Scheduler

    v1.22.15-ack-4.0 以降、v1.24.6-ack-4.0 以降

    ack-koordinator

    v1.1.1-ack.1 以降

    Helm

    v3.0 以降

重要
  • K8s Spot Rescheduler は Pod のエビクションのみを行います。Pod はその後、ACK Scheduler によって再スケジュールされます。このデスケジューリング機能は、負荷認識スケジューリングと組み合わせて使用することを推奨します。これにより、ACK Scheduler はホットスポットノードへの Pod の再スケジュールを回避できます。

  • デスケジューリング中、新しい Pod が作成される前に古い Pod がエビクションされます。エビクションがアプリケーションの可用性に影響を与えないように、ご利用のアプリケーションに十分な冗長レプリカがあることを確認してください。

  • デスケジューリングは、標準の Kubernetes エビクション API を使用して Pod をエビクトします。エビクション後の再起動によってサービスが中断されないように、アプリケーション Pod のロジックが再入可能であることを確認してください。

課金

ack-koordinator コンポーネントは無料でインストールして使用できます。ただし、次のシナリオでは追加料金が発生する場合があります:

  • ack-koordinator は自己管理コンポーネントであり、インストール後にワーカーノードのリソースを消費します。コンポーネントのインストール時に、各モジュールのリソースリクエストを設定できます。

  • デフォルトでは、ack-koordinator はリソースプロファイリングや詳細なスケジューリングなどの機能のモニタリングメトリックを Prometheus 形式で公開します。コンポーネントの設定時に [ACK-Koordinator の Prometheus モニタリングを有効にする] オプションを選択し、Alibaba Cloud Prometheus サービスを使用する場合、これらのメトリックはカスタムメトリックと見なされ、料金が発生します。料金は、クラスターのサイズやアプリケーションの数などの要因によって異なります。この機能を有効にする前に、Alibaba Cloud Prometheus の「Prometheus インスタンスの課金」ドキュメントをよく読み、カスタムメトリックの無料クォータと課金ポリシーを理解してください。使用量データをクエリすることで、リソース使用量を監視および管理できます。

負荷ホットスポットデスケジューリングの概要

負荷認識スケジューリング

ACK スケジューラは負荷認識スケジューリングをサポートしており、負荷の低いノードに Pod をスケジュールできます。クラスター環境、トラフィック、リクエストが変化するため、ノード使用率も動的に変化します。これにより、クラスター内のノード間の負荷バランスが崩れ、深刻な負荷の不均衡が生じることさえあります。これは、ワークロードのランタイム品質に影響します。ack-koordinator は、ノード負荷の変化を識別し、安全な負荷しきい値を超えるノードから Pod を自動的にデスケジュールして、深刻な負荷の不均衡を防ぐことができます。負荷認識スケジューリングとホットスポットデスケジューリングを組み合わせることで、ノード間の最適な負荷分散を実現できます。詳細については、「負荷認識 Pod スケジューリングの使用」をご参照ください。

Koordinator Descheduler モジュールの仕組み

ack-koordinator コンポーネントは、Koordinator Descheduler モジュールを提供します。このモジュールでは、LowNodeLoad プラグインが負荷レベルを検出し、負荷ベースのホットスポットデスケジューリングを実行します。ネイティブ Kubernetes Descheduler の LowNodeUtilization プラグインとは異なり、LowNodeLoad プラグインはノードの実際のリソース使用率に基づいてデスケジューリングを決定しますが、LowNodeUtilization プラグインはリソース割り当て率に基づいて決定します。

実行手順

Koordinator Descheduler モジュールは定期的に実行されます。各実行サイクルは、次の 3 つのステージで構成されます。

Koordinator Descheduler execution procedure

  1. データ収集:クラスター内のノードとワークロード、およびそれらに関連するリソース使用率に関する情報を取得します。

  2. ポリシープラグインの実行。

    次のステップでは、LowNodeLoad プラグインを例として使用します。

    1. ホットスポットノードを識別します。ノードの分類の詳細については、「LowNodeLoad 負荷しきい値パラメーター」をご参照ください。

    2. すべてのホットスポットノードを走査し、移行可能な Pod を識別してソートします。Pod のスコアリングとソートの詳細については、「Pod スコアリングポリシー」をご参照ください。

    3. 移行対象のすべての Pod を走査し、クラスターサイズ、リソース使用率、複製された Pod の比率などの制約に基づいて、Pod が移行の要件を満たしているかどうかを確認します。詳細については、「負荷認識ホットスポットデスケジューリングポリシー」をご参照ください。

    4. Pod が条件を満たす場合、移行対象のレプリカとして分類されます。そうでない場合、プロセスは他の Pod とホットスポットノードの走査を続行します。

  3. Pod のエビクションと移行: 移行の要件を満たす Pod をエビクションします。詳細については、「API によって開始されるエビクション」をご参照ください。

LowNodeLoad 負荷しきい値パラメーター

LowNodeLoad プラグインには 2 つの重要なパラメーターがあります。

すべてのノードの負荷レベルが lowThresholds よりも高い場合、クラスター全体の負荷レベルが高いと見なされます。この場合、一部のノードの負荷レベルが highThresholds よりも高くても、Koordinator Descheduler はデスケジューリングを実行しません。

たとえば、次の図では、lowThresholds は 45% に設定され、highThresholds は 70% に設定されています。ノードは次の基準に基づいて分類されます。同様に、lowThresholdshighThresholds の値が変更されると、ノードの分類基準もそれに応じて変更されます。

image

デフォルトでは、リソース使用率データは 1 分ごとに更新されます。粒度は過去 5 分間の平均値です。

  • アイドルノード:リソース使用率が 45% 未満のノード。

  • 通常ノード:リソース使用率が 45% 以上 70% 以下のノード。この負荷レベルが望ましい範囲です。

  • ホットスポットノード:リソース使用率が 70% を超えるノード。ホットスポットノード上の一部の Pod は、負荷レベルを 70% 以下に下げるためにエビクションされます。

負荷ホットスポットデスケジューリングポリシー

ポリシー名

説明

ホットスポットチェックリトライポリシー

ホットスポット検出の精度を確保し、モニタリングデータのグリッチによる頻繁なアプリケーション移行を避けるため、Koordinator Descheduler はホットスポットチェックのリトライ設定をサポートしています。ノードは、しきい値を連続して複数回超えた場合にのみホットスポットとして識別されます。

ノードソートポリシー

識別されたホットスポットノードの中で、Koordinator Descheduler はリソース使用量の降順でノードのデスケジューリングを開始します。ノードのソート中、メモリと CPU のリソース使用量が順に比較されます。リソース使用量が高いノードが優先されます。

Pod スコアリングポリシー

各ホットスポットノードに対して、Koordinator Descheduler はその上の Pod をスコアリングしてソートし、その後エビクション操作を開始してアイドルノードに移行します。比較順序は次のとおりです:

  1. Priority が低い Pod。設定されていない場合、値は 0 で、最も低い優先度を示します。

  2. QoS クラスが低い Pod。

  3. 同じ Priority と QoS クラスを持つ Pod については、Koordinator Descheduler はリソース使用率や起動時間などの要因に基づいてソートします。

説明

Pod のエビクション順序に要件がある場合は、Pod に異なる Priority または QoS クラスを設定してください。

フィルターポリシー

Koordinator Descheduler モジュールは、使用中のグレースケール制御を容易にするために、Pod とノードに対する複数のフィルターパラメーターをサポートしています。

  • 名前空間によるフィルター:デスケジュール可能な Pod の名前空間を指定します。詳細については、「evictableNamespaces」をご参照ください。

  • Pod セレクターによるフィルター:デスケジュール可能な Pod のラベルセレクターを指定します。詳細については、「podSelectors」をご参照ください。

  • ノードセレクターによるフィルター:デスケジュール可能なノードのラベルセレクターを指定します。詳細については、「nodeSelector」をご参照ください。

事前チェックポリシー

Koordinator Descheduler モジュールは、各移行が可能な限り安全であることを保証するために、Pod 移行前の事前チェック機能を提供します。

  • ノードアフィニティとリソーススケジューリング能力をチェックして、移行を開始する前に、デスケジューリング後にクラスター内に一致するノードがあることを確認します。チェックされるプロパティには、ノードアフィニティ、ノードセレクター、Toleration、およびノードの未割り当てリソース容量が含まれます。

  • アイドルノードの実際のリソース使用量をチェックして、新しい Pod を受け取った後にホットスポットしきい値に達しないことを確認します。これにより、頻繁なジッターを回避します。

    数式:アイドルノードの利用可能容量 = (highThresholds - アイドルノードの現在の負荷) × アイドルノードの総容量

    たとえば、アイドルノードの負荷が 20%、highThresholds の値が 70%、ノードに 96 vCore があるとします。ノード上の利用可能な vCore 数は、次の数式に基づいて計算されます:48 = (70% - 20%) × 96。このシナリオでは、Koordinator Descheduler は、移行された Pod が要求する vCore の合計数が 48 を超えないことを保証します。

移行スロットリングポリシー

Pod 移行中のアプリケーションの高可用性を確保するために、Koordinator Descheduler は Pod 移行を制御するための複数の機能を提供します。ノード、名前空間、またはワークロードごとに同時に移行できる Pod の最大数を指定できます。Koordinator Descheduler では、同じワークロードに属する Pod があまりにも頻繁に移行されるのを防ぐために、Pod 移行タイムウィンドウを指定することもできます。Koordinator Descheduler は、オープンソース Kubernetes の PDB (Pod Disruption Budgets) メカニズムとも互換性があり、ワークロードの高可用性を確保するためのより詳細な管理ポリシーを設定できます。

可観測性ポリシー

イベントを通じてデスケジューリングの移行プロセスを観察し、詳細で移行の具体的な理由と現在のステータスを表示できます。以下はサンプルです。

kubectl get event | grep stress-demo-588f9646cf-7****
55s         Normal    Evicting           podmigrationjob/3bf8f623-4d10-4fc5-ab4e-2bead3c4****   Pod "default/stress-demo-588f9646cf-7****" evicted from node "cn-beijing.10.XX.XX.53" by the reason "node is overutilized, cpu usage(76.72%)>threshold(50.00%)"
22s         Normal    EvictComplete      podmigrationjob/3bf8f623-4d10-4fc5-ab4e-2bead3c4****   Pod "default/stress-demo-588f9646cf-7****" has been evicted
55s         Normal    Descheduled        pod/stress-demo-588f9646cf-7****                       Pod evicted from node "cn-beijing.10.XX.XX.53" by the reason "node is overutilized, cpu usage(76.72%)>threshold(50.00%)"
55s         Normal    Killing            pod/stress-demo-588f9646cf-7****                       Stopping container stress

ステップ 1: ack-koordinator でのデスケジューリングの有効化

  • クラスターに ack-koordinator コンポーネントがインストールされていない場合は、コンポーネントをインストールし、コンポーネント設定ページで [ack-koordinator のデスケジューリングを有効にする] を選択します。詳細については、「ack-koordinator コンポーネントのインストール」をご参照ください。

  • クラスターに ack-koordinator コンポーネントが既にインストールされている場合は、コンポーネント設定ページで [ack-koordinator のデスケジューリングを有効にする] を選択します。手順については、「ack-koordinator コンポーネントの変更」をご参照ください。

ステップ 2: 負荷ホットスポットデスケジューリングプラグインの有効化

  1. 次の YAML コンテンツを使用して `koord-descheduler-config.yaml` ファイルを作成します。

    `koord-descheduler-config.yaml` ファイルは、LowNodeLoad デスケジューリングプラグインを有効にするために使用される ConfigMap オブジェクトです。

    クリックして YAML ファイルの内容を表示します

    # koord-descheduler-config.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: koord-descheduler-config
      namespace: kube-system
    data:
      koord-descheduler-config: |
        # 以下の内容は koord-descheduler のシステム設定です。設定を変更しないでください。
        apiVersion: descheduler/v1alpha2
        kind: DeschedulerConfiguration
        leaderElection:
          resourceLock: leases
          resourceName: koord-descheduler
          resourceNamespace: kube-system
        deschedulingInterval: 120s # 実行間隔。デスケジューリングプラグインは 120 秒ごとに実行されます。
        dryRun: false # グローバル読み取り専用モードのスイッチ。このモードを有効にすると、Koordinator Descheduler は何も操作を実行しません。
        # システム設定の終わり。
    
        profiles:
        - name: koord-descheduler
          plugins:
            balance:
              enabled:
                - name: LowNodeLoad # 負荷ホットスポットデスケジューリングのために LowNodeLoad プラグインを有効にします。
            evict:
              enabled:
                - name: MigrationController # エビクションおよび移行コントローラーを有効にします。
    
          pluginConfig:
          - name: MigrationController # デスケジューリングおよび移行制御のパラメーター。
            args:
              apiVersion: descheduler/v1alpha2
              kind: MigrationControllerArgs
              defaultJobMode: EvictDirectly
    
          - name: LowNodeLoad # LowNodeLoad プラグインの設定。
            args:
              apiVersion: descheduler/v1alpha2
              kind: LowNodeLoadArgs
    
              lowThresholds:  # lowThresholds はアイドルノードの受付しきい値を指定します。すべてのリソースの使用率がしきい値を下回る場合、ノードはアイドルと見なされます。
                cpu: 20 # CPU 使用率は 20% です。
                memory: 30  # メモリ使用率は 30% です。
              highThresholds: # highThresholds はホットスポットノードの受付しきい値を指定します。いずれかのリソースの使用率がしきい値を超える場合、ノードはホットスポットと見なされます。
                cpu: 50  # CPU 使用率は 50% です。
                memory: 60 # メモリ使用率は 60% です。
    
              evictableNamespaces: # デスケジュール可能な名前空間。include と exclude パラメーターは相互排他的です。どちらか一方のみを設定できます。
                include: # include パラメーターは、以下の名前空間のみを処理することを指定します。
                  - default
                # exclude: # exclude パラメーターは、除外する名前空間を指定します。
                  # - "kube-system"
                  # - "koordinator-system"
  2. 次のコマンドを実行して、設定をクラスターに適用します。

    kubectl apply -f koord-descheduler-config.yaml
  3. 次のコマンドを実行して、Koordinator Descheduler モジュールを再起動します。

    Koordinator Descheduler モジュールを再起動すると、Koordinator Descheduler は最後に変更された設定を使用します。

    kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 0
    deployment.apps/ack-koord-descheduler scaled
    kubectl -n kube-system scale deploy ack-koord-descheduler --replicas 1
    deployment.apps/ack-koord-descheduler scaled

ステップ 3 (任意): スケジューラ負荷分散プラグインの有効化

ノード間の最適な負荷分散のためにスケジューラ負荷分散プラグインを有効にするには、「ステップ 1: 負荷認識スケジューリングの有効化」をご参照ください。

ステップ 4: デスケジューリング機能の検証

次の例では、それぞれ 104 コアと 396 GiB のメモリを持つ 3 つのノードがあるクラスターを使用します。

  1. 次の YAML コンテンツを使用して `stress-demo.yaml` ファイルを作成します。

    クリックして YAML ファイルの内容を表示します。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: stress-demo
      namespace: default
      labels:
        app: stress-demo
    spec:
      replicas: 6
      selector:
        matchLabels:
          app: stress-demo
      template:
        metadata:
          name: stress-demo
          labels:
            app: stress-demo
        spec:
          containers:
            - args:
                - '--vm'
                - '2'
                - '--vm-bytes'
                - '1600M'
                - '-c'
                - '2'
                - '--vm-hang'
                - '2'
              command:
                - stress
              image: polinux/stress
              imagePullPolicy: Always
              name: stress
              resources:
                limits:
                  cpu: '2'
                  memory: 4Gi
                requests:
                  cpu: '2'
                  memory: 4Gi
          restartPolicy: Always
  2. ストレステスト Pod を作成します。

    kubectl create -f stress-demo.yaml
    deployment.apps/stress-demo created
  3. Pod が実行中になるまでステータスを監視します。

    kubectl get pod -o wide

    期待される出力:

    NAME                           READY   STATUS    RESTARTS   AGE   IP            NODE                    NOMINATED NODE   READINESS GATES
    stress-demo-588f9646cf-s****   1/1     Running   0          82s   10.XX.XX.53   cn-beijing.10.XX.XX.53   <none>           <none>

    出力は、Pod stress-demo-588f9646cf-s**** がノード cn-beijing.10.XX.XX.53 にスケジュールされたことを示しています。

  4. ノード cn-beijing.10.XX.XX.53 の負荷レベルを上げ、各ノードの負荷を確認します。

    kubectl top node

    期待される出力:

    NAME                      CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
    cn-beijing.10.XX.XX.215   17611m       17%    24358Mi         6%
    cn-beijing.10.XX.XX.53    63472m       63%    11969Mi         3%

    出力は、ノード cn-beijing.10.XX.XX.53 の負荷が 63% と高く、設定されたホットスポットしきい値の 50% を超えていることを示しています。ノード cn-beijing.10.XX.XX.215 の負荷は 17% と低く、設定されたアイドルしきい値の 20% を下回っています。

  5. 負荷認識ホットスポットデスケジューリングを有効にします。詳細については、「ステップ 2: 負荷ベースのホットスポットデスケジューリングプラグインの有効化」をご参照ください。

  6. Pod の変更を監視します。

    Descheduler がホットスポットノードをチェックし、エビクションと移行を実行するのを待ちます。

    説明

    デフォルトでは、ノードが 5 回連続でホットスポットしきい値を超えた場合にホットスポットとして識別され、これには 10 分かかります。

    kubectl get pod -w

    期待される出力:

    NAME                           READY   STATUS               RESTARTS   AGE     IP           NODE                     NOMINATED NODE   READINESS GATES
    stress-demo-588f9646cf-s****   1/1     Terminating          0          59s   10.XX.XX.53    cn-beijing.10.XX.XX.53     <none>           <none>
    stress-demo-588f9646cf-7****   1/1     ContainerCreating    0          10s   10.XX.XX.215   cn-beijing.10.XX.XX.215    <none>           <none>
  7. イベントを監視します。

    kubectl get event | grep stress-demo-588f9646cf-s****

    期待される出力:

    2m14s       Normal    Evicting            podmigrationjob/00fe88bd-8d4c-428d-b2a8-d15bcdeb****   Pod "default/stress-demo-588f9646cf-s****" evicted from node "cn-beijing.10.XX.XX.53" by the reason "node is overutilized, cpu usage(68.53%)>threshold(50.00%)"
    101s        Normal    EvictComplete       podmigrationjob/00fe88bd-8d4c-428d-b2a8-d15bcdeb****   Pod "default/stress-demo-588f9646cf-s****" has been evicted
    2m14s       Normal    Descheduled         pod/stress-demo-588f9646cf-s****                       Pod evicted from node "cn-beijing.10.XX.XX.53" by the reason "node is overutilized, cpu usage(68.53%)>threshold(50.00%)"
    2m14s       Normal    Killing             pod/stress-demo-588f9646cf-s****                       Stopping container stress

    期待される出力は移行レコードであり、結果が期待通りであることを示しています。ホットスポットノード上の Pod は別のノードにデスケジュールされます。

詳細設定

Koordinator Descheduler モジュールの詳細設定パラメーター

Koordinator Descheduler のすべてのパラメーター設定は ConfigMap で提供されます。以下は、負荷ベースのホットスポットデスケジューリングの詳細設定パラメーターの形式を示しています。

クリックして YAML ファイルの内容を表示します。

# koord-descheduler-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: koord-descheduler-config
  namespace: kube-system
data:
  koord-descheduler-config: |
    # 以下の内容は koord-descheduler のシステム設定です。設定を変更しないでください。
    apiVersion: descheduler/v1alpha2
    kind: DeschedulerConfiguration
    leaderElection:
      resourceLock: leases
      resourceName: koord-descheduler
      resourceNamespace: kube-system
    deschedulingInterval: 120s # 実行間隔。デスケジューリングプラグインは 120 秒ごとに実行されます。
    dryRun: false # グローバル読み取り専用モードのスイッチ。このモードを有効にすると、koord-descheduler は何も操作を実行しません。
    # システム設定の終わり。

    profiles:
    - name: koord-descheduler
      plugins:
        deschedule: 
          disabled:
            - name: "*" # すべてのプラグインはデフォルトで無効になっています。明示的に設定する必要はありません。これはデモンストレーション目的です。
        balance:
          enabled:
            - name: LowNodeLoad # 負荷ホットスポットデスケジューリングのために LowNodeLoad プラグインを有効にします。
        evict:
          disabled:
            - name: "*" # すべてのプラグインはデフォルトで無効になっています。明示的に設定する必要はありません。これはデモンストレーション目的です。
          enabled:
            - name: MigrationController # エビクションおよび移行コントローラーを有効にします。

      pluginConfig:
      - name: MigrationController # デスケジューリングおよび移行制御のパラメーター。
        args:
          apiVersion: descheduler/v1alpha2
          kind: MigrationControllerArgs
          defaultJobMode: EvictDirectly
          maxMigratingPerNode: 1 # 各ノードで移行状態にできる Pod の最大数。
          maxMigratingPerNamespace: 1  # 各名前空間で移行状態にできる Pod の最大数。
          maxMigratingPerWorkload: 1 # 各ワークロード (デプロイメントなど) で移行状態にできる Pod の最大数。
          maxUnavailablePerWorkload: 2 # 各ワークロード (デプロイメントなど) の利用不可能なレプリカの最大数。
          evictLocalStoragePods: false # HostPath または EmptyDir で設定された Pod のデスケジュールを許可するかどうかを指定します。
          objectLimiters:
            workload: # ワークロードレベルでの Pod 移行のスロットリング。デフォルトでは、最初のエビクションから 5 分以内に最大 1 つのレプリカが移行できます。
              duration: 5m
              maxMigrating: 1

      - name: LowNodeLoad # LowNodeLoad プラグインの設定。
        args:
          apiVersion: descheduler/v1alpha2
          kind: LowNodeLoadArgs

          lowThresholds:  # lowThresholds はアイドルノードの受付しきい値を指定します。すべてのリソースの使用率がしきい値を下回る場合、ノードはアイドルと見なされます。
            cpu: 20 # CPU 使用率は 20% です。
            memory: 30  # メモリ使用率は 30% です。
          highThresholds: # highThresholds はホットスポットノードの受付しきい値を指定します。いずれかのリソースの使用率がしきい値を超える場合、ノードはホットスポットと見なされます。
            cpu: 50  # CPU 使用率は 50% です。
            memory: 60 # メモリ使用率は 60% です。

          anomalyCondition: # ホットスポットノードのチェック設定。
            consecutiveAbnormalities: 5 # ノードは、複数の連続した実行サイクルで highThresholds を超えた場合にのみホットスポットとして識別されます。カウンターはホットスポットノードがエビクションされた後にリセットされます。

          detectorCacheTimeout: "5m" # 異常チェックキャッシュのタイムアウト期間。デフォルト値:5 分。この値が deschedulingInterval で指定された実行間隔以上であることを確認してください。

          evictableNamespaces: # デスケジュール可能な名前空間。include と exclude パラメーターは相互排他的です。どちらか一方のみを設定できます。
            include: # include パラメーターは、以下の名前空間のみを処理することを指定します。
              - default
            # exclude: # exclude パラメーターは、除外する名前空間を指定します。
              # - "kube-system"
              # - "koordinator-system"

          nodeSelector: # 指定されたノードのみを処理します。
            matchLabels:
              alibabacloud.com/nodepool-id: np77f520e1108f47559e63809713ce****

          podSelectors: # 一部のタイプの Pod のみを処理します。
          - name: lsPods
            selector:
              matchLabels:
                koordinator.sh/qosClass: "LS"

Koordinator Descheduler のシステム設定

パラメーター

タイプ

説明

dryRun

boolean

  • true

  • false (デフォルト)

読み取り専用モードのスイッチ。有効にすると、Pod の移行は開始されません。

false

deschedulingInterval

time.Duration

>0s

デスケジューリングの実行間隔。負荷ホットスポットデスケジューリング機能を使用する場合、このパラメーターの値が LowNodeLoad プラグインの detectorCacheTimeout パラメーターの値以下であることを確認してください。

120s

エビクションと移行の制御設定

パラメーター

タイプ

説明

maxMigratingPerNode

int64

≥0 (デフォルト:2)

各ノードで移行状態にできる Pod の最大数。0 は制限なしを示します。

2

maxMigratingPerNamespace

int64

≥0 (デフォルト:無制限)

各名前空間で移行状態にできる Pod の最大数。0 は制限なしを示します。

1

maxMigratingPerWorkload

intOrString

≥0 (デフォルト:10%)

各ワークロード (デプロイメントなど) で移行状態にできる Pod の最大数または割合。0 は制限なしを示します。

ワークロードにレプリカが 1 つしかない場合、デスケジュールされません。

1 または 10%

maxUnavailablePerWorkload

intOrString

≥0 (デフォルト:10%)、かつワークロードのレプリカ総数未満

各ワークロード (デプロイメントなど) の利用不可能なレプリカの最大数または割合。0 は制限なしを示します。

1 または 10%

evictLocalStoragePods

boolean

  • true

  • false (デフォルト)

HostPath または EmptyDir で設定された Pod のデスケジュールを許可するかどうかを指定します。セキュリティ上の理由から、デフォルトでは無効になっています。

false

objectLimiters.workload

次のデータ形式の構造体:

type MigrationObjectLimiter struct {
    Duration time.Duration `json:"duration,omitempty"`
    MaxMigrating *intstr.IntOrString `json:"maxMigrating,omitempty"`
}
  • Duration の値は 0 秒より大きい (デフォルト:5m)

  • MaxMigrating の値は ≥0 (デフォルト:10%)

ワークロードレベルでの Pod 移行のスロットリング。

  • Duration:タイムウィンドウの長さ。たとえば、5m は 5 分を示します。

  • MaxMigrating:レプリカの数または割合。整数またはパーセンテージに設定できます。デフォルト値は maxMigratingPerWorkload から取得されます。

objectLimiters:
  workload:
    duration: 5m
    maxMigrating: 1

これは、1 つのワークロードに対して 5 分以内に最大 1 つのレプリカが移行できることを示します。

LowNodeLoad プラグインの設定

パラメーター

タイプ

説明

highThresholds

map[string]float64

説明

CPU とメモリのディメンションをサポートします。値はパーセンテージです。

[0,100]

負荷のホットスポット水位。このしきい値を超えるノード上の Pod のみがデスケジューリングに参加します。このしきい値を下回るノード上の Pod はデスケジュールされません。スケジューラの負荷認識スケジューリング機能も有効にすることを推奨します。詳細については、「ポリシーの説明」をご参照ください。これら 2 つの機能を組み合わせて使用する方法については、「負荷認識スケジューリングと負荷認識ホットスポットデスケジューリングを組み合わせて使用するにはどうすればよいですか?」をご参照ください。

すべてのノードの負荷レベルが lowThresholds よりも高い場合、これはクラスター全体の負荷が高いことを示します。ノードの負荷レベルが highThresholds よりも高くても、Koordinator Descheduler はデスケジューリングを実行しません。

highThresholds:
  cpu: 55 # CPU 使用率のホットスポットしきい値は 55% です。
  memory: 75 # メモリ使用率のホットスポットしきい値は 75% です。

lowThresholds

map[string]float64

説明

CPU とメモリのディメンションをサポートします。値はパーセンテージです。

[0,100]

アイドル負荷しきい値。

すべてのノードの使用率レベルが lowThresholds よりも高い場合、クラスター全体の使用率が高いと見なされ、いずれかのノードの使用率レベルが highThresholds よりも高くても、Koordinator Descheduler はデスケジューリングを実行しません。

lowThresholds:
  cpu: 25 # CPU 使用率のアイドルしきい値は 25% です。
  memory: 25 # メモリ使用率のアイドルしきい値は 25% です。

anomalyCondition.consecutiveAbnormalities

int64

>0 (デフォルト:5)

ホットスポットチェックのリトライ回数。ノードは、複数の連続した実行サイクルで highThresholds を超えた場合にのみホットスポットとして識別されます。カウンターはホットスポットノードがエビクションされた後にリセットされます。

5

detectorCacheTimeout

*metav1.Duration

Duration 形式の詳細については、「Duration」をご参照ください。(デフォルト値:5m)

ホットスポットチェックのキャッシュ期間。負荷ホットスポットデスケジューリング機能を使用する場合、このパラメーターの値がシステム設定の deschedulingInterval の値以上であることを確認してください。

  • 1h

  • 300s

  • 2m30s

evictableNamespaces

  • 以下を含める: 文字列

  • exclude: string

クラスター内の名前空間

デスケジュール可能な名前空間。このパラメーターを空のままにすると、すべての Pod がデスケジュール可能になります。

includeexclude ポリシーがサポートされています。2 つのポリシーは相互排他的です。

  • include:指定された名前空間のみを処理します。

  • exclude:指定された名前空間を除くすべての名前空間を処理します。

evictableNamespaces:
  exclude:
    - "kube-system"
    - "koordinator-system"

nodeSelector

metav1.LabelSelector

LabelSelector 形式の詳細については、「ラベルとセレクター」をご参照ください

LabelSelector を使用してターゲットノードを選択します。

このパラメーターは 2 つの方法で設定できます。1 つは単一のノードプールを指定する方法、もう 1 つは複数のノードプールを指定する方法です。

  • 方法 1

    # 指定された単一ノードプール内のマシンのみを処理します。
    nodeSelector:
      matchLabels:
        alibabacloud.com/nodepool-id: np77f520e1108f47559e63809713ce****
  • 方法 2

    # 指定された複数のノードプール内のマシンのみを処理します。
    nodeSelector:
      matchExpressions:
      - key: alibabacloud.com/nodepool-id
        operator: In
        values:
        - node-pool1
        - node-pool2

podSelectors

PodSelector オブジェクトで構成されるリスト。複数の Pod グループを設定できます。PodSelector のデータ形式は次のとおりです:

type PodSelector struct {
    name     string
    selector metav1.LabelSelector
}

LabelSelector 形式の詳細については、「ラベルとセレクター」をご参照ください

LabelSelector を使用して、デスケジューリングが有効になっている Pod を選択します。

# LS タイプの Pod のみを処理します。
podSelectors:
- name: lsPods
  selector:
    matchLabels:
      koordinator.sh/qosClass: "LS"

よくある質問

ノードの使用率がしきい値に達しても、ノード上の Pod がエビクションされない場合はどうすればよいですか?

この問題は、次の理由で発生する可能性があります。対応するソリューションを参照して問題を解決できます。

原因の分類

原因の説明

ソリューション

コンポーネント設定が有効でない

有効範囲が指定されていない。

Descheduler の設定には、Pod とノードの有効範囲が含まれます。対応する名前空間とノードが有効になっているか確認してください。

設定変更後に Descheduler が再起動されていない。

Descheduler の設定を変更した後、変更を有効にするには再起動する必要があります。Descheduler の再起動方法の詳細については、「ステップ 2: 負荷ベースのホットスポットデスケジューリングプラグインの有効化」をご参照ください。

不適切なコンポーネント設定

Descheduler コンポーネントの実行間隔が LowNodeLoad プラグインのキャッシュ期間より長いため、ホットスポットノードの検出が無効になる。

deschedulingInterval パラメーターの値 (デフォルト:2 分) は、LowNodeLoad プラグインの detectorCacheTimeout パラメーターの値 (デフォルト:5 分) 以下である必要があります。設定を調整した後、Descheduler を再起動してください。

ノードの状態が条件を満たさない

ノードの平均使用率が長時間しきい値を下回っている。

Descheduler は一定期間の使用率を継続的に監視し、モニタリングデータの平滑化された平均値を計算します。そのため、デスケジューリングは、ノードの使用率が継続的にしきい値を超えた場合にのみトリガーされます。デフォルトでは、この期間は約 10 分です。ただし、kubectl top node が返す使用率は直近 1 分間のものにすぎません。リトライ回数と実行間隔の設定に基づいて、一定期間のノードの使用率を監視し、必要に応じて設定を調整してください。

クラスターの残存容量が不足している。

Pod をエビクションする前に、Descheduler はクラスター内の他のノードをチェックして、移行に十分な容量があることを確認します。たとえば、8 コアと 16 GiB のメモリを必要とする Pod がエビクション対象として選択されたが、クラスター内の他のすべてのノードの利用可能容量がこの値を下回っている場合、Descheduler はセキュリティ上の理由から Pod を移行しません。この場合、ノードを追加してクラスターの容量を確保することを検討してください。

ワークロードのプロパティ制約

ワークロードが単一レプリカ版である。

単一レプリカアプリケーションの高可用性を確保するため、これらの Pod はデフォルトではデスケジュールされません。そのような単一レプリカアプリケーションを評価し、Pod をデスケジュールしたい場合は、Pod またはデプロイメントや StatefulSet などのワークロードの TemplateSpec にアノテーション descheduler.alpha.kubernetes.io/evict: "true" を追加してください。

説明

このアノテーション設定は v1.3.0-ack1.6、v1.3.0-ack1.7、または v1.3.0-ack1.8 ではサポートされていません。コンポーネントを最新バージョンにアップグレードするには、「コンポーネントのインストールと管理」をご参照ください。

Pod が HostPath または EmptyDir を指定している。

デフォルトでは、`emptyDir` または `hostPath` で設定された Pod は、データセキュリティを確保するためにデスケジューリングから除外されます。これらの Pod をデスケジュールしたい場合は、`evictLocalStoragePods` 設定をご参照ください。詳細については、「エビクションと移行の制御設定」をご参照ください。

利用不可能なレプリカまたは移行中のレプリカの数が多すぎる。

デプロイメントや StatefulSet などのワークロードの利用不可能なレプリカまたは移行中のレプリカの数が設定された制限 (maxUnavailablePerWorkload または maxMigratingPerWorkload) を超えると、Descheduler はエビクションを開始しません。たとえば、maxUnavailablePerWorkloadmaxMigratingPerWorkload が 20% に設定され、デプロイメントの望ましいレプリカ数が 10 で、2 つの Pod がエビクション中またはリリース中の場合、Descheduler はこれ以上 Pod をエビクションしません。Pod のエビクションまたはリリースが完了するのを待つか、これら 2 つの設定の値を増やしてください。

レプリカ数の制約設定が正しくない。

ワークロードのレプリカ総数が maxMigratingPerWorkload または maxUnavailablePerWorkload の値以下の場合、Descheduler はセキュリティ上の理由からワークロードをデスケジュールしません。これを解決するには、これら 2 つの設定の値を減らすか、パーセンテージに変更してください。

Descheduler が頻繁に再起動するのはなぜですか?

Descheduler は、その ConfigMap が無効であるか存在しない場合に頻繁に再起動することがあります。詳細については、「詳細設定」をご参照ください。ConfigMap の内容と形式を確認し、ConfigMap を変更してから Descheduler を再起動してください。Descheduler の再起動方法の詳細については、「ステップ 2: 負荷ベースのホットスポットデスケジューリングプラグインの有効化」をご参照ください。

負荷認識スケジューリングと負荷ホットスポットデスケジューリングを併用するにはどうすればよいですか?

負荷ベースのホットスポットデスケジューリングを有効にすると、ホットスポットノード上の Pod がエビクションされます。ACK スケジューラは、デプロイメントなどの上位コントローラーによって作成された Pod に適切なノードを選択します。最適な負荷分散を実現するために、同時に負荷認識スケジューリングを有効にすることを推奨します。詳細については、「負荷認識スケジューリングの使用」をご参照ください。

負荷認識スケジューリングの loadAwareThreshold パラメーターを、K8s Spot Rescheduler の highThresholds パラメーターと同じ値に設定することを推奨します。詳細については、「スケジューリングポリシー」をご参照ください。ノードの負荷が highThresholds を超えると、K8s Spot Rescheduler はそのノード上の Pod をエビクションします。スケジューラはその後、loadAwareThreshold を使用して、新しい Pod がホットスポットノードにスケジュールされるのを防ぎます。パラメーターを同じ値に設定しない場合、エビクションされた Pod がホットスポットノードに再スケジュールされる可能性があります。この問題は、Pod がスケジュール可能なノードの範囲を指定しているが、利用可能なノードが少なく、これらのノードのリソース使用率が類似している場合に発生しやすくなります。

デスケジューリングが参照する使用率アルゴリズムは何ですか?

Descheduler は一定期間のリソース使用量を継続的に監視し、平均値を計算します。ノードがデスケジュールされるのは、その平均リソース使用量が一定期間 (デフォルトでは 10 分) しきい値を超え続けた場合のみです。メモリについては、オペレーティングシステムがこれらのリソースを再利用できるため、Descheduler の使用量計算ではページキャッシュが除外されます。対照的に、kubectl top node コマンドが返す使用量にはページキャッシュが含まれます。Managed Service for Prometheus を使用して、実際のメモリ使用量を確認できます。