保証された最小値を持つ階層クォータを構成し、チーム間でクラスターのアイドル容量を共有します。
Kubernetes のネイティブ ResourceQuota は固定リソース上限を適用するため、チームが割り当てられたクォータを十分に使用しない場合、リソースがアイドル状態になることがよくあります。Container Service for Kubernetes (ACK) はスケジューリングフレームワーク拡張を通じてキャパシティスケジューリングを実装し、この静的モデルをエラスティッククォータグループに置き換えます。これにより、アイドルリソースは共有され、所有者が必要とした際に回収されます。これにより、リソース保証を損なうことなくクラスターの利用率を向上させることができます。
前提条件
以下の条件を満たしていることを確認してください。
-
Kubernetes 1.20 以降を実行している ACK マネージドプロ版クラスター
基本概念
ElasticQuotaTree は、エラスティッククォータグループの階層を定義するカスタムリソース定義 (CRD) です。各ノードはクォータ境界を表します。リーフノードは 1 つ以上の名前空間に対応し、それらの名前空間内の Pod はそのリーフノードのクォータ制限内でスケジュールされます。
各クォータノードにおける 2 つのコアフィールドは次のとおりです。
| フィールド | 意味 |
|---|---|
min |
保証リソース。スケジューラはこの量が利用可能であることを保証し、必要に応じて借用されたリソースを回収します。 |
max |
クォータノードが使用可能な最大リソース量(他のノードから借用したアイドルリソースを含む)。 |
リソースの借用と回収 は次のように動作します。
-
Pod のリクエストリソースとノードの現在の使用量の合計が
maxの範囲内であれば、その Pod はスケジュールされます。 -
ノードの使用量が
minを超える場合、超過分はツリー内の他の場所にあるアイドル容量から借用されます。 -
別のクォータノードが自身の
minリソースを必要とする場合、スケジューラはタスク優先度、可用性、作成時刻などの要因に基づいて、借用側ノードから削除対象の Pod を選択します。
機能
-
階層クォータ:複数レベル(例:組織構造に合わせた構成)でエラスティッククォータを設定できます。各リーフノードは複数の名前空間に対応できますが、各名前空間は 1 つのリーフノードにのみ属します。

