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

Container Compute Service:ギャングスケジューリングの使用

最終更新日:Nov 09, 2025

Alibaba Cloud Container Compute Service (ACS) は、ジョブスケジューリングシナリオにおけるオールオアナッシングの要件を満たすギャングスケジューリング機能を提供します。このトピックでは、ギャングスケジューリングの使用方法について説明します。

前提条件

  • kube-scheduler がインストールされており、そのバージョンが次の要件を満たしていること。

    ACS クラスターバージョン

    スケジューラコンポーネントのバージョン

    1.31

    v1.31.0-aliyun-1.2.0 以降

    1.30

    v1.30.3-aliyun-1.1.1 以降

    1.28

    v1.28.9-aliyun-1.1.0 以降

  • ギャングスケジューリングは、パフォーマンス専有型ネットワーク GPU (gpu-hpn) 計算タイプのみをサポートします。詳細については、「計算タイプの定義」をご参照ください。

  • [GPU-HPN ノードのカスタムラベルとスケジューラを有効にする] 設定が無効になっていること。詳細については、「コンポーネント構成」をご参照ください。

機能紹介

ジョブが複数の Pod を作成する場合、Pod は協調して起動し、実行される必要があります。すべての Pod が同時にリソースをリクエストできるように、Pod のグループにリソースをバッチで割り当てる必要があります。単一の Pod のスケジューリング要件が満たされない場合、Pod グループ全体のスケジューリングは失敗します。スケジューラは、これらのオールオアナッシングのスケジューリングセマンティクスを提供し、複数のジョブ間のリソース競合によって引き起こされるリソースのデッドロックを防ぎます。

ACS の組み込みスケジューラは、オールオアナッシングのスケジューリングを実装するためのギャングスケジューリング機能を提供し、ジョブが正常に実行されることを保証します。

重要

ギャングスケジューリング機能が構成されている Pod のグループは、同じ計算クラスに属している必要があります。

使用方法

ACS が提供するギャングスケジューリング機能は、Kubernetes の PodGroup カスタムリソースと互換性があります。対応するバージョンは podgroups.scheduling.sigs.k8s.io/v1alpha1 です。ジョブを送信する前に、ジョブの名前空間に PodGroup インスタンスを作成し、ジョブの実行に必要な Pod の最小数 (`minMember`) を指定する必要があります。次に、ジョブの Pod を作成するときに、Pod-group.scheduling.sigs.k8s.io ラベルを使用して PodGroup インスタンスに関連付ける必要があります。スケジューリング中、ACS は同じ PodGroup ラベルを共有するすべての Pod にリソースを割り当てます。

  1. PodGroup カスタムリソースを作成します。

    apiVersion: scheduling.sigs.k8s.io/v1alpha1
    kind: PodGroup
    metadata: 
      name: demo-job-podgroup
      namespace: default
    spec: 
      scheduleTimeoutSeconds: 10 
      minMember: 3 # 実行中の Pod の最小数を設定します。
  2. ジョブを作成し、PodGroup に関連付けます。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gang-job
      namespace: default
    spec:
      parallelism: 3 # Pod の数は、PodGroup オブジェクトの minMember 以上である必要があります。
      template:
        metadata:
          labels:
            alibabacloud.com/compute-class: "gpu" # 計算クラスを gpu または gpu-hpn として指定します。
            alibabacloud.com/gpu-model-series: "example-model" # GPU 計算クラスでは、GPU モデルを指定する必要があります。
            pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # PodGroup インスタンス demo-job-podgroup に関連付けます。
        spec:
          containers:
          - name: demo-job
            image: registry.cn-hangzhou.aliyuncs.com/acs/stress:v1.0.4
            args:
              - 'infinity'
            command:
              - sleep
            resources:
              requests:
                cpu: "1"
                memory: "1Gi"
                nvidia.com/gpu: "1"
              limits:
                cpu: "1"
                memory: "1Gi"
                nvidia.com/gpu: "1"
          restartPolicy: Never
      backoffLimit: 4
