All Products
Search
Document Center

Container Compute Service:Gunakan gang scheduling

Last Updated:Mar 18, 2026

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.

Penting

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

  1. Buat resource kustom PodGroup. Bidang minMember menetapkan jumlah minimum pod yang harus dijadwalkan secara simultan. Bidang scheduleTimeoutSeconds menentukan 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.
  2. Buat pekerjaan dan kaitkan dengan PodGroup. Simpan konten berikut ke dalam file gang-job.yaml. Label pod-group.scheduling.sigs.k8s.io: demo-job-podgroup pada 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
  3. Deploy pekerjaan ke kluster.

    kubectl apply -f gang-job.yaml
  4. 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
Penting

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.

  1. Jalankan perintah berikut untuk membuat namespace test-gang.

    kubectl create ns test-gang
  2. Jalankan perintah berikut untuk membuat ResourceQuota di namespace test-gang guna 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
  3. Jalankan perintah berikut untuk membuat objek PodGroup. Pada objek tersebut, minMember diatur 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
  4. 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
  5. Jalankan perintah berikut untuk deploy pekerjaan gang-job ke kluster.

    kubectl apply -f gang-job.yaml
  6. Jalankan perintah berikut untuk melihat status pod.

    kubectl get pod -n test-gang

    Output yang diharapkan:

    NAME             READY   STATUS    RESTARTS   AGE
    gang-job-hrnc6   0/1     Pending   0          23s
    gang-job-wthnq   0/1     Pending   0          23s

    ResourceQuota 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.

  7. Jalankan perintah berikut untuk menghapus ResourceQuota dan menghilangkan batasan jumlah pod.

    kubectl delete resourcequota -n test-gang object-counts
  8. Jalankan perintah berikut untuk melihat status pod.

    kubectl get pod -n test-gang

    Output 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          96s

    Output tersebut menunjukkan bahwa pod berhasil dijadwalkan.