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

Container Service for Kubernetes:デスケジューリング機能の有効化

最終更新日:Nov 09, 2025

デスケジューリングは、ノード上のエビクションルールに一致する Pod を別のノードにスケジュールするプロセスです。この機能は、クラスターのリソース使用率の不均衡、高負荷のノード、新しいスケジューリングポリシーの需要などのシナリオに適しています。デスケジューリング機能は、リソース使用量を最適化し、アプリケーションサービスの品質を向上させるのに役立ちます。このトピックでは、RemovePodsViolatingNodeTaints という名前のノード Taint 検証プラグインを例として、ack-koordinator コンポーネントに基づいてデスケジューリング機能を有効にする方法について説明します。

開始する前に

  • 実装する前に、デスケジューリングの機能、使用シナリオ、ワークフロー、および基本概念について理解しておくことを推奨します。

  • このトピックでは、RemovePodsViolatingNodeTaints という名前のノード Taint 検プラグインを例として使用します。NoSchedule など、Pod のスケジュールとエビクションに Taint と Toleration を使用する方法の詳細については、「Taints and Tolerations」をご参照ください。

  • コミュニティの Kubernetes Descheduler を使用している場合は、「Koordinator Descheduler と Kubernetes Descheduler」をご参照いただき、Koordinator Descheduler と Kubernetes Descheduler の違いを理解し、コンポーネントの移行を完了することを推奨します。

  • システム構成、テンプレート構成、ポリシーのプラグイン構成、エビクターのプラグイン構成など、詳細なデスケジューリングのための詳細設定については、「詳細パラメーターの設定」をご参照ください。

前提条件

使用上の注意

  • Koordinator Descheduler は実行中の Pod のみをエビクションし、エビクションされた Pod を再作成したりスケジュールしたりしません。Pod がエビクションされた後、Pod は Deployment や StatefulSet などのワークロードコントローラーによって再作成されます。再作成された Pod は、引き続きスケジューラによってスケジュールされます。

  • デスケジューリングプロセス中、古い Pod がエビクションされ、新しい Pod が作成されます。エビクション中にアプリケーションの可用性を維持するために、アプリケーションに十分な replicas があることを確認してください。

このトピックでは、ack-koordinator コンポーネントに基づいてデスケジューリング機能を有効にし、デスケジューリングポリシーを実装する方法について説明します。ノード Taint 検証プラグイン RemovePodsViolatingNodeTaints を例として使用します。

デフォルトでは、RemovePodsViolatingNodeTaints ポリシーは、Taint の effectNoSchedule であるノード上の Pod をチェックし、その Taint を許容できない Pod をエビクションします。たとえば、あるノードが実行中の Pod をホストしており、管理者がそのノードに deschedule=not-allow:NoSchedule Taint を追加したとします。ノード上の Pod がその Taint を許容する Toleration で構成されていない場合、Pod はデスケジューリングポリシーによってエビクションされます。詳細については、「RemovePodsViolatingNodeTaints」をご参照ください。

RemovePodsViolatingNodeTaints ポリシーでは、excludedTaints フィールドを設定してノードの Taint を無視できます。Taint の key またはキーと値のペア (key=value) が excludedTaints リスト内の Taint と一致する場合、その Taint は無視されます。

この例では、プラグインは次の方法で Taint を検証するように構成されています。

  • ノード上で effectNoSchedule に設定されている。

  • NoSchedule Taint 属性において、Taint の keydeschedule ではなく、Taint の valuenot-allow ではない。

上記の条件を満たすノード上で、実行中の Pod に一致する Toleration がない場合、Pod は descheduler によってエビクションされます。

ステップ 1: ack-koordinator コンポーネントをインストールまたは変更してデスケジューリングを有効にする

このセクションの手順に従って、ack-koordinator コンポーネントをインストールし、Koordinator Descheduler が提供する descheduling 機能を使用できます。Koordinator Descheduler は、ノード上にデプロイメントとしてデプロイされます。

説明

ack-koordinator コンポーネントをインストールしている場合は、コンポーネントのバージョンが 1.2.0-ack.2 以降であることを確認してください。

  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. クラスター ページで、管理するクラスターを見つけてその名前をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。

  3. ack-koordinator コンポーネントを見つけ、右下隅にある [インストール] をクリックします。[インストール] ダイアログボックスで、[Enable Descheduler for ACK-Koordinator] を選択してデスケジューリングモジュールを有効にします。次に、プロンプトに従ってコンポーnent を構成してインストールします。

