Todos os produtos
Search
Central de documentação

Container Compute Service:Use Gang Scheduling

Última atualização: Aug 28, 2026

O Alibaba Cloud Container Compute Service (ACS) oferece o recurso de Gang Scheduling para jobs que exigem agendamento do tipo tudo ou nada.

Pré-requisitos

  • kube-scheduler instalado em uma versão que atenda aos seguintes requisitos:

    Versão do cluster ACS

    Versão mínima do scheduler

    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

  • O Gang Scheduling suporta apenas a classe de computação GPU-HPN. Para mais informações, consulte Compute types.

  • A configuração Enable custom labels and schedulers for GPU-HPN nodes deve estar desativada. Para mais informações, consulte component configuration.

Como funciona

Um job geralmente cria vários pods que precisam iniciar e executar de forma coordenada. Isso exige que o scheduler aloque recursos para um grupo de pods como uma única unidade. Assim, todos os pods do grupo obtêm recursos ou o agendamento de todo o grupo falha caso um único pod não possa ser posicionado. Esse agendamento do tipo tudo ou nada evita deadlocks de recursos causados pela competição entre múltiplos jobs.

O scheduler integrado do ACS utiliza o Gang Scheduling para implementar essa semântica de tudo ou nada e garantir a execução adequada dos seus jobs.

Importante

Todos os pods em um grupo de Gang Scheduling devem pertencer à mesma compute-class.

Procedimento

O Gang Scheduling do ACS é compatível com o recurso personalizado da comunidade Kubernetes PodGroup, versão podgroups.scheduling.sigs.k8s.io/v1alpha1. Antes de enviar um job, crie um objeto PodGroup no namespace do job. Na definição do PodGroup, especifique o número mínimo de pods necessários definindo o campo minMember. Em seguida, ao criar os pods do job, associe-os ao PodGroup adicionando o rótulo pod-group.scheduling.sigs.k8s.io e definindo seu valor como o nome do PodGroup. O scheduler do ACS então aloca recursos para todos os pods com o mesmo rótulo de PodGroup como uma única unidade.

  1. Crie o recurso personalizado PodGroup.

    apiVersion: scheduling.sigs.k8s.io/v1alpha1
    kind: PodGroup
    metadata: 
      name: demo-job-podgroup
      namespace: default
    spec: 
      scheduleTimeoutSeconds: 10 
      minMember: 3 # Specify the minimum number of pods required to run.
  2. Crie um job e associe-o ao PodGroup.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gang-job
      namespace: default
    spec:
      parallelism: 3 # The number of pods must be greater than or equal to minMember in the PodGroup.
      template:
        metadata:
          labels:
            alibabacloud.com/compute-class: "gpu-hpn" # Specify the compute-class as gpu-hpn.
            alibabacloud.com/gpu-model-series: "example-model" # Specify the GPU model for the GPU compute class.
            pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Associate with the demo-job-podgroup 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
Importante

Garanta que o parallelism do job seja maior ou igual ao valor de minMember no PodGroup. Caso contrário, o job não será agendado.

Exemplo

Este exemplo demonstra cenários de falha e de sucesso no agendamento ao usar o Gang Scheduling.

  1. Execute o comando a seguir para criar o namespace test-gang.

    kubectl create ns test-gang
  2. Execute o comando abaixo para criar um ResourceQuota no namespace test-gang. Essa ação simula um cenário com recursos insuficientes para demonstrar o funcionamento do Gang Scheduling.

    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: object-counts
      namespace: test-gang
    spec:
      hard:
        pods: "2"
    EOF
  3. Execute o seguinte comando para criar um objeto PodGroup. O campo minMember está definido como 3, o que significa que pelo menos três pods do grupo devem ser agendados simultaneamente. Se essa condição não for atendida, os demais pods permanecerão no 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 # Specify the minimum number of pods required to run.
    EOF
  4. Crie um arquivo chamado gang-job.yaml com o conteúdo a seguir. Esse arquivo define um objeto de job com quatro réplicas de pod e o associa ao objeto PodGroup.

    apiVersion: batch/v1
    kind: Job
    metadata:
      name: gang-job
      namespace: test-gang
    spec:
      parallelism: 4 # The number of pods must be greater than or equal to minMember in the PodGroup.
      template:
        metadata:
          labels:
            alibabacloud.com/compute-class: "gpu-hpn" # Specify the compute-class as gpu-hpn.
            alibabacloud.com/gpu-model-series: "example-model" # Specify the GPU model for the GPU compute class.
            pod-group.scheduling.sigs.k8s.io: demo-job-podgroup # Associate with the demo-job-podgroup 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. Implante o gang-job no cluster executando o comando a seguir.

    kubectl apply -f gang-job.yaml
  6. Verifique o status dos pods com o comando abaixo.

    kubectl get pod -n test-gang

    Saída esperada:

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

    O ResourceQuota limita o namespace a no máximo dois pods, quantidade inferior ao valor de minMember especificado no PodGroup. Como resultado, esses dois pods permanecem no status Pending e não são agendados.

  7. Remova o limite de pods excluindo o ResourceQuota com o comando a seguir.

    kubectl delete resourcequota -n test-gang object-counts
  8. Consulte novamente o status dos pods executando o comando abaixo.

    kubectl get pod -n test-gang

    Saída esperada:

    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

    A saída mostra que os pods foram agendados com sucesso.