全部產品
Search
文件中心

Container Compute Service:使用Gang Scheduling

更新時間:Aug 07, 2025

ACS為作業調度情境提供了Gang Scheduling能力,滿足作業調度情境All-or-Nothing需求。本文介紹如何使用Gang Scheduling。

前提條件

  • 已安裝調度器組件kube-scheduler,且版本滿足以下要求。

    ACS叢集版本

    調度器組件版本

    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僅支援高效能網路GPU型(gpu-hpn)計算類型。具體資訊,請參見計算類型定義

  • 未開啟GPU-HPN節點自訂標籤、調度器配置。具體資訊,請參見組件配置

功能介紹

作業(Job)一般會建立多個Pod,並且這些Pod需要協調一致地啟動運行。這要求在調度時一定要按照一組Pod分配資源,保證這一組Pod都可以申請到資源,或者一旦有一個Pod拿不到資源就認為整組Pod調度失敗。這也就是調度器需要提供的All-or-Nothing調度語義,可以避免多個作業因為資源競爭出現資源維度死結現象。

ACS內建的調度器提供的Gang Scheduling能力實現了All-or-Nothing語義,保證作業順利運行。

重要

Gang Scheduling對應的一組Pod必須屬於相同的compute-class。

使用方式

ACS提供的Gang Scheduling相容Kubernetes社區自訂資源PodGroup,對應版本podgroups.scheduling.sigs.k8s.io/v1alpha1。您在提交每一個作業前,需要先在作業所屬的命名空間下建立一個PodGroup執行個體,並在該PodGroup執行個體中聲明保證作業正常運行需要的最小Pod個數(minMember)。之後在建立作業的Pod時通過設定labels的形式配置Pod-group.scheduling.sigs.k8s.io關聯PodGroup執行個體名。ACS在調度時會統一為使用相同PodGroup標籤的執行個體Pod調度分配資源。

  1. 建立對應的PodGroup自訂資源。

    apiVersion: scheduling.sigs.k8s.io/v1alpha1
    kind: PodGroup
    metadata: 
      name: demo-job-podgroup
      namespace: default
    spec: 
      scheduleTimeoutSeconds: 10 
      minMember: 3 # 設定最小運行個數
  2. 建立一個作業,並關聯PodGroup。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gang-job
      namespace: default
    spec:
      parallelism: 3 # Pod數量必須大於或者等於 pod group對象中的minMember
      template:
        metadata:
          labels:
            alibabacloud.com/compute-class: "gpu" # 指定compute class為gpu 或者 gpu-hpn
            alibabacloud.com/gpu-model-series: "example-model" # gpu計算類需要指定GPU型號
            pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # 關聯 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
重要

請您確保關聯的Pod數量一定大於或等於PodGroup執行個體配置的minMember,否則無法成功調度。

操作樣本

本樣本依次示範作業在使用Gang Scheduling時調度失敗和調度成功的效果。

  1. 執行以下命令建立test-gangNamespace。

    kubectl create ns test-gang
  2. 執行以下命令,在test-gang命名空間下建立ResourceQuota,示範資源不足情況下的Gang Scheduling效果。

    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: object-counts
      namespace: test-gang
    spec:
      hard:
        pods: "2"
    EOF
  3. 執行以下命令,建立PodGroup對象,其中指定了minMember為3,表示關聯的Pod中至少要有3個Pod同時調度成功,如果其中一個沒有建立或者沒有調度成功,其他Pod也應該處於 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 # 設定最小運行個數
    EOF
  4. 使用以下YAML內容,建立gang-job.yaml檔案。該檔案描述了一個Job對象,其中指定了4個Pod副本,並關聯了PodGroup對象。

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gang-job
      namespace: test-gang
    spec:
      parallelism: 4 # Pod數量必須大於或者等於 pod group對象中的minMember
      template:
        metadata:
          labels:
            alibabacloud.com/compute-class: "gpu" # 指定compute class為gpu 或者 gpu-hpn
            alibabacloud.com/gpu-model-series: "example-model" # gpu計算類需要指定GPU型號
            pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # 關聯 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. 執行以下命令,將gang-job部署到叢集。

    kubectl apply -f gang-job.yaml
  6. 執行以下命令,查看Pod狀態。

    kubectl get pod -n test-gang

    預期輸出:

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

    由於ResourceQuota 限制只能運行 2 個Pod,因此該 Job 只有兩個Pod可以建立。這個數量小於PodGroup中指定的minMember,所以這2個Pod會處於Pending狀態不會被調度。

  7. 執行以下命令,刪除ResourceQuota,解除Pod數量的限制。

    kubectl delete resourcequota -n test-gang object-counts
  8. 執行以下命令,查看Pod狀態。

    kubectl get pod -n test-gang

    預期輸出:

    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

    可以發現Pod調度成功。