ステップ 2: デスケジューリングプラグイン RemovePodsViolatingNodeTaints を有効にする

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

    ConfigMap リソース koord-descheduler-config.yaml を作成して、デスケジューリングプラグイン RemovePodsViolatingNodeTaints を有効にして構成します。

    # koord-descheduler-config.yaml
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: koord-descheduler-config
      namespace: kube-system
    data:
      koord-descheduler-config: |
        # koord-desheduler の次のシステム構成は変更しないでください。
        apiVersion: descheduler/v1alpha2
        kind: DeschedulerConfiguration
        leaderElection:
          resourceLock: leases
          resourceName: koord-descheduler
          resourceNamespace: kube-system
        deschedulingInterval: 120s # LowNodeLoad が実行される間隔。この例では、間隔は 120 秒に設定されています。
        dryRun: false # グローバル読み取り専用モード。このモードを有効にすると、koord-descheduler は操作を実行しません。
        # 上記の構成はシステム構成です。
    
        profiles:
        - name: koord-descheduler
          plugins:
            deschedule:
              enabled:
                - name: RemovePodsViolatingNodeTaints  # ノード Taint 検証プラグインを有効にします。        
    
          pluginConfig:             
          - name: RemovePodsViolatingNodeTaints # ノード Taint 検証プラグインの構成。
            args:        
              excludedTaints: 
              - deschedule=not-allow # Taint キーが deschedule で Taint 値が not-allow のノードを無視します。
          
          # ノード Taint 検証プラグインを有効にするには、次の構成が必要です。削除しないでください。     
          - name: MigrationController # 移行コントローラーのパラメーターを構成します。
            args:
              apiVersion: descheduler/v1alpha2
              kind: MigrationControllerArgs
              defaultJobMode: EvictDirectly            
  2. 次のコマンドを実行して、クラスターに koord-descheduler-config.yaml ファイルをデプロイします。

    kubectl apply -f koord-descheduler-config.yaml
  3. 次のコマンドを実行して、デスケジューラーモジュール 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

    ack-koord-descheduler Deployment のレプリカ数を 0 に設定してから 1 に設定します。この操作により、Koordinator Descheduler モジュールが再起動します。再起動後、最新の構成が使用されます。

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