重要

関連付けられた Pod の数が、PodGroup インスタンスに構成された `minMember` の値以上であることを確認してください。そうでない場合、Pod はスケジュールできません。

この例では、ジョブにギャングスケジューリングを使用した場合の、スケジューリングが成功した場合と失敗した場合の両方の結果を示します。

  1. 次のコマンドを実行して、test-gang 名前空間を作成します。

    kubectl create ns test-gang
  2. 次のコマンドを実行して test-gang 名前空間に ResourceQuota を作成し、リソースが不十分な場合にギャングスケジューリングがどのように動作するかをデモンストレーションします。

    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: object-counts
      namespace: test-gang
    spec:
      hard:
        pods: "2"
    EOF
  3. 次のコマンドを実行して、PodGroup オブジェクトを作成します。オブジェクトでは、minMember が 3 に設定されており、関連付けられた Pod のうち少なくとも 3 つが同時に正常にスケジュールされる必要があることを指定します。Pod のいずれかが作成またはスケジュールに失敗した場合、グループ内のすべての Pod は Pending 状態のままになります。

    cat << EOF | kubectl apply -f -
    apiVersion: scheduling.sigs.k8s.io/v1alpha1
    kind: PodGroup
    metadata: 
      name: demo-job-podgroup
      namespace: test-gang
    spec: 
      minMember: 3 # 実行中の Pod の最小数を設定します。
    EOF
  4. 次の YAML コンテンツを使用して、gang-job.yaml ファイルを作成します。このファイルは、4 つの Pod レプリカを指定し、PodGroup オブジェクトに関連付けられた Job オブジェクトを定義します。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gang-job
      namespace: test-gang
    spec:
      parallelism: 4 # Pod の数は、PodGroup オブジェクトの minMember 以上である必要があります。
      template:
        metadata:
          labels:
            alibabacloud.com/compute-class: "gpu" # 計算クラスを gpu または gpu-hpn として指定します。
            alibabacloud.com/gpu-model-series: "example-model" # GPU 計算クラスでは、GPU モデルを指定する必要があります。
            pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # PodGroup インスタンス demo-job-podgroup に関連付けます。
        spec:
          containers:
          - name: demo-job
            image: registry.cn-hangzhou.aliyuncs.com/acs/stress:v1.0.4
            args:
              - 'infinity'
            command:
              - sleep
            resources:
              requests:
                cpu: "1"
                memory: "1Gi"
                nvidia.com/gpu: "1"
              limits:
                cpu: "1"
                memory: "1Gi"
                nvidia.com/gpu: "1"
          restartPolicy: Never
      backoffLimit: 4
  5. 次のコマンドを実行して、gang-job ジョブをクラスターにデプロイします。

    kubectl apply -f gang-job.yaml
  6. 次のコマンドを実行して、Pod のステータスを表示します。

    kubectl get pod -n test-gang

    期待される出力:

    NAME             READY   STATUS    RESTARTS   AGE
    gang-job-hrnc6   0/1     Pending   0          23s
    gang-job-wthnq   0/1     Pending   0          23s

    ResourceQuota は実行中の Pod の数を 2 に制限するため、このジョブに対して作成される Pod は 2 つだけです。この数は、PodGroup で指定された `minMember` の値よりも少ないです。したがって、両方の Pod は Pending 状態のままで、スケジュールされません。

  7. 次のコマンドを実行して ResourceQuota を削除し、Pod 数の制限を解除します。

    kubectl delete resourcequota -n test-gang object-counts
  8. 次のコマンドを実行して、Pod のステータスを表示します。

    kubectl get pod -n test-gang

    期待される出力:

    NAME             READY   STATUS    RESTARTS   AGE
    gang-job-24cz9   1/1     Running   0          96s
    gang-job-mmkxl   1/1     Running   0          96s
    gang-job-msr8v   1/1     Running   0          96s
    gang-job-qnclz   1/1     Running   0          96s

    出力は、Pod が正常にスケジュールされたことを示しています。