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

Container Service for Kubernetes:プリエンプションの有効化

最終更新日:Dec 17, 2025

クラスター内のリソースが不足すると、高優先度のタスクが実行に失敗する可能性があります。プリエンプションを有効にすると、ACK Scheduler はリソースシミュレーションを通じて低優先度の Pod を特定して排除し、コンピューティングリソースを解放して高優先度の Pod を起動できます。

プリエンプションポリシー

プリエンプションのプロシージャは次のとおりです:

  1. タスクの優先度を指定する:Pod の構成に priorityClassName パラメーターを追加して、Pod の優先度を宣言します。

    システムコンポーネント (kube-proxy や etcd など) は通常、高い優先度を割り当てる system-node-critical PriorityClass に関連付けられています。ほとんどのシステムコンポーネントは DaemonSet としてデプロイされるため、デフォルトでは排除されません。
  2. リソースが不足した場合にプリエンプションをシミュレートする:リソース不足でスケジュールに失敗した保留中のタスクを検出すると、ACK Scheduler は、一部の低優先度タスクをシャットダウンして高優先度タスクに十分なリソースを解放できるかどうかをシミュレートします。

  3. 低優先度タスクを安全に排除する:ACK Scheduler がプリエンプションロジックをトリガーすると、kubelet はシステムの命令に従ってノードから低優先度の Pod を安全に排除し、高優先度タスクのスケジューリングを完了するのに十分なリソースを解放します。

  4. 低優先度タスクを再スケジュールする:排除された低優先度の Pod は、Deployment などのコントローラーによって再作成され、他のノードにスケジュールされます。クラスター内のリソースが依然として不足している場合、Pod は保留中のままになります。

ACK Scheduler は、デフォルトで次のプリエンプションポリシーをサポートしています。PreemptionAlgorithm パラメーターを使用して、これらのポリシーを管理および構成できます。

ポリシー

説明

Default

Kubernetes のデフォルトのプリエンプションポリシーです。このポリシーを使用すると、ACK Scheduler はまず直接スケジューリングを試みます。リソースが不足している場合、ACK Scheduler はリソースプリエンプションをシミュレートして、排除する低優先度の Pod を決定し、高優先度の Pod をスケジューリングするための十分なリソースを解放します。詳細については、「Pod の優先度とプリエンプション」をご参照ください。

ElasticQuota

ElasticQuotaTree に基づいてプリエンプションを実行します。

  1. プリエンプションリストの特定:通常のタスクとは異なり、ACK Schedulergang 全体の保留中のすべての Pod をプリエンプションリストにまとめます。gang 全体は、リスト内のすべての Pod がリソースプリエンプションを通じてスケジュールできる場合にのみ処理されます。1 つの Pod がスケジュールできない場合、gang は処理されません。gang 内のいずれかの Pod に高い優先度が割り当てられている場合、gang 全体がリソースプリエンプションにおいて高優先度と見なされます。

  2. 実行可能ノードのリストを生成:ACK Scheduler は、次のルールに基づいて選択されるノードをさらに決定します:

    • gang 内の複数の Pod がプリエンプションを必要とする場合、いずれかの Pod に一致するノードが候補プールに追加されます。その後、ACK Scheduler は他の Pod のためにリソースを解放しようとします。

    • プリエンプションを必要とする Pod が 1 つだけの場合、ACK Scheduler は Unschedulable とマークされたノードを除外して、リソースが不足しているか、または一致しないノードを正確に特定します。

  3. プリエンプションのシミュレート:ACK Scheduler は、次の条件に基づいて、先行する実行可能ノードのリストからプリエンプション対象の Pod をフィルタリングすることにより、プリエンプションをシミュレートしようとします:

    • 他の Pod やタスクによってプリエンプトされていない Pod。

    • 関連する PodDisruptionBudgets (PDB) に従って排除できる Pod。

    その後、ACK Scheduler は、クラスターに構成された ElasticQuotaTree に基づいて、さまざまなシナリオで処理を進めます:

    • プリエンプションを実行する Pod がクォータに属している場合:

      • クォータの使用量 ≤ その Min 保証:クォータがまだ最小リソース保証を満たしていない場合。Pod は、現在 Min 保証を超えるリソースを使用している他のクォータから Pod をプリエンプトすることが許可されます。

      • クォータの使用量 > その Min 保証:Pod は、自身のクォータ内の低優先度の Pod のみをプリエンプトすることが許可されます (これはクォータ内プリエンプションとして知られています)。

    • プリエンプションを実行する Pod がどのクォータにも属していない場合:プリエンプションは許可されません。

    プリエンプトされる Pod をフィルタリングした後、ACK Scheduler はこれらの Pod の削除とプリエンプションを実行する Pod のスケジューリングをシミュレートします。シミュレーション結果がスケジューリングの成功を示した場合、プリエンプトされた Pod は安全に排除され、他のノードに再スケジュールされます。シミュレーション結果がスケジューリングの失敗を示した場合、プリエンプションは終了します。

Auto

クラスターの構成に基づいてプリエンプションポリシーを調整します。簡単に言うと、ACK Scheduler は ElasticQuota ポリシーを優先し、ElasticQuota ポリシーが有効でない場合に自動的に Default ポリシーに変更します。

None

プリエンプション機能を無効にします。この場合、クラスター内でプリエンプション動作は発生しません。

プリエンプション機能が有効になっている場合、プリエンプションポリシーは次の図に示すロジックに従って有効になります。

image

プリエンプションの有効化

プリエンプションを有効にする前に、「Pod の優先度とプリエンプション」を読んで関連用語を理解することを推奨します。

[preemptionAlgorithm] パラメーターを設定してプリエンプションを有効にすることで、スケジューラパラメーターをカスタマイズできます。 デフォルトのプリエンプションポリシーは Auto です。