3 つのノードを含むクラスターを例として使用します。

  1. 次の YAML コンテンツを使用して、stress-demo.yaml という名前のファイルを作成します。

    stress-demo.yaml ファイルでサンプルアプリケーションが定義されています。

    YAML コンテンツの表示

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: stress-demo
      namespace: default
      labels:
        app: stress-demo
    spec:
      replicas: 3
      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: registry-cn-beijing.ack.aliyuncs.com/acs/stress:v1.0.4
              imagePullPolicy: Always
              name: stress
              resources:
                limits:
                  cpu: '2'
                  memory: 4Gi
                requests:
                  cpu: '2'
                  memory: 4Gi
          restartPolicy: Always
  2. 次のコマンドを実行して stress-demo.yaml ファイルをデプロイし、テスト Pod を作成します。

    kubectl create -f stress-demo.yaml
  3. 次のコマンドを実行して、Pod が実行中状態になるまで Pod のステータスを表示します。

    kubectl get pod -o wide

    期待される出力:

    NAME                         READY   STATUS    RESTARTS   AGE    IP              NODE                        NOMINATED NODE   READINESS GATES
    stress-demo-5f6cddf9-9****   1/1     Running   0          10s    192.XX.XX.27   cn-beijing.192.XX.XX.247   <none>           <none>
    stress-demo-5f6cddf9-h****   1/1     Running   0          10s    192.XX.XX.20   cn-beijing.192.XX.XX.249   <none>           <none>
    stress-demo-5f6cddf9-v****   1/1     Running   0          10s    192.XX.XX.32   cn-beijing.192.XX.XX.248   <none>           <none>
  4. 次のコマンドを実行して、ノードに key=value:NoSchedule Taint を追加します。

    • cn-beijing.192.XX.XX.247 という名前のノードに deschedule=not-allow:NoSchedule Taint を追加します。

      kubectl taint nodes cn-beijing.192.XX.XX.247 deschedule=not-allow:NoSchedule

      期待される出力:

      node/cn-beijing.192.XX.XX.247 tainted
    • cn-beijing.192.XX.XX.248 という名前のノードに deschedule=allow:NoSchedule Taint を追加します。

      kubectl taint nodes cn-beijing.192.XX.XX.248 deschedule=allow:NoSchedule

      期待される出力:

      node/cn-beijing.192.XX.XX.248 tainted
  5. 次のコマンドを実行して、Pod の変更を表示します。

    kubectl get pod -o wide -w

    descheduler モジュールがノードの Taint をチェックし、エビクション操作を実行するのを待ちます。

    期待される出力:

    NAME                         READY   STATUS              RESTARTS   AGE     IP             NODE                    NOMINATED NODE   READINESS GATES
    stress-demo-5f6cddf9-9****   1/1     Running             0          5m34s   192.XX.XX.27   cn-beijing.192.XX.XX.247   <none>           <none>
    stress-demo-5f6cddf9-h****   1/1     Running             0          5m34s   192.XX.XX.20   cn-beijing.192.XX.XX.249   <none>           <none>
    stress-demo-5f6cddf9-v****   1/1     Running             0          5m34s   192.XX.XX.32   cn-beijing.192.XX.XX.248   <none>           <none>
    stress-demo-5f6cddf9-v****   1/1     Terminating         0          7m58s   192.XX.XX.32   cn-beijing.192.XX.XX.248   <none>           <none>
    stress-demo-5f6cddf9-j****   0/1     ContainerCreating   0          0s      <none>         cn-beijing.192.XX.XX.249   <none>           <none>
    stress-demo-5f6cddf9-j****   1/1     Running             0          2s      192.XX.XX.32   cn-beijing.192.XX.XX.249   <none>           <none>

    出力は次の情報を示しています。

    • Taint deschedule=allow:NoSchedule を持つノード cn-beijing.192.XX.XX.248 上の Pod stress-demo-5f6cddf9-v**** がエビクションされます。

    • Taint deschedule=not-allow:NoSchedule を持つノード cn-beijing.192.XX.XX.247 上の Pod stress-demo-5f6cddf9-9**** はエビクションされません。

    • エビクションされた Pod stress-demo-5f6cddf9-v**** は、NoSchedule Taint を持たないノード cn-beijing.192.XX.XX.249 にデスケジュールされます。

  6. 次のコマンドを実行して、エビクションされた Pod のイベントを表示します。

    kubectl get event | grep stress-demo-5f6cddf9-v****

    期待される出力:

    3m24s       Normal    Evicting            podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798****   Pod "default/stress-demo-5f6cddf9-v****" evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints"
    2m51s       Normal    EvictComplete       podmigrationjob/b0fba65f-7fab-4a99-96a9-c71a3798****   Pod "default/stress-demo-5f6cddf9-v****" has been evicted
    3m24s       Normal    Descheduled         pod/stress-demo-5f6cddf9-v****                         Pod evicted from node "cn-beijing.192.XX.XX.248" by the reason "RemovePodsViolatingNodeTaints"
    3m24s       Normal    Killing             pod/stress-demo-5f6cddf9-v****                         Stopping container stress

    期待される出力は、Pod の移行レコードを示しています。Pod は、ノード cn-beijing.192.XX.XX.248 の Taint deschedule=not-allow を許容する一致する Toleration で構成されていません。その結果、Pod は別のノードにデスケジュールされます。結果は期待どおりです。

詳細パラメーターの設定

前述の操作に加えて、ConfigMap を使用して Koordinator Descheduler の詳細パラメーターを構成することもできます。

詳細設定の例

次の YAML ファイルは、Koordinator Descheduler の詳細設定の例を示しています。この構成は、DeschedulerConfiguration API を呼び出すことによって Koordinator Descheduler の動作を変更し、RemovePodsViolatingNodeTaint ノード Taint 検証ポリシーを有効にし、MigrationController を Pod エビクターとして使用します。

サンプル構成のパラメーターの詳細については、次のセクションをご参照ください。

YAML コンテンツの表示

# koord-descheduler-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: koord-descheduler-config
  namespace: kube-system
