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

Container Service for Kubernetes:負荷認識ホットスポットのスケジューリング解除の操作

最終更新日:Dec 20, 2024

ack-koordinatorは、負荷認識ホットスポットのスケジューリング解除機能を提供します。これにより、クラスターノードの負荷の変化を検出し、安全負荷を超えるノードを自動的に最適化して、極端な負荷の不均衡を防ぎます。 このトピックでは、負荷認識ホットスポットのスケジューリング解除機能を使用する方法と、この機能の詳細設定を構成する方法について説明します。

制限事項

  • ACK Proクラスターのみが、負荷認識ホットスポットのスケジューリング解除をサポートしています。 詳細については、「ACK管理クラスターの作成」をご参照ください。

  • 負荷認識型ホットスポットのスケジューリング解除機能を使用するには、次の要件が満たされていることを確認します。

    コンポーネント

    必要なバージョン

    ACKスケジューラ

    v1.22.15-ack-4.0以降またはv1.24.6-ack-4.0以降

    ack-koordinator

    v1.1.1-ack.1以降

    ヘルム

    3.0以降

重要
  • デスケジューラはポッドのみを追い出し、ACKスケジューラはポッドを再スケジュールします。 負荷認識スケジューリングと一緒にスケジュール解除機能を使用することを推奨します。 これにより、ACKスケジューラは、ポッドを再びホットスポットにスケジューリングすることを回避できる。

  • 再スケジュールプロセス中に、古いポッドが追い出され、新しいポッドが作成されます。 削除中にアプリケーションの可用性に影響を与えないように、アプリケーションに十分な冗長レプリカがあることを確認します。

  • スケジュール解除プロセスでは、標準のKubernetes eviction APIを使用してポッドを削除します。 アプリケーションポッドのロジックがリエントラントで、削除後のポッドの再起動によりサービスがダウンしていないことを確認します。 詳細については、「API開始の立ち退き」をご参照ください。

課金

ack-koordinatorコンポーネントをインストールまたは使用する場合、料金はかかりません。 ただし、次のシナリオでは料金が請求される場合があります。

  • ack-koordinatorは、インストール後にワーカーノードリソースを占有する管理対象外のコンポーネントです。 コンポーネントのインストール時に、各モジュールが要求するリソースの量を指定できます。

  • 既定では、ack-koordinatorは、リソースプロファイリングや細粒度スケジューリングなどの機能のモニタリングメトリックをPrometheusメトリックとして公開します。 ack-koordinatorのPrometheusメトリクスを有効にし、PrometheusのManaged Serviceを使用する場合、これらのメトリクスはカスタムメトリクスと見なされ、料金が課金されます。 料金は、クラスターのサイズやアプリケーションの数などの要因によって異なります。 Prometheusメトリクスを有効にする前に、Prometheusのマネージドサービスの課金トピックを読んで、カスタムメトリクスの無料クォータと課金ルールについて確認することをお勧めします。 リソース使用量を監視および管理する方法の詳細については、「観察可能なデータ量と請求書の照会」をご参照ください。

負荷認識ホットスポットのスケジューリング解除の概要

負荷認識ポッドのスケジューリング

ACKスケジューラは、低負荷で動作するノードにポッドをスケジュールすることができる負荷認識スケジューリングをサポートする。 クラスタ環境、トラフィック、および要求の変化に起因して、ノードの利用は動的に変化し、クラスタ内のノード間の負荷バランスを破壊する可能性があり、さらには極端な負荷不均衡をもたらす可能性がある。 これは、ワークロードのランタイム品質に影響します。 ack-koordinatorは、ノードの負荷の変化を特定し、安全負荷を超えるノードを自動的に最適化して、極端な負荷の不均衡を防ぎます。 負荷認識スケジューリングとホットスポットのデスケジューリングを組み合わせて使用すると、ノード間で最適な負荷分散を実現できます。 詳細については、「負荷対応のポッドスケジューリングの使用」をご参照ください。

コーディネーターDeschedulerの仕組み

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

スケジュール解除手順

Koordinator Deschedulerは定期的にスケジューリング解除を実行します。 次の図は、各サイクル内のスケジュール解除の手順を示しています。

