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

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

最終更新日:Jun 18, 2026

Koordinator Descheduler を有効にすると、ノードの Taint、アフィニティルール、または負荷プロファイルが変更されたときに、Pod を自動的に排除および再調整できます。

以下の手順では、RemovePodsViolatingNodeTaints プラグインを例として使用します。

前提条件

以下を確認してください:

デスケジューリングは仮想ノードではサポートされていません。

注意事項

  • Koordinator Descheduler は Pod を排除するだけで、再作成はしません。排除された Pod は、ワークロードコントローラー (Deployment や StatefulSet など) によって再作成され、標準のスケジューラによって配置されます。

  • 新しい Pod が作成される前に古い Pod が排除されます。排除中の可用性を維持するために、ご利用のアプリケーションに十分な replicas があることを確認してください。

  • ack-descheduler は廃止されました。まだ使用している場合は、「ack-descheduler から Koordinator Descheduler への移行方法」をご参照ください。

デスケジューリングプラグインの選択

シナリオに合わせてプラグインを選択してください:

シナリオ プラグイン ポリシータイプ
スケジューリング後に NoSchedule Taint が付与されたノードに Pod が残っている RemovePodsViolatingNodeTaints Deschedule
Pod が Pod 間アンチアフィニティルールに違反している RemovePodsViolatingInterPodAntiAffinity Deschedule
Pod がノードアフィニティルールを満たさなくなった RemovePodsViolatingNodeAffinity Deschedule
Pod の再起動が頻繁すぎる RemovePodsHavingTooManyRestarts Deschedule
Pod が Time-to-Live (TTL) を超過した PodLifeTime Deschedule
Pod が Failed 状態である RemoveFailedPod Deschedule
レプリケーションされた Pod がノード間で不均等に分散している RemoveDuplicates Balance
リソース割り当てによってノードが不均等に使用されている LowNodeUtilization Balance
Pod がトポロジースプレッド制約に違反している RemovePodsViolatingTopologySpreadConstraint Balance
実際のリソース使用率によってノードが過負荷になっている LowNodeLoad Balance

以下の例では RemovePodsViolatingNodeTaints を使用します。開始する前に、「デスケジューリングの概念」および「Koordinator Descheduler と Kubernetes Descheduler の比較」をお読みください。

仕組み

RemovePodsViolatingNodeTaints は、設定された間隔で、すべてのノードの NoSchedule Taint をチェックします。実行中の Pod にノードの NoSchedule Taint に対する Toleration がない場合、プラグインはその Pod を排除します。ワークロードコントローラーが Pod を再作成し、スケジューラが Toleration を満たすノードに配置します。

特定の Taint を除外するには excludedTaints を使用します。Taint のキーまたは key=value のペアが excludedTaints 内のエントリと一致する場合、プラグインはその Taint を無視します。

シナリオ例:

3 ノードのクラスターで、ノードごとに 1 つの Pod を持つ Deployment を実行します。デプロイメント後、管理者が 2 つのノードに NoSchedule Taint を追加します:

  • ノード A には deschedule=not-allow:NoSchedule が付与されます。deschedule=not-allowexcludedTaints に含まれているため、この Taint は無視され、Pod はそのまま残ります。

  • ノード B には deschedule=allow:NoSchedule が付与されます。この Taint は除外されていないため、Pod は排除され、NoSchedule Taint がないノード C に再スケジュールされます。

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

ack-koordinator がすでにインストールされている場合は、バージョンが 1.2.0-ack.2 以降であることを確認してください。
  1. ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、対象のクラスター名をクリックします。左側のナビゲーションウィンドウで、[アドオン] をクリックします。

  3. ack-koordinator を見つけて、[インストール] をクリックします。

  4. [インストール] ダイアログボックスで、[ACK-Koordinator の Descheduler を有効にする] を選択し、インストールを完了します。

Koordinator Descheduler は、クラスターノード上に Deployment としてデプロイされます。

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

プラグインの設定

koord-descheduler-config.yaml という名前のファイルを作成します。この ConfigMap は RemovePodsViolatingNodeTaints を有効にし、deschedule=not-allow Taint を除外します。

