Alibaba Cloud Container Compute Service (ACS) menyediakan fitur penjadwalan gang untuk memenuhi persyaratan all-or-nothing dalam skenario penjadwalan pekerjaan. Topik ini menjelaskan cara menggunakan penjadwalan gang.
Prasyarat
kube-scheduler telah terinstal dan versinya memenuhi persyaratan berikut.
Versi Kluster ACS
Versi komponen penjadwal
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
Penjadwalan gang hanya mendukung tipe komputasi jaringan GPU berkinerja-tinggi (gpu-hpn). Untuk informasi lebih lanjut, lihat Definisi tipe komputasi.
Pengaturan Enable Custom Labels And Schedulers For GPU-HPN Nodes dinonaktifkan. Untuk informasi lebih lanjut, lihat Konfigurasi komponen.
Pengenalan fitur
Ketika sebuah pekerjaan membuat beberapa Pod, Pod tersebut harus mulai dan berjalan secara terkoordinasi. Sumber daya harus dialokasikan ke grup Pod sebagai satu batch untuk memastikan bahwa semua Pod dapat meminta sumber daya pada saat yang sama. Jika persyaratan penjadwalan dari satu Pod tidak terpenuhi, penjadwalan untuk seluruh grup Pod gagal. Penjadwal menyediakan semantik penjadwalan all-or-nothing ini untuk membantu mencegah deadlock sumber daya yang disebabkan oleh persaingan sumber daya di antara beberapa pekerjaan.
Penjadwal bawaan ACS menyediakan fitur penjadwalan gang untuk mengimplementasikan penjadwalan all-or-nothing, yang memastikan bahwa pekerjaan dapat berjalan dengan sukses.
Grup Pod yang dikonfigurasikan dengan fitur penjadwalan gang harus termasuk dalam kelas komputasi yang sama.
Penggunaan
Fitur penjadwalan gang yang disediakan oleh ACS kompatibel dengan PodGroup resource kustom di Kubernetes. Versi yang sesuai adalah podgroups.scheduling.sigs.k8s.io/v1alpha1. Sebelum Anda mengirimkan pekerjaan, Anda harus membuat instans PodGroup di namespace pekerjaan dan menentukan jumlah minimum Pod (`minMember`) yang diperlukan agar pekerjaan dapat berjalan. Kemudian, ketika Anda membuat Pod pekerjaan, Anda harus mengaitkannya dengan instans PodGroup menggunakan Pod-group.scheduling.sigs.k8s.io label. Selama penjadwalan, ACS mengalokasikan sumber daya ke semua Pod yang berbagi label PodGroup yang sama.
Buat resource kustom PodGroup.
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.
apiVersion: batch/v1 kind: Job metadata: name: gang-job namespace: default spec: parallelism: 3 # Jumlah pod harus lebih besar atau sama dengan minMember di objek PodGroup. template: metadata: labels: alibabacloud.com/compute-class: "gpu" # Tentukan kelas komputasi sebagai gpu atau gpu-hpn. alibabacloud.com/gpu-model-series: "example-model" # Kelas komputasi GPU memerlukan Anda untuk menentukan model GPU. pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Kaitkan dengan instans 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 jumlah Pod yang dikaitkan lebih besar atau sama dengan nilai `minMember` yang dikonfigurasikan untuk instans PodGroup. Jika tidak, Pod tidak dapat dijadwalkan.
Contoh
Contoh ini menunjukkan hasil penjadwalan yang berhasil dan gagal ketika Anda menggunakan penjadwalan gang untuk pekerjaan.
Jalankan perintah berikut untuk membuat namespace
test-gang.kubectl create ns test-gangJalankan perintah berikut untuk membuat ResourceQuota di namespace
test-ganguntuk menunjukkan bagaimana penjadwalan gang berperilaku 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" EOFJalankan perintah berikut untuk membuat objek PodGroup. Di dalam objek,
minMemberdiatur ke 3, yang menentukan bahwa setidaknya 3 Pod terkait harus dijadwalkan dengan sukses pada saat yang sama. Jika salah satu Pod gagal dibuat atau dijadwalkan, semua Pod dalam grup 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 # Tetapkan jumlah minimum pod yang berjalan. EOFGunakan 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 atau sama dengan minMember di objek PodGroup. template: metadata: labels: alibabacloud.com/compute-class: "gpu" # Tentukan kelas komputasi sebagai gpu atau gpu-hpn. alibabacloud.com/gpu-model-series: "example-model" # Kelas komputasi GPU memerlukan Anda untuk menentukan model GPU. pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Kaitkan dengan instans 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: 4Jalankan perintah berikut untuk menerapkan pekerjaan gang-job ke kluster.
kubectl apply -f gang-job.yamlJalankan 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 ini 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 pada jumlah Pod.
kubectl delete resourcequota -n test-gang object-countsJalankan perintah berikut untuk melihat status Pod.
kubectl get pod -n test-gangOutput yang diharapkan:
NAME READY STATUS RESTARTS AGE gang-job-24cz9 1/1 Berjalan 0 96s gang-job-mmkxl 1/1 Berjalan 0 96s gang-job-msr8v 1/1 Berjalan 0 96s gang-job-qnclz 1/1 Berjalan 0 96sOutput menunjukkan bahwa Pod berhasil dijadwalkan.