koorle-descheduler执行过程

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

  2. ポリシープラグインによるポリシー実装のスケジュール解除。

    このセクションでは、例としてLowNodeLoadを使用します。

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

    2. すべてのホットスポットノードを横断し、ポッドを移行できるノードを識別し、ポッドをソートします。 ポッドのスコアリングおよびソート方法の詳細については、「ポッドスコアリングポリシー」をご参照ください。

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

    4. 要件を満たすポッドのみが移行されます。 現在のノードの要件を満たすポッドがない場合、LowNodeLoadは他のホットスポットノードのポッドを引き続きトラバースします。

  3. ポッドの削除と移行: 移行の要件を満たすポッドを削除します。 詳細については、「API開始の立ち退き」をご参照ください。

ロードしきい値

LowNodeLoadプラグインを使用すると、次のロードしきい値を設定できます。

すべてのノードの負荷がlowThresholdsの値よりも高い場合、クラスターの全体的な負荷は高いと見なされます。 一部のノードの負荷がhighThresholdの値を超えても、Koordinator Deschedulerはスケジューリング解除を実行しません。

次の図では、lowThresholdが45% に設定され、highThresholdが70% に設定されています。 ノードは、その負荷および閾値に基づいて分類される。 lowThresholdshighThresholdsの値が変わると、ノード分類の基準も変わります。

image

リソース使用率の統計は1分ごとに更新され、前の5分間の平均値が表示されます。

  • アイドルノード: リソース使用率が45% より低いノード。

  • 通常のノード: リソース使用率が45% 以上70% 以下のノード。 これは、クラスターノードの望ましいリソース使用範囲です。

  • ホットスポットノード: リソース使用率が70より高いノード。 ホットスポットノード上のポッドは、これらのノードのリソース使用率が70% 以下に低下するまで追い出されます。

負荷認識ホットスポットのスケジューリング解除ポリシー

ポリシー

説明

ホットスポット検出周波数ポリシー

ホットスポットノードを正確に識別し、モニタリングデータの遅延によるポッドの頻繁な移行を回避するために、Koordinator Deschedulerではホットスポット検出の頻度を指定できます。 ノードは、ノードが連続して負荷しきい値を超える回数が指定された頻度値に達した場合にのみ、ホットスポットノードと見なされます。

ノードソートポリシー

ホットスポットノードが識別されると、Koordinator Deschedulerはリソース使用量の降順でノードをソートし、ノードを順番にデスケジュールします。 Koordinator Deschedulerは、ホットスポットノードのメモリおよびCPU使用量を比較し、好ましくは、リソース使用量がより高いノードをスケジュール解除する。

ポッドスコアリングポリシー

Koordinator Deschedulerは、各ホットスポットノードのポッドをスコア付けしてソートし、次の順序でポッドをアイドルノードに追い出します。

  1. 優先度の低いポッド。 デフォルトの優先度は0で、最低です。

  2. サービス品質 (QoS) クラスの低いポッド。

  3. 同じ優先度とQoSクラスを持つポッドの場合、Koordinator Deschedulerはリソース使用量や起動時間などの要因に基づいて並べ替えます。

説明

ポッドの削除順序に特定の要件がある場合は、ポッドに異なる優先順位またはQoSクラスを設定することをお勧めします。

フィルタリングポリシー

Koordinator Deschedulerを使用すると、さまざまなポッドおよびノードフィルターを設定してスケジューリング解除を制御できます。

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

  • Filter by pod selector: スケジュール解除可能なポッドのラベルセレクターを指定します。 詳細については、「podSelectors」をご参照ください。

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

Precheckポリシー

Koordinator Deschedulerは、ポッドを移行する前にポッドを事前にチェックできます。

  • ポッドのスケジュールを解除する前に、ノードアフィニティとポッドスケジューリングに使用できるノードを確認します。 ノードの次の属性がチェックされます: ノードアフィニティ、ノードセレクタ、許容範囲、および未割り当てリソース。

  • アイドル状態のノードのリソース使用量をチェックして、ポッドがノードにスケジュールされた後、リソース使用量が負荷しきい値を超えないようにします。 これにより、スケジューリング解除の頻繁なトリガーが回避されます。

    式: アイドルノードで利用可能なリソース=(highThresholdes-アイドルノードの負荷) × アイドルノードの合計リソース

    たとえば、アイドルノードの負荷は20% であり、highThresholdの値は70% であり、ノードは96 vCoresを持っています。 ノード上の使用可能なvCoresの数は、次の式に基づいて計算されます。48 = (70% - 20%) × 96。 このシナリオでは、Koordinator Deschedulerは、移行されたポッドによって要求されたvCoresの総数が48を超えないようにします。

