オーバープロビジョニングの設定
オーバープロビジョニングを効果的に実装するには、アプリケーション用に適切な PriorityClass リソースを作成することがベストプラクティスと考えられています。まず、globalDefault: true フィールドを使用してグローバルデフォルトのプライオリティクラスを作成しましょう。このデフォルトの PriorityClass は、PriorityClassName を指定していないポッドとデプロイメントに割り当てられます。
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: default
value: 0
globalDefault: true
description: "Default Priority class."
値は必須の value フィールドで指定されます。値が高いほど、優先度が高くなります。
globalDefault フィールドは、この PriorityClass の値が priorityClassName のないポッドに使用されるべきであることを示します。
次に、オーバープロビジョニングに使用するポーズポッド専用の PriorityClass を作成し、優先度の値を -1 に設定します。
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
name: pause-pods
value: -1
globalDefault: false
description: "Priority class used by pause-pods for overprovisioning."
優先度の値「-1」により、空の「ポーズ」コンテナがプレースホルダーとして機能します。実際のワークロードがスケジュールされると、空のプレースホルダーコンテナは退避され、アプリケーションポッドが即座にプロビジョニングできるようになります。
ポーズポッドは、環境に必要なオーバープロビジョニングの量に基づいて、十分な数の利用可能なノードを確保する上で重要な役割を果たします。EKS ノードグループの ASG の --max-size パラメータを考慮することが重要です。Cluster Autoscaler は ASG で指定された最大数を超えてノードの数を増やすことはありません。
apiVersion: apps/v1
kind: Deployment
metadata:
name: pause-pods
namespace: other
spec:
replicas: 2
selector:
matchLabels:
run: pause-pods
template:
metadata:
labels:
run: pause-pods
spec:
priorityClassName: pause-pods
containers:
- name: reserve-resources
image: registry.k8s.io/pause
resources:
requests:
memory: "6.5Gi"
ポーズポッドのレプリカを2つデプロイ
先ほど作成したプライオリティクラスを使用
これらのポッドはそれぞれ 6.5Gi のメモリを要求しているため、m5.large インスタンスをほぼ1つ消費し、結果として常に2つの「予備」ワーカーノードが利用可能な状態になります。
これらの更新をクラスタに適用しましょう:
priorityclass.scheduling.k8s.io/default created
priorityclass.scheduling.k8s.io/pause-pods created
deployment.apps/pause-pods created
このプロセスが完了すると、ポーズポッドが実行中になります:
NAME READY STATUS RESTARTS AGE
pause-pods-7f7669b6d7-v27sl 1/1 Running 0 5m6s
pause-pods-7f7669b6d7-v7hqv 1/1 Running 0 5m6s
これで、Cluster Autoscaler によって追加のノードがプロビジョニングされたことを確認できます:
NAME STATUS ROLES AGE VERSION
ip-10-42-10-159.us-west-2.compute.internal Ready <none> 3d v1.33-eks-036c24b
ip-10-42-10-111.us-west-2.compute.internal Ready <none> 33s v1.33-eks-036c24b
ip-10-42-10-133.us-west-2.compute.internal Ready <none> 33s v1.33-eks-036c24b
ip-10-42-11-143.us-west-2.compute.internal Ready <none> 3d v1.33-eks-036c24b
ip-10-42-11-81.us-west-2.compute.internal Ready <none> 3d v1.33-eks-036c24b
ip-10-42-12-152.us-west-2.compute.internal Ready <none> 3m11s v1.33-eks-036c24b
これらの2つの追加ノードは、私たちのポーズポッド以外のワークロードは実行していません。これらのポッドは「実際の」ワークロードがスケジュールされると退避されます。