data:
  koord-descheduler-config: |
    # koord-desheduler の次のシステム構成は変更しないでください。
    apiVersion: descheduler/v1alpha2
    kind: DeschedulerConfiguration
    leaderElection:
      resourceLock: leases
      resourceName: koord-descheduler
      resourceNamespace: kube-system
    dryRun: false # グローバル読み取り専用モード。このモードを有効にすると、koord-descheduler は操作を実行しません。  
    deschedulingInterval: 120s # LowNodeLoad が実行される間隔。この例では、間隔は 120 秒に設定されています。
    nodeSelector: # デスケジューリングに関与するノード。デフォルトでは、すべてのノードがデスケジュールされます。
      matchLabels:
        alibabacloud.com/nodepool-id: nodepool-1 # 要件に基づいて構成します。
    maxNoOfPodsToEvictPerNode: 10 # ノードからエビクションできる Pod の最大数。この制限はグローバル規模で有効になります。デフォルトでは、制限は構成されていません。
    maxNoOfPodsToEvictPerNamespace: 10 # 名前空間からエビクションできる Pod の最大数。この制限はグローバル規模で有効になります。デフォルトでは、制限は構成されていません。
    # 上記の構成はシステム構成です。

    # テンプレートリスト。
    profiles: 
    - name: koord-descheduler # テンプレートの名前。
    
      # 次の構成はテンプレートの範囲を指定し、指定されたノードでのみ有効になります
      # 方法 1: 1 つのノードプール内のノードを選択します。
      nodeSelector:
        matchLabels:
          alibabacloud.com/nodepool-id: nodepool-1 # 要件に基づいて構成します
      # 方法 2: 複数のノードプール内のノードを選択します。
      # nodeSelector:
      #   matchExpressions:
      #   - key: alibabacloud.com/nodepool-id
      #     operator: In
      #     values:
      #     - nodepool-1
      #     - nodepool-2     
      # 上記の構成はテンプレートの範囲を指定します    
      
      # 次のテンプレート構成は、有効にするプラグインを指定します。
      plugins: 
        deschedule: # Deschedule ポリシーを指定します。デフォルトでは、すべてのプラグインが無効になっています。
          enabled: # 有効にするプラグインを指定します。enabled パラメーターで明示的に指定されていない他のすべてのプラグインは無効になります。
            - name: RemovePodsViolatingNodeTaints  # ノード Taint 検証プラグインを有効にします。
        balance: # Balance ポリシーを指定します。デフォルトでは、すべてのプラグインが無効になっています。
          disabled: # 無効にするプラグインを指定します。
            - name: "*" # アスタリスク (*) は、すべてのプラグインが無効になっていることを示します。
        evict:          
          enabled:
            - name: MigrationController # エビクターを指定します。デフォルトでは、移行コントローラーが有効になっています。
        filter: 
          enabled:
            - name: MigrationController # エビクションフィルタリングポリシーを指定します。デフォルトでは、移行コントローラーのエビクションフィルタリングポリシーが使用されます。
      # 上記の構成はテンプレート構成です。

      # ポリシーのプラグインとエビクターのプラグインを含むプラグインリスト。
      pluginConfig: 
      # RemovePodsViolatingNodeTaints ポリシープラグインの構成。
      - name: RemovePodsViolatingNodeTaints
        args:
          excludedTaints:
          - deschedule=not-allow # Taint キーが deschedule で Taint 値が not-allow のノードを無視します。
          - reserved # Taint キーが reserved のノードを無視します。
          includePreferNoSchedule: false # PreferNoSchedule 効果を持つ Taint を含めるかどうかを指定します。デフォルトでは、NoSchedule 効果を持つ Taint のみが含まれます。
          namespaces: # デスケジューリングに含めるか除外する名前空間を指定します。包含リストと除外リストは相互に排他的です。
            include the following: # デスケジューリングに含める名前空間を指定します。
              - "namespace1"
              - "namespace2"
            # exclude: # デスケジューリングから除外する名前空間を指定します。
            #   - "namespace1"
            #   - "namespace2"
          labelSelector: # デスケジュールできる Pod を指定します。デフォルトでは、すべての Pod をデスケジュールできます。
            accelerator: nvidia-tesla-p100 # キーが accelerator で値が nvidia-tesla-p100 の Pod のみデスケジュールできます。     
    
      # ノード Taint 検証プラグインの構成。     
      - name: MigrationController # 移行コントローラーのパラメーターを構成します。
        args:
          apiVersion: descheduler/v1alpha2
          kind: MigrationControllerArgs
          defaultJobMode: EvictDirectly  
          evictLocalStoragePods: false # emptyDir または hostPath で構成された Pod をデスケジュールできるかどうかを指定します。        
          maxMigratingPerNode: 1 # ノード上で同時に移行できる Pod の最大数。
          maxMigratingPerNamespace: 1  # 名前空間内で同時に移行できる Pod の最大数。
          maxMigratingPerWorkload: 1 # Deployment などのワークロード内で同時に移行できる Pod の最大数。
          maxUnavailablePerWorkload: 2 # Deployment などのワークロードで許可される利用不可能なレプリカ Pod の最大数。
          objectLimiters:
            workload: # ワークロード固有の Pod 移行制御。デフォルトでは、システムは最初の eviction から 5 分以内に 1 つのレプリカ Pod のみを移行できます。
              duration: 5m
              maxMigrating: 1
          evictionPolicy: Eviction # Pod のエビクションメソッド。デフォルトでは、Eviction API が呼び出されて Pod がエビクションされます。       

