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 にリソースを割り当てます。
PodGroup のカスタム構成を構成します。
apiVersion: scheduling.sigs.k8s.io/v1alpha1 kind: PodGroup metadata: name: demo-job-podgroup namespace: default spec: scheduleTimeoutSeconds: 10 minMember: 3 # 最小 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" # コンピューティングクラスを 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 はスケジューリングできません。
例
次の例では、ギャングスケジューリング機能を使用する場合のスケジューリングの成功と失敗のシナリオについて説明します。
次のコマンドを実行して、
test-gang
という名前のネームスペースを作成します。kubectl create ns test-gang
次のコマンドを実行して、
test-gang
ネームスペースに ResourceQuota を作成し、リソースが不足している場合にギャングスケジューリングを使用した場合の影響を示します。cat << EOF | kubectl apply -f - apiVersion: v1 kind: ResourceQuota metadata: name: object-counts namespace: test-gang spec: hard: pods: "2" EOF
次のコマンドを実行して、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
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
次のコマンドを実行して、gang-job ジョブをクラスタにデプロイします。
kubectl apply -f gang-job.yaml
次のコマンドを実行して、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 状態になり、スケジューリングされません。
次のコマンドを実行して、ResourceQuota を削除し、Pod 数の制限を削除します。
kubectl delete resourcequota -n test-gang object-counts
次のコマンドを実行して、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 がスケジューリングされていることを示しています。