# 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 # descheduler が実行される間隔。ここでは 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 のノードを無視します。

      # RemovePodsViolatingNodeTaints を有効にするために必要です。削除しないでください。
      - name: MigrationController # 移行コントローラーを設定します。
        args:
          apiVersion: descheduler/v1alpha2
          kind: MigrationControllerArgs
          defaultJobMode: EvictDirectly

RemovePodsViolatingNodeTaints のパラメーター:

パラメーター タイプ デフォルト 説明
excludedTaints list(string) 無視する Taint キーまたは key=value のペア。これらの Taint を持つノード上の Pod は排除されません。
includePreferNoSchedule bool false true の場合、NoSchedule だけでなく、効果が PreferNoSchedule の Taint もチェックします。
namespaces.include list(string) デスケジューリングを特定の名前空間に制限します。namespaces.exclude とは相互に排他的です。
namespaces.exclude list(string) 特定の名前空間でのデスケジューリングをスキップします。namespaces.include とは相互に排他的です。
labelSelector map 指定されたラベルに一致する Pod にデスケジューリングを制限します。

設定の適用

  1. ConfigMap をクラスターに適用します:

    kubectl apply -f koord-descheduler-config.yaml
  2. 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:デスケジューリングの検証

この例では、3 ノードのクラスターを使用します。

  1. stress-demo.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. テストワークロードをデプロイします:

    kubectl create -f stress-demo.yaml
  3. Pod が Running 状態になるまで待ちます:

    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. 2 つのノードに NoSchedule Taint を追加します:

    • cn-beijing.192.XX.XX.247deschedule=not-allow:NoSchedule を追加します (excludedTaints によって除外されるため、Pod は残るはずです):

      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.248deschedule=allow:NoSchedule を追加します (除外されないため、Pod は排除されるはずです):

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

      期待される出力:

      node/cn-beijing.192.XX.XX.248 tainted
  5. Pod の変更を監視します。descheduler は deschedulingInterval (120 秒) ごとに Taint をチェックします:

    kubectl get pod -o wide -w

    期待される出力:

    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>

    出力から以下のことが確認できます:

    • cn-beijing.192.XX.XX.248 (Taint deschedule=allow:NoSchedule、除外対象外) 上の Pod が排除されます。

    • cn-beijing.192.XX.XX.247 (Taint deschedule=not-allow:NoSchedule、除外対象) 上の Pod は実行中のままです。

    • 排除された Pod は、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

    各イベントは、移行ライフサイクルのフェーズに対応しています:

    イベント ソース 意味
    Evicting PodMigrationJob Descheduler が Pod を排除するための移行ジョブを開始しました。
    Descheduled Pod Pod が排除シグナルを受信しました。
    Killing Pod コンテナランタイムがコンテナを停止します。
    EvictComplete PodMigrationJob Pod が完全に排除されました。ワークロードコントローラーがそれを再作成します。

    cn-beijing.192.XX.XX.248 上の Pod は、deschedule=allow:NoSchedule Taint (excludedTaints に含まれていない) に対する Toleration を持っていなかったため、排除されました。

高度なパラメーターの設定

ConfigMap を使用して、グローバルな動作とテンプレート設定を構成します。

高度な設定例

この ConfigMap は、グローバル設定に DeschedulerConfiguration を使用し、デスケジューリングポリシーとして RemovePodsViolatingNodeTaints を有効にし、エビクターとして MigrationController を使用します。

