Alibaba Cloud Container Compute Service (ACS) menyediakan fitur Gang Scheduling untuk pekerjaan yang memerlukan penjadwalan all-or-nothing.
Prasyarat
kube-scheduler telah terinstal pada versi yang memenuhi persyaratan berikut:
Versi kluster ACS Versi penjadwal minimum 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 -
Gang Scheduling hanya mendukung kelas komputasi GPU-HPN. Untuk informasi selengkapnya, lihat Jenis komputasi.
-
Pengaturan Enable custom labels and schedulers for GPU-HPN nodes harus dinonaktifkan. Untuk informasi selengkapnya, lihat konfigurasi komponen.
Cara kerja
Satu pekerjaan biasanya membuat beberapa Pod yang harus dimulai dan dijalankan secara terkoordinasi. Hal ini mengharuskan penjadwal mengalokasikan sumber daya ke sekelompok Pod sebagai satu kesatuan, sehingga semua Pod dalam kelompok tersebut berhasil mendapatkan sumber daya atau seluruh kelompok gagal dijadwalkan jika satu saja Pod tidak dapat ditempatkan. Pendekatan penjadwalan all-or-nothing ini mencegah deadlock sumber daya yang dapat terjadi ketika beberapa pekerjaan bersaing untuk sumber daya yang sama.
Penjadwal bawaan ACS menggunakan Gang Scheduling untuk menerapkan semantik all-or-nothing ini dan memastikan pekerjaan Anda berjalan lancar.
Semua Pod dalam kelompok Gang Scheduling harus termasuk dalam compute-class yang sama.
Prosedur
Gang Scheduling ACS kompatibel dengan Resource kustom PodGroup dari komunitas Kubernetes, versi podgroups.scheduling.sigs.k8s.io/v1alpha1. Sebelum mengirimkan pekerjaan, Anda harus membuat objek PodGroup di namespace pekerjaan tersebut. Dalam definisi PodGroup, tentukan jumlah minimum Pod yang dibutuhkan oleh pekerjaan melalui pengaturan bidang minMember. Kemudian, saat membuat Pod pekerjaan tersebut, kaitkan Pod dengan PodGroup dengan menambahkan label pod-group.scheduling.sigs.k8s.io dan atur nilainya ke nama PodGroup tersebut. Penjadwal ACS kemudian akan mengalokasikan sumber daya ke semua Pod dengan label PodGroup yang sama sebagai satu kesatuan.
-
Buat Resource kustom PodGroup.
apiVersion: scheduling.sigs.k8s.io/v1alpha1 kind: PodGroup metadata: name: demo-job-podgroup namespace: default spec: scheduleTimeoutSeconds: 10 minMember: 3 # Tentukan jumlah minimum Pod yang diperlukan untuk dijalankan. -
Buat pekerjaan dan kaitkan dengan PodGroup.
apiVersion: batch/v1 kind: Job metadata: name: gang-job namespace: default spec: parallelism: 3 # Jumlah Pod harus lebih besar dari atau sama dengan minMember dalam PodGroup. template: metadata: labels: alibabacloud.com/compute-class: "gpu-hpn" # Tentukan compute-class sebagai gpu-hpn. alibabacloud.com/gpu-model-series: "example-model" # Tentukan model GPU untuk kelas komputasi GPU. pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Kaitkan dengan 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
Pastikan parallelism pekerjaan lebih besar dari atau sama dengan nilai minMember dalam PodGroup. Jika tidak, pekerjaan tidak akan dijadwalkan.
Contoh
Contoh ini menunjukkan skenario penjadwalan yang gagal maupun berhasil saat menggunakan Gang Scheduling.
-
Jalankan perintah berikut untuk membuat namespace
test-gang.kubectl create ns test-gang -
Jalankan perintah berikut untuk membuat ResourceQuota di namespace
test-gang. Ini mensimulasikan skenario dengan sumber daya yang tidak mencukupi untuk menunjukkan cara kerja Gang Scheduling.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. Bidang
minMemberdiatur ke 3, artinya minimal tiga Pod dari kelompok tersebut harus dijadwalkan secara bersamaan. Jika kondisi ini tidak terpenuhi, Pod lainnya akan tetap 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 # Tentukan jumlah minimum Pod yang diperlukan untuk dijalankan. EOF -
Buat file bernama gang-job.yaml dengan konten berikut. File ini mendefinisikan objek pekerjaan dengan empat replika Pod dan mengaitkannya 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 dalam PodGroup. template: metadata: labels: alibabacloud.com/compute-class: "gpu-hpn" # Tentukan compute-class sebagai gpu-hpn. alibabacloud.com/gpu-model-series: "example-model" # Tentukan model GPU untuk kelas komputasi GPU. pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Kaitkan dengan 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 men-deploy gang-job ke kluster.
kubectl apply -f gang-job.yaml -
Jalankan perintah berikut untuk memeriksa 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 namespace hingga maksimal dua Pod, yang kurang dari nilai
minMemberyang ditentukan dalam PodGroup. Akibatnya, kedua Pod ini 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 memeriksa status Pod lagi.
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 menunjukkan bahwa Pod berhasil dijadwalkan.