移行制御ポリシー

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

Observabilityポリシー

イベントを収集してスケジュール解除手順を監視し、スケジュール解除の理由とステータスをイベントの詳細に表示できます。 次のコードブロックに例を示します。

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-slo-manager) のインストール] ページで、[ack-koordinatorのデスケジューラの有効化] を選択します。 詳細については、「ack-koordinatorのインストール」をご参照ください。

ack-koordinatorの変更 (ack-koordinatorは既にインストール済み)

ack-koordinatorを変更します。 ack-koordinatorパラメーターページで、ack-koordinatorのデスケジューラの有効化を選択します。 詳細については、「ack-koordinatorの変更」をご参照ください。

ステップ2: LowNodeLoadプラグインの有効化

  1. [koord-descheduler-config.yaml] という名前のファイルを作成し、次のYAMLコンテンツをファイルに追加します。

    koord-descheduler-config.yamlファイルは、LowNodeLoadプラグインを有効にするために使用されるConfigMapです。

    クリックして詳細を表示

    # koord-descheduler-config.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: koord-descheduler-config
      namespace: kube-system
    data:
      koord-descheduler-config: |
        # Do not modify the following system configuration of koord-desheduler. 
        apiVersion: descheduler/v1alpha2
        kind: DeschedulerConfiguration
        leaderElection:
          resourceLock: leases
          resourceName: koord-descheduler
          resourceNamespace: kube-system
        deschedulingInterval: 120s # The interval at which LowNodeLoad runs. The interval is set to 120 seconds in this example. 
        dryRun: false # The global read-only mode. After you enable this mode, Koordinator Descheduler does not perform any operations. 
        # The preceding configuration is the system configuration. 
    
        profiles:
        - name: koord-descheduler
          plugins:
            deschedule:
              disabled:
                - name: "*"
            balance:
              enabled:
                - name: LowNodeLoad # Enable the LowNodeLoad plug-in. 
            evict:
              disabled:
                - name: "*"
              enabled:
                - name: MigrationController # Enable the migration controller. 
    
          pluginConfig:
          - name: MigrationController # Configure the parameters of the migration controller. 
            args:
              apiVersion: descheduler/v1alpha2
              kind: MigrationControllerArgs
              defaultJobMode: EvictDirectly
    
          - name: LowNodeLoad # Configure the LowNodeLoad plug-in. 
            args:
              apiVersion: descheduler/v1alpha2
              kind: LowNodeLoadArgs
    
              lowThresholds:  # Specify the low resource threshold for identifying idle nodes. Nodes whose load is lower than the threshold are considered idle nodes. 
                cpu: 20 # The low CPU utilization threshold is 20%. 
                memory: 30  # The low memory utilization threshold is 30%. 
              highThresholds: # Specify the high resource threshold for identifying hotspot nodes. Nodes whose load is higher than the threshold are considered hotspot nodes. 
                cpu: 50  # The high CPU utilization threshold is 50%. 
                memory: 60 # The high memory utilization threshold is 60%. 
    
              evictableNamespaces: # Specify the namespaces that you want to include or exclude for descheduling. The include and exclude lists are mutually exclusive. 
                include: # Specify the namespaces that you want to include for descheduling. 
                  - default
                # exclude: # Specify the namespaces that you want to exclude for descheduling. 
                  # - "kube-system"
                  # - "koordinator-system"
  2. 次のコマンドを実行して、クラスターに設定を適用します。

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

    コーディネーター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: 負荷認識ホットスポットのスケジューリング解除を確認する

