クラスター内の計算リソースをさまざまなチームやジョブで共有できるようにし、効果的なリソース割り当てと隔離を確保するために、ack-kube-queue、ElasticQuotaTree、および ack-scheduler を使用できます。 ack-kube-queue コンポーネントは、AI、機械学習(ML)、およびバッチワークロードのジョブキューを管理します。 ElasticQuotaTree は、詳細なリソースクォータを管理します。 ack-scheduler コンポーネントは、ジョブを実行するノードを選択します。
前提条件
ElasticQuotaTree を使用したリソースクォータの送信
ACK クラスターで ElasticQuotaTree を使用することにより、限られたリソース範囲内でジョブを効率的にスケジュールできます。 これにより、各チームが割り当てられたリソースを使用し、無駄と競合を防ぐことができます。 ElasticQuotaTree はツリー構造を使用して、各チームまたは個人が使用できるリソースまたはマシンの数を指定します。 チームがジョブを送信した後、システムはジョブのリソースクォータが十分かどうかを自動的にチェックします。 システムは、リソースクォータがリソースリクエストを満たせることを確認した後にのみ、ジョブリソースを割り当ててジョブを開始します。 リソースクォータの最小リソース要件を保証できない場合、スケジューリングシステムは下限を超えるクォータからリソースを再利用します。
次の図は例を示しています。 企業では、O&M 部門のテキストチームとビデオチーム、アルゴリズム部門、およびインフラストラクチャ部門のテストチームは、名前空間で異なる CPU、メモリ、および GPU リソースクォータを持っています。
次のセクションでは、ElasticQuotaTree を使用してリソースクォータを送信するための使用上の注意と例を示します。
名前空間はリーフノードにのみマウントできます。 親ノードに名前空間をマウントすることはできません。
同じノードでは、min パラメーターの値は max パラメーターの値以下である必要があります。
親ノードの最小値は、その子クォータノードの最小値の合計以下である必要があります。
親ノードの最大値は、親クォータノードの子クォータノードの最大値以下である必要があります。
---
apiVersion: v1
kind: Namespace
metadata:
name: devops
---
apiVersion: v1
kind: Namespace
metadata:
name: text1
---
apiVersion: v1
kind: Namespace
metadata:
name: text2
---
apiVersion: v1
kind: Namespace
metadata:
name: video
---
apiVersion: v1
kind: Namespace
metadata:
name: test1
---
apiVersion: v1
kind: Namespace
metadata:
name: test2
---
apiVersion: scheduling.sigs.k8s.io/v1beta1
kind: ElasticQuotaTree
metadata:
name: elasticquotatree # ElasticQuotaTree は 1 つだけサポートされています。
namespace: kube-system # エラスティッククォータグループは、グループが kube-system 名前空間に作成されている場合にのみ有効になります。
spec:
root:
name: root
min: # min のデフォルト値は 0 です。これは、リソースが保証されていないことを示しますが、ジョブを送信することはできます。
cpu: 100
memory: 50Gi
nvidia.com/gpu: 16
max: # max のデフォルト値は NA です。これは、使用可能なリソースの最大数が無制限であることを示します。
cpu: 100
memory: 50Gi
nvidia.com/gpu: 16
children:
- name: devops
min:
cpu: 20
memory: 10Gi
nvidia.com/gpu: 4
max:
cpu: 40
memory: 20Gi
nvidia.com/gpu: 8
namespaces: # 名前空間を設定します。
- devops
- name: algorithm
min:
cpu: 50
memory: 25Gi
nvidia.com/gpu: 10
max:
cpu: 80
memory: 50Gi
nvidia.com/gpu: 14
children:
- name: text
min:
cpu: 40
memory: 15Gi
nvidia.com/gpu: 8
max:
cpu: 40
memory: 30Gi
nvidia.com/gpu: 10
namespaces: # 名前空間を設定します。
- text1
- text2
- name: video
min:
cpu: 12
memory: 12Gi
nvidia.com/gpu: 2
max:
cpu: 14
memory: 14Gi
nvidia.com/gpu: 4
namespaces: # 名前空間を設定します。
- video
- name: infrastructure
min:
cpu: 30
memory: 15Gi
nvidia.com/gpu: 2
max:
cpu: 50
memory: 30Gi
nvidia.com/gpu: 4
children:
- name: test
min:
cpu: 30
memory: 15Gi
nvidia.com/gpu: 2
max:
cpu: 50
memory: 30Gi
nvidia.com/gpu: 4
namespaces: # 名前空間を設定します。
- test1
- test2ack-kube-queue を使用したジョブキューの管理
ack-kube-queue は、さまざまな部門やチームのジョブを適切なキューに割り当てることができます。 ElasticQuotaTree が送信されると、ack-kube-queue はクラスター内にキューを作成します。 各リーフノードのリソースクォータは、クラスター内の個別のキューにマッピングされます。 ジョブがクラスターに送信されると、ack-kube-queue はジョブの QueueUnit オブジェクトを自動的に作成します。 Kube Queue のリソース割り当ての単位である QueueUnit は、ジョブに自動的に関連付けられます。 ack-kube-queue は、QueueUnit の名前空間とそのリソースクォータの関係に基づいて、ジョブを対応するキューに自動的に割り当てます。
この例では、RayJob が使用されています。 ビデオチームはビデオを特定の名前空間に関連付け、min パラメーターと max パラメーターを使用してリソースクォータを設定します。 ack-kube-queue コンポーネントは、クォータに root-algorithm-video という名前の関連付けられたキューを自動的に作成します。 video 名前空間に RayJob オブジェクトを送信すると、対応する QueueUnit リソースオブジェクトが自動的に作成され、root-algorithm-video キューに入れられます。 RayJob によってリクエストされたリソースの総量が使用可能なクォータを満たしている場合、RayJob は root-algorithm-video キューからデキューされ、スケジューラによって処理されます。
ElasticQuotaTree とキュー間の自動関連付けロジック
ack-kube-queue のコントローラーロジックは、クラスター内のキューリソースを自動的に管理できます。 このロジックは ElasticQuotaTree に基づいて維持され、ElasticQuotaTree で定義されたクォータと名前空間間の関連付けを対応するキューにマッピングします。
キュー操作ロジック
この例では、RayJob が使用されています。 RayJob の suspend フィールドが true に設定されている場合、ack-kube-queue はジョブを検出し、QueueUnit を作成します。 QueueUnit は対応するキューに入れられます。 キューイングポリシーの条件に基づいてキューがデキューされると、ack-kube-queue は RayJob の suspend フィールドを false に設定します。 KubeRay オペレーターによって管理される RayJob とポッドが作成されます。 ポッドはスケジューラによって管理されます。