# 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 # descheduler が実行される間隔。この例では 120 秒に設定されています。
    nodeSelector: # デスケジューリングの対象となるノード。デフォルトでは、すべてのノードがデスケジューリングされます。
      matchLabels:
        alibabacloud.com/nodepool-id: nodepool-1 # 要件に応じて設定してください。
    maxNoOfPodsToEvictPerNode: 10 # 1 つのノードから排除できる Pod の最大数。この制限はグローバルに適用されます。デフォルトでは制限は設定されていません。
    maxNoOfPodsToEvictPerNamespace: 10 # 1 つの名前空間から排除できる 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: # すべてのプラグインはデフォルトで無効になっています。有効にするものを指定します。
          enabled:
            - name: RemovePodsViolatingNodeTaints  # ノード Taint 検証プラグインを有効にします。
        balance: # すべてのプラグインはデフォルトで無効になっています。
          disabled:
            - name: "*" # すべての Balance プラグインを無効にします。
        evict:
          enabled:
            - name: MigrationController # MigrationController はデフォルトで有効です。
        filter:
          enabled:
            - name: MigrationController # デフォルトで MigrationController のフィルタリングポリシーを使用します。

      pluginConfig:
      - name: RemovePodsViolatingNodeTaints
        args:
          excludedTaints:
          - deschedule=not-allow # Taint キーが deschedule で Taint 値が not-allow のノードを無視します。
          - reserved # Taint キーが reserved のノードを無視します。
          includePreferNoSchedule: false # false の場合、NoSchedule Taint のみをチェックします。
          namespaces:
            include: # これらの名前空間にデスケジューリングを制限します。
              - "namespace1"
              - "namespace2"
            # exclude: # または、これらの名前空間を除外します。
            #   - "namespace1"
            #   - "namespace2"
          labelSelector: # これらのラベルに一致する Pod のみをデスケジューリングします。
            accelerator: nvidia-tesla-p100

      - name: MigrationController
        args:
          apiVersion: descheduler/v1alpha2
          kind: MigrationControllerArgs
          defaultJobMode: EvictDirectly
          evictLocalStoragePods: false # false の場合、emptyDir または hostPath を使用する Pod はデスケジューリングされません。
          maxMigratingPerNode: 1 # ノード上で同時に移行される Pod の最大数。
          maxMigratingPerNamespace: 1  # 名前空間内で同時に移行される Pod の最大数。
          maxMigratingPerWorkload: 1 # ワークロード内で同時に移行される Pod の最大数。
          maxUnavailablePerWorkload: 2 # ワークロードで許容される利用不可能なレプリケーションされた Pod の最大数。
          objectLimiters:
            workload: # ワークロードレベルの移行を制限します。デフォルト:5 分以内にワークロードごとに 1 Pod のみ。
              duration: 5m
              maxMigrating: 1
          evictionPolicy: Eviction # デフォルトで Eviction API を使用します。

システム設定

DeschedulerConfiguration でグローバルなシステムレベルの動作を設定します。

パラメーター タイプ 有効な値 説明
dryRun boolean true / false (デフォルト:false) 読み取り専用モード。有効にすると、Pod は移行されません。 false
deschedulingInterval time.Duration >0s descheduler が実行される頻度。 120s
nodeSelector Structure デスケジューリングの対象となるノードを制限します。matchLabels (1 つのノードプール) または matchExpressions (複数のノードプール) を受け入れます。詳細については、「Kubernetes labelSelector」をご参照ください。 上記の YAML 例をご参照ください
maxNoOfPodsToEvictPerNode int ≥0 (デフォルト:0) 1 回のデスケジューリング周期で 1 つのノードから排除される Pod の最大数。0 は制限なしを意味します。 10
maxNoOfPodsToEvictPerNamespace int ≥0 (デフォルト:0) 1 回のデスケジューリング周期で 1 つの名前空間から排除される Pod の最大数。0 は制限なしを意味します。 10

テンプレート設定

各テンプレート (profiles) は、以下のフィールドでデスケジューリングポリシーとエビクターをグループ化します:

  • `name`:テンプレートの識別子。

  • `plugins`:デスケジューリングポリシー (deschedulebalance)、エビクター (evict)、および排除前フィルター (filter) を有効または無効にします。

  • `pluginConfig`:プラグインごとの引数。name フィールドをプラグイン名と一致させ、args を設定します。詳細については、「ポリシー・プラグインの設定」および「エビクター・プラグインの設定」をご参照ください。

  • `nodeSelector`:テンプレートを特定のノードに制限します。設定しない場合、すべてのノードに適用されます。

テンプレートレベルの nodeSelector を使用するには、ack-koordinator v1.6.1-ack.1.16 以降が必要です。

`plugins` フィールドのリファレンス:

フィールド サポートされているプラグイン 説明
deschedule RemovePodsViolatingNodeTaints, RemovePodsViolatingInterPodAntiAffinity, RemovePodsViolatingNodeAffinity, RemovePodsHavingTooManyRestarts, PodLifeTime, RemoveFailedPod デフォルトではすべて無効です。有効にするプラグインを指定します。
balance RemoveDuplicates, LowNodeUtilization, HighNodeUtilization, RemovePodsViolatingTopologySpreadConstraint, LowNodeLoad デフォルトではすべて無効です。有効にするプラグインを指定します。
evict MigrationController, DefaultEvictor Pod エビクター。MigrationController はデフォルトで有効です。複数の evict プラグインを同時に有効にしないでください。
filter MigrationController, DefaultEvictor 排除前フィルタリングポリシー。MigrationController はデフォルトで有効です。複数の filter プラグインを同時に有効にしないでください。