このセクションでは、3つのノードを含むクラスターを例として使用します。 各ノードには104 vCoreと396 GBのメモリがあります。

  1. という名前のファイルを作成します。stress-demo.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. 次のコマンドを実行して、ストレステスト用のポッドを作成します。

    kubectl create -f stress-demo.yaml
    deployment.apps/stress-demo created
  3. 次のコマンドを実行して、実行が開始されるまでポッドのステータスを表示します。

    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>

    出力は、ポッドの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: LowNodeLoadプラグインの有効化」をご参照ください。

  6. 次のコマンドを実行して、ポッドの変更を表示します。

    デスケジューラがホットスポットノードを識別し、ポッドを削除するのを待ちます。

    説明

    ノードが10分以内に5回連続して高リソースしきい値を超える場合、ノードはホットスポットノードと見なされます。

    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

    出力は移行結果を示します。 ホットスポットノード上のポッドがアイドルノードに移行されます。

拡張設定

Koordinator Deschedulerの詳細設定

Koordinator Deschedulerの設定はConfigMapに格納されます。 次のコードブロックは、負荷認識ホットスポットのスケジューリング解除の詳細設定を示しています。

クリックして詳細を表示

# koord-descheduler-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: koord-descheduler-config
  namespace: kube-system
data:
  koord-descheduler-config: |
    # Do not modify the following system configuration of koord-desheduler. 
    apiVersion: descheduler/v1alpha2
    kind: DeschedulerConfiguration
    leaderElection:
      resourceLock: leases
      resourceName: koord-descheduler
      resourceNamespace: kube-system
    deschedulingInterval: 120s # The interval at which LowNodeLoad runs. The interval is set to 120 seconds in this example. 
    dryRun: false # The global read-only mode. After you enable this mode, koord-descheduler does not perform any operations. 
    # The preceding configuration is the system configuration. 

    profiles:
    - name: koord-descheduler
      plugins:
        deschedule:
          disabled:
            - name: "*"
        balance:
          enabled:
            - name: LowNodeLoad # Enable the LowNodeLoad plug-in. 
        evict:
          disabled:
            - name: "*"
          enabled:
            - name: MigrationController # Enable the migration controller. 

      pluginConfig:
      - name: MigrationController # Configure the parameters of the migration controller. 
        args:
          apiVersion: descheduler/v1alpha2
          kind: MigrationControllerArgs
          defaultJobMode: EvictDirectly
          maxMigratingPerNode: 1 # The maximum number of pods that can be migrated at the same time on a node. 
          maxMigratingPerNamespace: 1  # The maximum number of pods that can be migrated at the same time in a namespace. 
          maxMigratingPerWorkload: 1 # The maximum number of pods that can be migrated at the same time in a workload, such as a Deployment. 
          maxUnavailablePerWorkload: 2 # The maximum number of unavailable replicated pods that are allowed in a workload, such as a Deployment. 
          evictLocalStoragePods: false # Specify whether pods that are configured with the emptyDir or hostPath can be descheduled.
          objectLimiters:
            workload: # Control workload-specific pod migration. By default, the system can migrate only one replicated pod within 5 minutes after the first eviction. 
              duration: 5m
              maxMigrating: 1

      - name: LowNodeLoad # Configure the LowNodeLoad plug-in. 
        args:
          apiVersion: descheduler/v1alpha2
          kind: LowNodeLoadArgs

          lowThresholds:  # Specify the low resource threshold for identifying idle nodes. Nodes whose load is lower than the threshold are considered idle nodes. 
            cpu: 20 # The low CPU utilization threshold is 20%. 
            memory: 30  # The low memory utilization threshold is 30%. 
          highThresholds: # Specify the high resource threshold for identifying hotspot nodes. Nodes whose load is higher than the threshold are considered hotspot nodes. 
            cpu: 50  # The high CPU utilization threshold is 50%. 
            memory: 60 # The high memory utilization threshold is 60%. 

          anomalyCondition: # The hotspot node detection setting. 
            consecutiveAbnormalities: 5 # A node is considered a hotspot node if the node exceeds the highThresholds within five consecutive hotspot detection cycles. Hotspot nodes are descheduled and then the counter is reset. 

          evictableNamespaces: # Specify the namespaces that you want to include or exclude for descheduling. The include and exclude lists are mutually exclusive. 
            include: # Specify the namespaces that you want to include for descheduling. 
              - default
            # exclude: # Specify the namespaces that you want to exclude for descheduling. 
              # - "kube-system"
              # - "koordinator-system"

          nodeSelector: # Only the specified nodes can be descheduled. 
            matchLabels:
              alibabacloud.com/nodepool-id: np77f520e1108f47559e63809713ce****

          podSelectors: # Only the specified pods can be descheduled. 
          - name: lsPods
            selector:
              matchLabels:
                koordinator.sh/qosClass: "LS"

