All Products
Search
Document Center

Container Compute Service:Gunakan Gang Scheduling

Last Updated:Aug 29, 2026

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 ACSVersi penjadwal minimum
    1.31v1.31.0-aliyun-1.2.0
    1.30v1.30.3-aliyun-1.1.1
    1.28v1.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.

Penting

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.

  1. 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.
  2. 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
Penting

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.

  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. 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
  3. Jalankan perintah berikut untuk membuat objek PodGroup. Bidang minMember diatur 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
  4. 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
  5. Jalankan perintah berikut untuk men-deploy gang-job ke kluster.

    kubectl apply -f gang-job.yaml
  6. Jalankan perintah berikut untuk memeriksa 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 namespace hingga maksimal dua Pod, yang kurang dari nilai minMember yang ditentukan dalam PodGroup. Akibatnya, kedua Pod ini 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 memeriksa status Pod lagi.

    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 menunjukkan bahwa Pod berhasil dijadwalkan.