仕組み
Kubernetesでは、他のPodに対する相対的な優先度をPodに割り当てることができます。Kubernetesスケジューラはこれらの優先度を使用して、より優先度の高いPodを収容するために優先度の低いPodを先取りします。これはPriorityClassリソースを通じて実現され、Podに割り当てることができる優先度値を定義します。さらに、デフォルトのPriorityClassをネームスペースに割り当てることができます。
以下は、他のPodよりも比較的高い優先度をPodに与える優先度クラスの例です:
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: high-priority
value: 1000
globalDefault: false
description: "Priority class used for high priority Pods only."
そして、上記の優先度クラスを使用したPod仕様の例です:
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
priorityClassName: high-priority # Priority Class specified
これがどのように機能するかについての詳細な説明は、Kubernetesのドキュメント「Pod Priority and Preemption」を参照してください。
EKSクラスターでのコンピュートのオーバープロビジョニングにこの概念を適用するには、次の手順を実行します:
-
優先度値「-1」を持つ優先度クラスを作成し、空のPause Containerに割り当てます。これらの空の「pause」コンテナはプレースホルダーとして機能します。
-
優先度値「0」を持つデフォルトの優先度クラスを作成します。これはクラスター全体にグローバルに割り当てられるため、優先度クラスが指定されていない任意のデプロイメントにはこのデフォルトの優先度が割り当てられます。
-
実際のワークロードがスケジュールされると、空のプレースホルダーコンテナが退避され、アプリケーションPodが即座にプロビジョニングされるようになります。
-
クラスターにPending(Pause Container)Podがあるため、Cluster Autoscalerは、EKSノードグループに関連付けられた**ASG設定(
--max-size)**に基づいて、追加のKubernetesワーカーノードをプロビジョニングします。
オーバープロビジョニング のレベルは、以下を調整することでコントロールできます:
- pauseポッドの数(replicas)とCPUおよびメモリリソース要求
- EKSノードグループの最大ノード数(
maxsize)
この戦略を実装することで、クラスターが常に新しいワークロードに対応できる余分な容量を持つことを確保でき、新しいPodがスケジュール可能になるまでの時間を短縮することができます。