コーディネーターDeschedulerシステム设定

パラメーター

タイプ

有効値

説明

dryRun

Boolean

  • true

  • false (デフォルト値)

グローバル読み取り専用モード。The global read-only mode. このモードを有効にすると、ポッドは移行できません。

false

deschedulingInterval

time. デュレーション

> 0s

スケジュール解除間隔。

120s

移行制御の設定

パラメーター

タイプ

有効値

説明

maxMigratingPerNode

int64 型

≥ 0 (デフォルト値: 2)

ノードで同時に移行できるポッドの最大数。 0の値は、制限が設定されていないことを示します。

2

maxMigratingPerNamespace

int64 型

≥ 0 (デフォルト値: 0)

名前空間内で同時に移行できるポッドの最大数。 0の値は、制限が設定されていないことを示します。

1

maxMigratingPerWorkload

intOrString

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

デプロイなどのワークロードで同時に移行できるポッドの最大数または割合。 0の値は、制限が設定されていないことを示します。

ワークロードにレプリケートされたポッドが1つしか含まれていない場合、そのワークロードはスケジュール解除対象から除外されます。

1または10%

maxUnavailablePerWorkload

intOrString

0 (デフォルト値: 10%) 以上で、ワークロードのレプリケートされたポッドの数より小さい

展開などのワークロードで許可されている、利用できないレプリケートポッドの最大数または割合。 0の値は、制限が設定されていないことを示します。

1または10%

evictLocalStoragePods

Boolean

  • true

  • false (デフォルト値)

emptyDirまたはhostPathで構成されているポッドをスケジュール解除できるかどうかを指定します。 デフォルトでは、データセキュリティを確保するためにこの機能は無効になっています。

false

objectLimiters.workload

次の形式の構造体:

type MigrationObjectLimiter struct {
    Duration time.Duration `json:"duration,omitempty"`
    MaxMigrating *intstr.IntOrString `json:"maxMigrating,omitempty"`
}
  • Duration: > 0 (デフォルト値: 5m) の有効値

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

ワークロード固有のポッド移行制御。

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

  • MaxMigrating: 同時に移行できるレプリケートされたポッドの最大数または割合。 整数またはパーセント値に設定します。 デフォルトでは、maxMigratingPerWorkloadの値が使用されます。

objectLimiters:
  workload:
    duration: 5m
    maxMigrating: 1

この例では、ワークロードで5分以内に移行できるレプリケートポッドは1つだけです。

LowNodeLoadの設定

パラメーター

タイプ

有効値

説明

highThresholds

map[string]float64

説明

パラメーターをパーセント値に設定します。 このパラメーターは、ポッドまたはノードに指定できます。

[0,100]

高負荷しきい値をします。 負荷がこのしきい値より高いノード上のポッドはスケジュール解除されます。 ACKスケジューラの負荷認識スケジューリング機能を有効にすることを推奨します。 詳細については、「スケジューリングポリシー」をご参照ください。 それらを組み合わせて使用する方法の詳細については、負荷認識スケジューリングと負荷認識ホットスポットのスケジューリング解除の組み合わせを使用するにはどうすればよいですか?

すべてのノードの負荷がlowThresholdsの値よりも高い場合、クラスターの全体的な負荷は高いと見なされます。 一部のノードの負荷がhighThresholdの値を超えても、Koordinator Deschedulerはスケジューリング解除を実行しません。

highThresholds:
  cpu: 55 # The high CPU utilization threshold is set to 55%. 
  memory: 75 # The high memory utilization threshold is set to 75%.

lowThresholds

map[string]float64

説明

パラメーターをパーセント値に設定します。 このパラメーターは、ポッドまたはノードに指定できます。

[0,100]

低いリソースしきい値。

すべてのノードの負荷がlowThresholdsの値よりも高い場合、クラスターの全体的な負荷は高いと見なされます。 一部のノードの負荷がhighThresholdの値を超えても、Koordinator Deschedulerはスケジューリング解除を実行しません。

