クラスター内のリソースが不足すると、高優先度のタスクが実行に失敗する可能性があります。プリエンプションを有効にすると、ACK Scheduler はリソースシミュレーションを通じて低優先度の Pod を特定して排除し、コンピューティングリソースを解放して高優先度の Pod を起動できます。
プリエンプションポリシー
プリエンプションのプロシージャは次のとおりです:
タスクの優先度を指定する:Pod の構成に
priorityClassNameパラメーターを追加して、Pod の優先度を宣言します。システムコンポーネント (kube-proxy や etcd など) は通常、高い優先度を割り当てる
system-node-criticalPriorityClass に関連付けられています。ほとんどのシステムコンポーネントは DaemonSet としてデプロイされるため、デフォルトでは排除されません。リソースが不足した場合にプリエンプションをシミュレートする:リソース不足でスケジュールに失敗した保留中のタスクを検出すると、ACK Scheduler は、一部の低優先度タスクをシャットダウンして高優先度タスクに十分なリソースを解放できるかどうかをシミュレートします。
低優先度タスクを安全に排除する:ACK Scheduler がプリエンプションロジックをトリガーすると、kubelet はシステムの命令に従ってノードから低優先度の Pod を安全に排除し、高優先度タスクのスケジューリングを完了するのに十分なリソースを解放します。
低優先度タスクを再スケジュールする:排除された低優先度の Pod は、Deployment などのコントローラーによって再作成され、他のノードにスケジュールされます。クラスター内のリソースが依然として不足している場合、Pod は保留中のままになります。
ACK Scheduler は、デフォルトで次のプリエンプションポリシーをサポートしています。PreemptionAlgorithm パラメーターを使用して、これらのポリシーを管理および構成できます。
ポリシー | 説明 |
Default | Kubernetes のデフォルトのプリエンプションポリシーです。このポリシーを使用すると、ACK Scheduler はまず直接スケジューリングを試みます。リソースが不足している場合、ACK Scheduler はリソースプリエンプションをシミュレートして、排除する低優先度の Pod を決定し、高優先度の Pod をスケジューリングするための十分なリソースを解放します。詳細については、「Pod の優先度とプリエンプション」をご参照ください。 |
ElasticQuota | ElasticQuotaTree に基づいてプリエンプションを実行します。
|
Auto | クラスターの構成に基づいてプリエンプションポリシーを調整します。簡単に言うと、ACK Scheduler は ElasticQuota ポリシーを優先し、ElasticQuota ポリシーが有効でない場合に自動的に Default ポリシーに変更します。 |
None | プリエンプション機能を無効にします。この場合、クラスター内でプリエンプション動作は発生しません。 |
プリエンプション機能が有効になっている場合、プリエンプションポリシーは次の図に示すロジックに従って有効になります。
プリエンプションの有効化
プリエンプションを有効にする前に、「Pod の優先度とプリエンプション」を読んで関連用語を理解することを推奨します。
[preemptionAlgorithm] パラメーターを設定してプリエンプションを有効にすることで、スケジューラパラメーターをカスタマイズできます。 デフォルトのプリエンプションポリシーは Auto です。