システム構成

Koordinator Descheduler のグローバルなシステムレベルの動作を DeschedulerConfiguration で構成できます。

パラメーター

タイプ

有効な値

説明

dryRun

boolean

  • true

  • false (デフォルト値)

グローバル読み取り専用モード。このモードを有効にすると、Pod は移行できません。

false

deschedulingInterval

time.Duration

>0s

デスケジューリングの間隔。

120s

nodeSelector

構造体

N/A

デスケジュールできるノードを制限します。デスケジューリングポリシーは、ノードセレクターで指定されたノードでのみ有効になります。ノードセレクターの詳細については、「Kubernetes labelSelector」をご参照ください。

このパラメーターを構成する際に、1 つ以上のノードプールを指定できます。

  • 方法 1

    # 1 つのノードプール内のノードを選択します。
    nodeSelector:
      matchLabels:
        alibabacloud.com/nodepool-id: nodepool-1
  • 方法 2

    # 複数のノードプール内のノードを選択します。
    nodeSelector:
      matchExpressions:
      - key: alibabacloud.com/nodepool-id
        operator: In
        values:
        - node-pool1
        - node-pool2

maxNoOfPodsToEvictPerNode

int

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

ノード上で同時にエビクションできる Pod の最大数を制限します。このパラメーターはデスケジューリング中に有効になります。

10

maxNoOfPodsToEvictPerNamespace

int

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

名前空間内で同時にエビクションできる Pod の最大数を制限します。このパラメーターはデスケジューリング中に有効になります。

10

テンプレート構成