lowThresholds:
  cpu: 25 # The low CPU utilization threshold is set to 25%. 
  memory: 25 # The low memory utilization threshold is set to 25%. 

anomalyCondition. continuitiveAbnormalities

int64 型

> 0 (デフォルト値: 5)

ホットスポット検出周波数。 ノードが指定された連続数のホットスポット検出サイクル内でhighThresholdsを超える場合、ノードはホットスポットノードと見なされます。 ホットスポットノードがスケジュール解除され、その後カウンタがリセットされる。

5

evictableNamespaces

  • include: 文字列

  • exclude: 文字列

クラスター内の名前空間

スケジュール解除のために含める、または除外する名前空間。 このパラメーターを空のままにすると、すべてのポッドをスケジュール解除できます。

includeまたはexcludeリストを指定できます。 リストは相互に排他的です。

  • include: スケジュール解除のために含める名前空間を指定します。

  • exclude: スケジュール解除のために除外する名前空間を指定します。

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

nodeSelector

metav1.LabelSelector

LabelSelectorの形式の詳細については、「Labels and Selectors」をご参照ください。

LabelSelectorを使用してノードを選択します。

このパラメーターを設定するときに、1つのノードプールまたは複数のノードプールを指定できます。

  • 方法1

    # Select nodes in one node pool.
    nodeSelector:
      matchLabels:
        alibabacloud.com/nodepool-id: np77f520e1108f47559e63809713ce****
  • 方法2

    # Select nodes in multiple node pools.
    nodeSelector:
      matchExpressions:
      - key: alibabacloud.com/nodepool-id
        operator: In
        values:
        - node-pool1
        - node-pool2

podSelectors

複数のポッドで構成できるリスト。 PodSelectorのフォーマット:

type PodSelector struct {
    name     string
    selector metav1.LabelSelector
}

LabelSelectorの形式の詳細については、「Labels and Selectors」をご参照ください。

スケジュール解除できるポッドを指定します。

# Only Latency-Sensitive (LS) pods can be descheduled. 
podSelectors:
- name: lsPods
  selector:
    matchLabels:
      koordinator.sh/qosClass: "LS"

よくある質問

ノードのリソース使用率が高しきい値に達したが、ノード上のポッドが追い出されない場合はどうすればよいですか?

考えられる原因を次の表に示します。

カテゴリ

原因

解決策

無効なコンポーネント構成

ポッドまたはノードが指定されていない

デスケジューラの構成にポッドまたはノードは指定されていません。 名前空間とノードが指定されているかどうかを確認します。

変更後に再起動されないデスケジューラ

デスケジューラの設定を変更した後、変更を有効にするために再起動する必要があります。 デスケジューラを再起動する方法の詳細については、「手順2: LowNodeLoadプラグインを有効にする」をご参照ください。

無効なノードステータス

長期間の平均ノードリソース使用率がしきい値より低い

デスケジューラは、ある期間内のリソース利用を継続的に監視し、平均値を計算する。 スケジュール解除は、平均値が一定期間閾値を超えたままである場合にのみトリガされる。 デフォルトの期間は10分です。 kubectl top nodeによって返されるリソース使用率は、1分以内の平均値です。 リソース使用率を長期間監視してから、ホットスポットの検出頻度と検出間隔を変更することを推奨します。

クラスター内の使用可能なリソースが不十分

デスケジューラは、クラスター内の他のノードをチェックして、デスケジューラがポッドを退去させる前に、ノードが十分な利用可能なリソースを提供できることを確認します。 たとえば、デスケジューラは、8 vCoresと16 GBのメモリを要求するポッドを削除したいとします。 ただし、クラスター内のノードは、ポッドの要件を満たすのに十分なリソースを提供できません。 この場合、デスケジューラはポッドを追い出しません。 この問題を解決するには、クラスターにノードを追加します。

ワークロードの制限

ワークロード内の1つのレプリケートされたポッドのみ

デフォルトでは、ワークロードにレプリケートされたポッドが1つしか含まれていない場合、ポッドはスケジュール解除の対象から除外されます。 これにより、ポッドで実行されるアプリケーションの高可用性が保証されます。 上記のポッドをスケジュール解除する場合は、deskedler. alpha.kubernetes.io/evict: "true" アノテーションをポッドに追加するか、ワークロード (DeploymentまたはStatefulSet) のTemplateSpecにアノテーションを追加します。

