すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ElasticQuotaTree と ack-kube-queue を使用したリソース使用率の向上

最終更新日:Feb 20, 2025

クラスター内の計算リソースをさまざまなチームやジョブで共有できるようにし、効果的なリソース割り当てと隔離を確保するために、ack-kube-queue、ElasticQuotaTree、および ack-scheduler を使用できます。 ack-kube-queue コンポーネントは、AI、機械学習(ML)、およびバッチワークロードのジョブキューを管理します。 ElasticQuotaTree は、詳細なリソースクォータを管理します。 ack-scheduler コンポーネントは、ジョブを実行するノードを選択します。

前提条件

ack-koordinator コンポーネントがインストールされている

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 
        - test2

ack-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 とポッドが作成されます。 ポッドはスケジューラによって管理されます。