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

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

最終更新日:Dec 26, 2024

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

前提条件

  • ACS クラスタが作成されていること。

  • kube-scheduler コンポーネントがインストールされていること。詳細については、kube-scheduler を参照してください。

  • ギャングスケジューリングは、GPU アクセラレーションコンピューティングクラスのみをサポートします。詳細については、コンピューティングクラス を参照してください。

機能紹介

ジョブは複数の Pod を作成し、これらの Pod は連携して起動および実行する必要があります。すべての Pod が同時にリソースを要求できるように、リソースは Pod のグループにバッチとして割り当てられる必要があります。1 つの Pod のスケジューリング要件が満たされない場合、Pod グループ全体のリソーススケジューリングは失敗します。スケジューラによって提供されるこの all-or-nothing スケジューリングセマンティクスは、複数のジョブ間のリソース競合によって引き起こされるリソースのデッドロックを回避するのに役立ちます。

ACS の組み込みスケジューラは、ジョブがスムーズに実行できるように、all-or-nothing スケジューリングを実装するギャングスケジューリング機能を提供します。

重要

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

使用方法

ACS によって提供されるギャングスケジューリング機能は、Kubernetes の PodGroup カスタムリソースと互換性があります。対応するバージョンは podgroups.scheduling.sigs.k8s.io/v1alpha1 です。ジョブを送信する前に、ジョブが属する名前空間に PodGroup を作成し、PodGroup の最小 Pod 数 (minMember) を指定する必要があります。ジョブの Pod を作成するときは、ラベル を構成して Pod を PodGroup に関連付けます。例: Pod-group.scheduling.sigs.k8s.io。スケジューリング中、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 アクセラレーションに設定します。
            alibabacloud.com/gpu-model-series: "example-model" # GPU アクセラレーションコンピューティングクラスの GPU モデルを指定します。
            pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Pod を 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
重要

関連付けられた 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. gang-job.yaml という名前のファイルを作成し、次の内容をファイルに追加します。このファイルは、PodGroup に関連付けられた 4 つの Pod レプリカを持つジョブを定義します。

    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 アクセラレーションに設定します。
            alibabacloud.com/gpu-model-series: "example-model" # GPU アクセラレーションコンピューティングクラスの GPU モデルを指定します。
            pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Pod を 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 しか作成できません。Pod の数は、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 がスケジューリングされていることを示しています。