-
リソースの借用と回収:
minリソースのアイドル部分を他のクォータノードが借用できます。借用されたリソースは、元の所有者が必要とした際に自動的に回収されます。
-
拡張リソースのサポート:CPU やメモリに加え、キャパシティスケジューリングは GPU (
nvidia.com/gpu) および他の Kubernetes サポート済みリソースタイプもサポートします。 -
ResourceFlavor を使ったノードアフィニティ:クォータノードに ResourceFlavor をアタッチすることで、そのクォータ内の Pod を特定のノードに限定できます。「ノードアフィニティ用の ResourceFlavor の構成」をご参照ください。
キャパシティスケジューリングの構成
この例では、単一の ecs.sn2.13xlarge ノード(56 vCPU、224 GiB メモリ)を持つクラスターを使用します。
ステップ 1:名前空間の作成
kubectl create ns namespace1
kubectl create ns namespace2
kubectl create ns namespace3
kubectl create ns namespace4
ステップ 2:ElasticQuotaTree の作成
kube-system 名前空間に ElasticQuotaTree を作成します。この例では、4 つのリーフクォータノードを持つ 2 階層の構造を使用します。
ElasticQuotaTree は kube-system 名前空間に作成された場合にのみ有効になります。
apiVersion: scheduling.sigs.k8s.io/v1beta1
kind: ElasticQuotaTree
metadata:
name: elasticquotatree
namespace: kube-system
spec:
root:
name: root
max:
cpu: 40
memory: 40Gi
nvidia.com/gpu: 4
min:
cpu: 40
memory: 40Gi
nvidia.com/gpu: 4
children:
- name: root.a
max:
cpu: 40
memory: 40Gi
nvidia.com/gpu: 4
min:
cpu: 20
memory: 20Gi
nvidia.com/gpu: 2
children:
- name: root.a.1
namespaces:
- namespace1
max:
cpu: 20
memory: 20Gi
nvidia.com/gpu: 2
min:
cpu: 10
memory: 10Gi
nvidia.com/gpu: 1
- name: root.a.2
namespaces:
- namespace2
max:
cpu: 20
memory: 40Gi
nvidia.com/gpu: 2
min:
cpu: 10
memory: 10Gi
nvidia.com/gpu: 1
- name: root.b
max:
cpu: 40
memory: 40Gi
nvidia.com/gpu: 4
min:
cpu: 20
memory: 20Gi
nvidia.com/gpu: 2
children:
- name: root.b.1
namespaces:
- namespace3
max:
cpu: 20
memory: 20Gi
nvidia.com/gpu: 2
min:
cpu: 10
memory: 10Gi
nvidia.com/gpu: 1
- name: root.b.2
namespaces:
- namespace4
max:
cpu: 20
memory: 20Gi
nvidia.com/gpu: 2
min:
cpu: 10
memory: 10Gi
nvidia.com/gpu: 1
ElasticQuotaTree は以下の制約を満たす必要があります。
-
各クォータノード内:
min≤max -
各親ノードについて:子ノードの
min値の合計 ≤ 親ノードのmin値 -
ルートノードについて:
min=max≤ クラスター全体のリソース量 -
各名前空間は正確に 1 つのリーフノードに属する。リーフノードは複数の名前空間を含むことができる
ステップ 3:ElasticQuotaTree の確認
kubectl get ElasticQuotaTree -n kube-system
期待される出力:
NAME AGE
elasticquotatree 68s
リソースの借用と回収の観察
以下のシナリオでは、4 つの名前空間にワークロードをデプロイした際のリソース借用および回収の動作を示します。
ノードアフィニティ用の ResourceFlavor の構成
ResourceFlavor は Kueue の CRD であり、ノードラベルの一致に基づいてクォータノードを特定のノードにバインドします。
前提条件
以下の条件を満たしていることを確認してください。
-
ResourceFlavor CRD が適用されていること(デフォルトではインストールされません)
ResourceFlavor では nodeLabels フィールドのみが有効です。
ResourceFlavor の作成
この例では、instance-type: spot ラベルを持つノードを対象とする spot という名前の ResourceFlavor を作成します。
apiVersion: kueue.x-k8s.io/v1beta1
kind: ResourceFlavor
metadata:
name: "spot"
spec:
nodeLabels:
instance-type: spot
エラスティッククォータへの ResourceFlavor の関連付け
クォータノードに ResourceFlavor をバインドするには、ElasticQuotaTree 内で attributes.resourceflavors フィールドを使用して宣言します。
apiVersion: scheduling.sigs.k8s.io/v1beta1
kind: ElasticQuotaTree
metadata:
name: elasticquotatree
namespace: kube-system
spec:
root:
name: root
max:
cpu: 999900
memory: 400000Gi
nvidia.com/gpu: 100000
min:
cpu: 999900
memory: 400000Gi
nvidia.com/gpu: 100000
children:
- name: child
namespaces:
- default
attributes:
resourceflavors: spot
max:
cpu: 99
memory: 40Gi
nvidia.com/gpu: 10
min:
cpu: 99
memory: 40Gi
nvidia.com/gpu: 10
この構成により、child クォータノード(名前空間 default)内の Pod は、instance-type: spot ラベルを持つノードにのみスケジュールされます。
次のステップ
-
「kube-scheduler リリースノート」をご参照ください。
-
kube-scheduler はギャングスケジューリングもサポートしており、これはグループ内のすべての Pod をまとめてスケジュールします。いずれかの Pod をスケジュールできない場合は、どれもスケジュールされません。Spark や Hadoop などのビッグデータワークロードに適しています。「ギャングスケジューリングの操作」をご参照ください。