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

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

最終更新日:Mar 18, 2026

ガンスケジューリングは、Alibaba Cloud Container Compute Service (ACS) におけるマルチ Pod ジョブに対して「すべてまたは何もなし(all-or-nothing)」のスケジューリングを提供します。スケジューラは、最低限必要な数の Pod を同時に配置できるまで、すべての Pod を保留状態にします。これにより、AI トレーニングジョブ、MPI タスク、およびマルチロール推論パイプラインなどの分散ワークロードで発生するリソースデッドロックを防止します。

ガンスケジューリングの仕組み

ジョブが複数の Pod を作成する場合、すべての Pod は同時に起動する必要があります。ガンスケジューリングでは、リソースがグループ全体に対して一度に割り当てられます。つまり、最低限必要な数の Pod を同時にスケジュールできない場合、いずれの Pod もスケジュールされません。これにより、ジョブがリソースを部分的に取得して互いにブロックするという原因によるリソースデッドロックが防止されます。

ACS におけるガンスケジューリングは、PodGroup カスタムリソース(podgroups.scheduling.sigs.k8s.io/v1alpha1)を用いて実装されています。まず、グループ制約を定義するために PodGroup を作成し、その後、ラベルを用いてジョブの Pod をその PodGroup に関連付けます。

重要

ガンスケジューリングを設定したすべての Pod は、同一のコンピュートクラスに属している必要があります。

前提条件

  • 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 ノード向けのカスタムラベルおよびスケジューラの有効化 設定が無効化されている必要があります。詳細については、「コンポーネント構成」をご参照ください。

ガンスケジューリングの構成

  1. PodGroup カスタムリソースを作成します。minMember フィールドには、同時にスケジュールする必要がある最小 Pod 数を指定します。scheduleTimeoutSeconds フィールドには、スケジューリング試行を失敗とみなすまでの待機時間を秒単位で指定します。

    apiVersion: scheduling.sigs.k8s.io/v1alpha1
    kind: PodGroup
    metadata:
      name: demo-job-podgroup
      namespace: default
    spec:
      scheduleTimeoutSeconds: 10
      minMember: 3 # 実行中の Pod の最小数を設定します。
  2. ジョブを作成し、それを PodGroup に関連付けます。gang-job.yaml というファイルに以下の内容を保存します。Pod テンプレート上のラベル pod-group.scheduling.sigs.k8s.io: demo-job-podgroup により、すべての Pod が指定された 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" # コンピュートクラスを 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
  3. ジョブをクラスターにデプロイします。

    kubectl apply -f gang-job.yaml
  4. Pod のスケジュール状態を確認します。スケジュールが成功した場合、すべての Pod が Pending 状態から同時に Running 状態へとトランジションします。

    kubectl get podgroup -n default
    kubectl get pods -n default -l pod-group.scheduling.sigs.k8s.io=demo-job-podgroup
重要

関連付けられた 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 に設定しており、少なくとも 3 つの関連 Pod を同時に正常にスケジュールする必要があることを指定しています。いずれかの 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 レプリカを指定する 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" # コンピュートクラスを 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 に制限されているため、このジョブでは 2 つの Pod のみが作成されます。これは、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 が正常にスケジュールされたことが確認できます。