説明

このアノテーション設定は、v1.2.0-ack1.3以前のバージョンのみをサポートします。

emptyDirまたはhostPathで構成されたポッド

デフォルトでは、emptyDirまたはhostPathで構成されたポッドは、データのセキュリティを確保するためにスケジュール解除から除外されます。 これらのポッドをスケジュール解除する場合は、evictLocalStoragePods設定を参照してください。 詳細については、「移行制御の設定」をご参照ください。

移行中の利用できないレプリケートポッドまたはレプリケートポッドの数が多すぎる

ワークロード (DeploymentまたはStatefulSet) で移行されている、利用できないレプリケートされたポッドまたはレプリケートされたポッドの数が、maxUnavailablePerWorkloadまたはmaxMigrationPerWorkloadで指定された上限を超えています。 たとえば、maxUnavailablePerWorkloadmaxMigrationPerWorkloadの両方が20% に設定され、Deploymentのレプリケートされるポッドの予想数が10に設定されているとします。 2つのポッドが移行中またはアプリケーションをリリース中です。 この場合、デスケジューラはこれらのポッドを追い出しません。 ポッドが移行されるか、ポッドがアプリケーションのリリースを完了するまで待つか、上記のパラメーターの値を増やします。

複製ポッドの制限が正しくない

ワークロード内のレプリケートされたポッドの数が、maxMigrationPerWorkloadで指定された移行可能なポッドの最大数、またはmaxUnavailablePerWorkloadで指定された使用不可能なポッドの最大数以下の場合、デスケジューラはワークロード内のポッドのスケジュールを解除しません。 上記のパラメーターの値を減らし、パラメーターをパーセント値に設定します。

デスケジューラが頻繁に再起動するのはなぜですか?

デスケジューラのConfigMapの形式が無効であるか、ConfigMapが存在しません。 [詳細設定] を参照して、ConfigMapの内容と形式を確認し、ConfigMapを変更してから、デスケジューラを再起動します。 デスケジューラを再起動する方法の詳細については、「手順2: LowNodeLoadプラグインを有効にする」をご参照ください。

負荷認識スケジューリングと負荷認識ホットスポットのスケジューリング解除の組み合わせを使用するにはどうすればよいですか?

負荷認識型ホットスポットのスケジューリング解除を有効にすると、ホットスポットノード上のポッドが削除されます。 ACKスケジューラは、上位層のコントローラ (デプロイメントなど) によって作成されるポッドに適したノードを選択します。 最適な負荷分散を実現するために、負荷認識スケジューリングを同時に有効にすることをお勧めします。 詳細については、「負荷対応スケジューリングの使用」をご参照ください。

スケジューラのloadAwareThresholdパラメーターとデスケジューラのhighThresholdパラメーターを同じ値に設定することを推奨します。 詳細については、「スケジューリングポリシー」をご参照ください。 ノードの負荷がhighThresholdsを超えると、デスケジューラはノード上のポッドを削除します。 loadAwareThresholdのため、スケジューラはホットスポットノードへの新しいポッドのスケジューリングを停止します。 パラメーターを同じ値に設定しない場合、ポッドはホットスポットノードにスケジュールされる可能性があります。 この問題は、ポッドがスケジューリング可能なノードのスコープを指定しているが、使用可能なノードの数が少なく、これらのノードのリソース使用率の値が近い場合に発生する可能性が高くなります。

デスケジューラによって使用される利用アルゴリズムは何ですか?

デスケジューラは、ある期間内のリソース利用を継続的に監視し、平均値を計算する。 スケジュール解除は、平均値が一定期間閾値を超えたままである場合にのみトリガされる。 デフォルトの期間は10分です。 加えて、デスケジューラによってカウントされるメモリ使用率は、ページキャッシュによって使用されるメモリリソースがオペレーティングシステムによってリサイクルされ得るので、ページキャッシュを除外する。 kubectl top nodeコマンドを使用して照会されたメモリ使用率には、ページキャッシュが含まれます。 実際のメモリ使用率は、Managed Service for Prometheusコンソールで確認できます。