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

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

最終更新日:Aug 29, 2026

Container Compute Service (ACS) は、all-or-nothing (オールオアナッシング) のスケジューリングを必要とする Job 向けにギャングスケジューリング機能を提供します。

前提条件

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

    ACK クラスタバージョン

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

    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-HPN コンピュートクラスのみをサポートします。詳細については、「コンピュートタイプ」をご参照ください。

  • [Enable custom labels and schedulers for GPU-HPN nodes] 設定を無効にする必要があります。詳細については、「コンポーネント設定」をご参照ください。

仕組み

通常、Job は、協調して開始および実行する必要がある複数の Pod を作成します。このため、スケジューラーは Pod のグループにリソースを単一のユニットとして割り当てる必要があります。これにより、グループ内のすべての Pod がリソースを取得するか、1 つの Pod でも配置できない場合はグループ全体がスケジューリングに失敗するかのいずれかになります。この all-or-nothing (オールオアナッシング) のスケジューリングにより、複数の Job がリソースを競合する際に発生するリソースデッドロックを防ぐことができます。

ACS の組み込みスケジューラーは、ギャングスケジューリングを使用してこれらの all-or-nothing (オールオアナッシング) のセマンティクスを実装し、Job のスムーズな実行を保証します。

重要

ギャングスケジューリンググループ内のすべての Pod は、同じ compute-class に属している必要があります。

手順

ACS のギャングスケジューリングは、Kubernetes コミュニティの PodGroup カスタムリソース、バージョン podgroups.scheduling.sigs.k8s.io/v1alpha1 と互換性があります。ジョブをサブミットする前に、ジョブの名前空間に PodGroup オブジェクトを作成する必要があります。PodGroup の定義では、minMember フィールドを設定して、ジョブが必要とする最小ポッド数を指定します。次に、ジョブのポッドを作成する際に、pod-group.scheduling.sigs.k8s.io ラベルを追加し、その値を PodGroup の名前に設定して、ポッドを PodGroup に関連付けます。その後、ACS スケジューラは、同じ PodGroup ラベルを持つすべてのポッドに、単一のユニットとしてリソースを割り当てます。

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

    apiVersion: scheduling.sigs.k8s.io/v1alpha1
    kind: PodGroup
    metadata: 
      name: demo-job-podgroup
      namespace: default
    spec: 
      scheduleTimeoutSeconds: 10 
      minMember: 3 # 実行に必要な Pod の最小数を指定します。
  2. Job を作成し、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-hpn" # compute-class を gpu-hpn として指定します。
            alibabacloud.com/gpu-model-series: "example-model" # GPU コンピュートクラスの GPU モデルを指定します。
            pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # demo-job-podgroup 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
重要

Job の parallelism が PodGroup の minMember の値以上であることを確認してください。そうでない場合、Job はスケジューリングされません。

例

この例では、ギャングスケジューリングを使用した場合のスケジューリング失敗と成功の両方のシナリオを示します。

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

    kubectl create ns test-gang
  2. 次のコマンドを実行して、test-gang 名前空間に ResourceQuota を作成します。これにより、リソースが不十分なシナリオをシミュレートして、Gang Scheduling の仕組みを実証します。

    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 に設定されています。つまり、グループの少なくとも 3 つのポッドが同時にスケジュールされる必要があるということです。この条件が満たされない場合、他のポッドは 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. 次の内容で gang-job.yaml という名前のファイルを作成します。このファイルは、4 つの Pod レプリカを持つ Job オブジェクトを定義し、それを PodGroup オブジェクトに関連付けます。

    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-hpn" # compute-class を gpu-hpn として指定します。
            alibabacloud.com/gpu-model-series: "example-model" # GPU コンピュートクラスの GPU モデルを指定します。
            pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # demo-job-podgroup 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 つに制限しますが、これは PodGroup で指定された minMember の値よりも小さいです。その結果、これら 2 つの 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 が正常にスケジューリングされたことを示しています。