Koordinator Descheduler は、デスケジューリングテンプレートを使用して、デスケジューリングポリシーと Pod エビクターを管理します。DeschedulerConfigurationprofiles フィールドで 1 つ以上のデスケジューリングテンプレートを定義できます。各デスケジューリングテンプレートでは、デスケジューリングポリシーと Pod エビクターがプラグインとして構成されます。デスケジューリングテンプレートには、次の部分が含まれます。

  • name

    値は文字列です。デスケジューリングテンプレートの名前をカスタマイズできます。

  • plugins

    有効または無効にするデスケジューリングポリシー (deschedulebalance)、Pod エビクションプラグイン (evict)、および Pod エビクションの前に使用するフィルターポリシー (filter) を構成します。次の表に、構成可能なパラメーターを示します。

    パラメーター

    タイプ

    有効な値

    説明

    deschedule

    次のフォーマットの構造体:

    type PluginList struct {
        Enabled  []Plugin
        Disabled []Plugin
    }
    
    type Plugin struct {
        Name string
    }

    EnabledDisabledPlugin 構造体リストであり、有効にするプラグインと無効にするプラグインを示します。

    デフォルトでは、すべてのプラグインが無効になっています。有効にする Deschedule デスケジューリングポリシーを指定できます。

    plugins:
      deschedule: 
        enabled:
          - name: PodLifeTime 
          - name: RemovePodsViolatingNodeTaints  

    RemovePodsViolatingInterPodAntiAffinity

    このポリシーは、Pod 間のアンチアフィニティルールに一致しない Pod をエビクションします。

    RemovePodsViolatingNodeAffinity

    このポリシーは、ノードアフィニティルールに一致しない Pod をエビクションします。

    RemovePodsViolatingNodeTaints

    このポリシーは、ノードの Taint を許容できない Pod をエビクションします。

    RemovePodsHavingTooManyRestarts

    このポリシーは、頻繁に再起動する Pod をエビクションします。

    PodLifeTime

    このポリシーは、TTL が期限切れになった Pod をエビクションします。

    RemoveFailedPod

    このポリシーは、Failed 状態の Pod をエビクションします。

    balance

    次のフォーマットの構造体:

    type PluginList struct {
        Enabled  []Plugin
        Disabled []Plugin
    }
    
    type Plugin struct {
        Name string
    }

    EnabledDisabledPlugin 構造体リストであり、有効にするプラグインと無効にするプラグインを示します。

    デフォルトでは、すべてのプラグインが無効になっています。有効にする Balance デスケジューリングポリシーを指定します。

    plugins:
      balance: 
        enabled:
          - name: RemoveDuplicates 
          - name: LowNodeLoad

    RemoveDuplicates

    レプリカ Pod を分散させます。

    LowNodeUtilization

    ノードのリソース割り当てに基づいてホットスポットを分散させます。

    HighNodeUtilization

    ノードのリソース割り当てに基づいて負荷を集約します。ポリシーが許可する場合、Pod はリソース使用率の低いノードからリソース使用率の高いノードに移行されます。

    RemovePodsViolatingTopologySpreadConstraint

    トポロジー分散制約に一致しない Pod をエビクションします。

    LowNodeLoad

    ノードのリソース使用量に基づいてホットスポットを分散させます。

    evict

    次のフォーマットの構造体:

    type PluginList struct {
        Enabled  []Plugin
        Disabled []Plugin
    }
    
    type Plugin struct {
        Name string
    }

    Enabled と Disabled は Plugin 構造体リストです。Enabled リストのプラグインを有効にし、Disabled リストのプラグインを無効にできます。

    • MigrationController

    • DefaultEvictor

    有効にする Pod エビクター。デフォルトでは MigrationController が有効になっています。

    複数の evict プラグインを同時に有効にしないでください。

    plugins:
      evict: 
        enabled: 
          - name: MigrationController

    filter

    次のフォーマットの構造体:

    type PluginList struct {
        Enabled  []Plugin
        Disabled []Plugin
    }
    
    type Plugin struct {
        Name string
    }

    Enabled と Disabled は Plugin 構造体リストです。Enabled リストのプラグインを有効にし、Disabled リストのプラグインを無効にできます。

    • MigrationController

    • DefaultEvictor

    Pod エビクションの前に使用するエビクションフィルタリングポリシーを選択します。デフォルトでは MigrationController が有効になっています。

    複数の filter プラグインを同時に有効にしないでください。

    plugins:
      filter: 
        enabled: 
          - name: MigrationController
  • pluginConfig

    各プラグインの詳細パラメーターを構成します。name フィールドを設定して、構成するプラグインの名前を指定します。args フィールドでプラグインを構成する方法の詳細については、「ポリシーのプラグインを構成する」および「エビクターのプラグインを構成する」をご参照ください。

  • nodeSelector

    デスケジューリングテンプレートの範囲を制限します。テンプレートで構成されたデスケジューリングポリシーは、ノードセレクターで指定されたノードでのみ有効になります。詳細については、「Kubernetes labelSelector」をご参照ください。このフィールドが指定されていない場合、テンプレートはデフォルトですべてのノードで有効になります。

    説明

    テンプレート構成の nodeSelector フィールドは、ack-koordinator コンポーネントバージョン v1.6.1-ack.1.16 以降でのみサポートされます。

ポリシーのプラグインを構成する

Koordinator Descheduler は、6 つの Deschedule ポリシープラグインと 5 つの Balance ポリシープラグインをサポートしています。LowNodeLoad プラグインは Koordinator によって提供されます。詳細については、「負荷認識ホットスポットデスケジューリングの操作」をご参照ください。次のデスケジューリングプラグインは Kubernetes Descheduler によって提供されます。

ポリシータイプ

ポリシーの特徴

ポリシー設定

Deschedule

このポリシーは、Pod 間のアンチアフィニティルールに一致しない Pod をエビクションします。

RemovePodsViolatingInterPodAntiAffinity

このポリシーは、ノードアフィニティルールに一致しない Pod をエビクションします。

RemovePodsViolatingNodeAffinity

このポリシーは、ノードの Taint を許容できない Pod をエビクションします。

