Gang scheduling menyediakan penjadwalan all-or-nothing untuk pekerjaan multi-pod di Alibaba Cloud Container Compute Service (ACS). Penjadwal menahan semua pod hingga jumlah minimum yang diperlukan dapat ditempatkan secara bersamaan, sehingga mencegah deadlock sumber daya pada beban kerja terdistribusi seperti pelatihan AI, tugas MPI, dan pipeline inferensi multi-peran.
Cara kerja gang scheduling
Ketika suatu pekerjaan membuat beberapa pod, seluruh pod tersebut harus dimulai secara bersamaan. Gang scheduling memastikan alokasi sumber daya dilakukan untuk seluruh grup sekaligus—jika jumlah minimum pod tidak dapat dijadwalkan secara simultan, maka tidak ada pod yang dijadwalkan. Pendekatan ini mencegah deadlock sumber daya yang disebabkan oleh pekerjaan yang hanya sebagian mendapatkan sumber daya dan saling menghalangi.
Gang scheduling di ACS diimplementasikan menggunakan resource kustom PodGroup (podgroups.scheduling.sigs.k8s.io/v1alpha1). Anda membuat PodGroup untuk menentukan batasan grup, lalu mengaitkan pod pekerjaan dengannya melalui label.
Semua pod yang dikonfigurasi untuk gang scheduling harus termasuk dalam compute class yang sama.
Prasyarat
kube-scheduler telah terinstal dan versinya memenuhi persyaratan berikut.
Versi kluster ACS
Versi komponen scheduler
1.31
v1.31.0-aliyun-1.2.0 dan yang lebih baru
1.30
v1.30.3-aliyun-1.1.1 dan yang lebih baru
1.28
v1.28.9-aliyun-1.1.0 dan yang lebih baru
-
Gang scheduling hanya mendukung tipe komputasi GPU jaringan berkinerja tinggi (gpu-hpn). Untuk informasi selengkapnya, lihat Definisi tipe komputasi.
-
Pengaturan Enable Custom Labels And Schedulers For GPU-HPN Nodes dinonaktifkan. Untuk informasi selengkapnya, lihat Konfigurasi komponen.
Konfigurasi gang scheduling
-
Buat resource kustom PodGroup. Bidang
minMembermenetapkan jumlah minimum pod yang harus dijadwalkan secara simultan. BidangscheduleTimeoutSecondsmenentukan durasi maksimum penjadwal menunggu sebelum menandai upaya tersebut sebagai gagal.apiVersion: scheduling.sigs.k8s.io/v1alpha1 kind: PodGroup metadata: name: demo-job-podgroup namespace: default spec: scheduleTimeoutSeconds: 10 minMember: 3 # Tetapkan jumlah minimum pod yang berjalan. -
Buat pekerjaan dan kaitkan dengan PodGroup. Simpan konten berikut ke dalam file
gang-job.yaml. Labelpod-group.scheduling.sigs.k8s.io: demo-job-podgrouppada templat pod mengaitkan setiap pod dengan instance PodGroup yang ditentukan.apiVersion: batch/v1 kind: Job metadata: name: gang-job namespace: default spec: parallelism: 3 # Jumlah pod harus lebih besar dari atau sama dengan minMember pada objek PodGroup. template: metadata: labels: alibabacloud.com/compute-class: "gpu-hpn" # Tentukan compute class sebagai gpu-hpn. alibabacloud.com/gpu-model-series: "example-model" # Model GPU harus ditentukan untuk compute class GPU. pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Kaitkan dengan instance 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 -
Deploy pekerjaan ke kluster.
kubectl apply -f gang-job.yaml -
Verifikasi bahwa pod telah dijadwalkan. Jika penjadwalan berhasil, semua pod akan beralih dari status Pending ke Running secara bersamaan.
kubectl get podgroup -n default kubectl get pods -n default -l pod-group.scheduling.sigs.k8s.io=demo-job-podgroup
Pastikan jumlah pod yang dikaitkan lebih besar dari atau sama dengan nilai `minMember` yang dikonfigurasi untuk instance PodGroup. Jika tidak, pod tidak dapat dijadwalkan.
Contoh
Contoh ini menunjukkan hasil penjadwalan yang berhasil maupun gagal saat menggunakan gang scheduling untuk suatu pekerjaan.
-
Jalankan perintah berikut untuk membuat namespace
test-gang.kubectl create ns test-gang -
Jalankan perintah berikut untuk membuat ResourceQuota di namespace
test-gangguna menunjukkan perilaku gang scheduling ketika sumber daya tidak mencukupi.cat << EOF | kubectl apply -f - apiVersion: v1 kind: ResourceQuota metadata: name: object-counts namespace: test-gang spec: hard: pods: "2" EOF -
Jalankan perintah berikut untuk membuat objek PodGroup. Pada objek tersebut,
minMemberdiatur ke 3, yang berarti minimal tiga pod terkait harus berhasil dijadwalkan secara bersamaan. Jika salah satu pod gagal dibuat atau dijadwalkan, semua pod dalam grup tetap berada dalam status 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 # Tetapkan jumlah minimum pod yang berjalan. EOF -
Gunakan konten YAML berikut untuk membuat file gang-job.yaml. File ini mendefinisikan objek Job yang menentukan empat replika pod dan dikaitkan dengan objek PodGroup.
apiVersion: batch/v1 kind: Job metadata: name: gang-job namespace: test-gang spec: parallelism: 4 # Jumlah pod harus lebih besar dari atau sama dengan minMember pada objek PodGroup. template: metadata: labels: alibabacloud.com/compute-class: "gpu-hpn" # Tentukan compute class sebagai gpu-hpn. alibabacloud.com/gpu-model-series: "example-model" # Model GPU harus ditentukan untuk compute class GPU. pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Kaitkan dengan instance 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 -
Jalankan perintah berikut untuk deploy pekerjaan gang-job ke kluster.
kubectl apply -f gang-job.yaml -
Jalankan perintah berikut untuk melihat status pod.
kubectl get pod -n test-gangOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE gang-job-hrnc6 0/1 Pending 0 23s gang-job-wthnq 0/1 Pending 0 23sResourceQuota membatasi jumlah pod yang berjalan menjadi dua, sehingga hanya dua pod yang dibuat untuk pekerjaan ini. Jumlah tersebut kurang dari nilai `minMember` yang ditentukan dalam PodGroup. Oleh karena itu, kedua pod tetap dalam status Pending dan tidak dijadwalkan.
-
Jalankan perintah berikut untuk menghapus ResourceQuota dan menghilangkan batasan jumlah pod.
kubectl delete resourcequota -n test-gang object-counts -
Jalankan perintah berikut untuk melihat status pod.
kubectl get pod -n test-gangOutput yang diharapkan:
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 96sOutput tersebut menunjukkan bahwa pod berhasil dijadwalkan.