ポリシー・プラグインの設定

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

ポリシータイプ プラグイン 説明
Deschedule RemovePodsViolatingInterPodAntiAffinity Pod 間アンチアフィニティルールに違反する Pod を排除します。
Deschedule RemovePodsViolatingNodeAffinity ノードアフィニティルールを満たさなくなった Pod を排除します。
Deschedule RemovePodsViolatingNodeTaints ノードの Taint を許容できない Pod を排除します。
Deschedule RemovePodsHavingTooManyRestarts 再起動が頻繁すぎる Pod を排除します。
Deschedule PodLifeTime TTL が期限切れになった Pod を排除します。
Deschedule RemoveFailedPod Failed 状態の Pod を排除します。
Balance RemoveDuplicates レプリケーションされた Pod をノード間で均等に分散させます。
Balance LowNodeUtilization ノードのリソース割り当てに基づいて Pod を再配布します。
Balance HighNodeUtilization 使用率の低いノードから使用率の高いノードへ Pod を集約します。
Balance RemovePodsViolatingTopologySpreadConstraint トポロジースプレッド制約に違反する Pod を排除します。

エビクター・プラグインの設定

Koordinator Descheduler は、DefaultEvictorMigrationController の 2 つのエビクター・プラグインをサポートしています。

MigrationController

MigrationController は、移行ジョブを通じて詳細な排除制御と可観測性を提供します。

パラメーター タイプ 有効な値 説明
evictLocalStoragePods boolean true / false (デフォルト:false) false の場合、emptyDir または hostPath を使用する Pod はデスケジューリングされません。 false
maxMigratingPerNode int64 ≥0 (デフォルト:2) ノード上で同時に移行される Pod の最大数。0 は制限なしを意味します。 2
maxMigratingPerNamespace int64 ≥0 (デフォルト:0) 名前空間内で同時に移行される Pod の最大数。0 は制限なしを意味します。 1
maxMigratingPerWorkload intOrString ≥0 (デフォルト:10%) ワークロード内で同時に移行される Pod の最大数または割合。0 は制限なしを意味します。ワークロードに Pod が 1 つしかない場合、その Pod はデスケジューリングから除外されます。 1 or 10%
maxUnavailablePerWorkload intOrString ≥0 and < replica count (デフォルト:10%) ワークロードで許容される利用不可能なレプリケーションされた Pod の最大数。0 は制限なしを意味します。 1 or 10%
objectLimiters.workload Structure Duration >0 (デフォルト:5m); MaxMigrating ≥0 (デフォルト:10%) タイムウィンドウ内でワークロードレベルの移行を制限します。Duration はウィンドウの長さを設定し、MaxMigrating はそのウィンドウ内で移行される Pod の最大数を設定します。 duration: 5m maxMigrating: 1
evictionPolicy string Eviction (デフォルト), Delete, Soft Pod の排除方法を制御します。Eviction:Eviction API を呼び出して正常な排除を行います。Delete:Delete API を呼び出します。Soft:カスタムの下流処理のために scheduling.koordinator.sh/soft-eviction アノテーションを追加します。 Eviction

DefaultEvictor

DefaultEvictor は、標準の Kubernetes Descheduler エビクターです。設定については、「DefaultEvictor」をご参照ください。

MigrationController と DefaultEvictor の比較

機能 DefaultEvictor MigrationController
排除方法 Eviction API のみ Eviction API、Delete API、または Soft アノテーション
ノードごとの排除制限 サポート サポート
名前空間ごとの排除制限 サポート サポート
ワークロードごとの排除制限 非サポート サポート
ワークロードごとの利用不可制限 非サポート サポート
排除の速度制限 非サポート ワークロードごとのタイムウィンドウベースの速度制限
排除の可観測性 コンポーネントログのみ コンポーネントログと、Pod ごとの移行ステータスを含む Kubernetes イベント

次のステップ