RemovePodsViolatingNodeTaints

このポリシーは、頻繁に再起動する Pod をエビクションします。

RemovePodsHavingTooManyRestarts

このポリシーは、TTL が期限切れになった Pod をエビクションします。

PodLifeTime

このポリシーは、Failed 状態の Pod をエビクションします。

RemoveFailedPod

Balance

レプリカ Pod を分散させます。

RemoveDuplicates

ノードのリソース割り当てに基づいてホットスポットを分散させます。

LowNodeUtilization

ノードのリソース割り当てに基づいて負荷を集約します。

HighNodeUtilization

トポロジー分散制約に一致しない Pod をエビクションします。

RemovePodsViolatingTopologySpreadConstraint

エビクターのプラグインを構成する

Koordinator DeschedulerDefaultEvictorMigrationController の両方のエビクタープラグインをサポートしています。

MigrationController

次の表に、MigrationController エビクタープラグインの詳細設定を示します。

パラメーター

タイプ

有効な値

説明

evictLocalStoragePods

boolean

  • true

  • false (デフォルト値)

emptyDir または hostPath で構成された Pod をデスケジュールできるかどうかを指定します。セキュリティ上の理由から、このパラメーターはデフォルトで無効になっています。

false

maxMigratingPerNode

int64

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

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

2

maxMigratingPerNamespace

int64

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

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

1

maxMigratingPerWorkload

intOrString

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

Deployment などのワークロード内で同時に移行できる Pod の最大数またはパーセンテージ。値 0 は制限が設定されていないことを示します。

ワークロードにレプリカ Pod が 1 つしか含まれていない場合、そのワークロードはデスケジューリングから除外されます。

1 または 10%

maxUnavailablePerWorkload

intOrString

0 以上 (デフォルト値: 10%) で、ワークロードのレプリカ Pod 数未満

Deployment などのワークロードで許可される利用不可能なレプリカ Pod の最大数またはパーセンテージ。値 0 は制限が設定されていないことを示します。

1 または 10%

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: 同時に移行できるレプリカ Pod の最大数またはパーセンテージ。値を整数またはパーセント値に設定します。デフォルトでは、maxMigratingPerWorkload の値が使用されます。

objectLimiters:
  workload:
    duration: 5m
    maxMigrating: 1

この例は、ワークロード内で 5 分以内に 1 つのレプリカ Pod のみを移行できることを示しています。

evictionPolicy

string

次のモードがサポートされています。

  • Eviction (デフォルト)

  • Delete

  • Soft

  • Eviction: Eviction API を呼び出して、ビジネスを中断することなく Pod を正常に移行します。

  • Delete: Delete API を呼び出して Pod を削除します。

  • Soft: Pod に scheduling.koordinator.sh/soft-eviction アノテーションを追加します。このアノテーションを使用して、Pod で実行される後続のエビクション操作を制御できます。

Eviction

DefaultEvictor

DefaultEvictor プラグインは Kubernetes Descheduler によって提供されます。詳細については、「DefaultEvictor」をご参照ください。

比較

次の表に、DefaultEvictor と MigrationController の Pod エビクション機能の比較を示します。

項目

DefaultEvictor

MigrationController

エビクションメソッド

Eviction API を呼び出して Pod をエビクションします。

複数のエビクションメソッドがサポートされています。詳細については、「」をご参照ください。

エビクションの制限

  • ノード上で同時に移行できる Pod の最大数を制限できます。

  • 名前空間内で同時に移行できる Pod の最大数を制限できます。

  • ノード上で同時に移行できる Pod の最大数を制限できます。

  • 名前空間内で同時に移行できる Pod の最大数を制限できます。

  • ワークロードに対して同時に移行できる Pod の最大数を制限できます。

  • ワークロードあたりの利用不可能なレプリカ Pod の最大数またはパーセンテージを制限できます。

エビクションのスロットリング

サポートされていません

タイムウィンドウベースのスロットリングメカニズムが採用されており、同じワークロードに属する Pod が頻繁に移行されないようにします。

エビクションの監視

コンポーネントのログを使用して Pod のエビクション情報を表示できます。

  • コンポーネントのログを使用して Pod のエビクション情報を表示できます。

  • イベントを使用してデスケジューリング中の移行プロセスを監視し、イベントの詳細で移行の具体的な理由と現在のステータスを表示できます。

リファレンス