Tous les produits
Search
Centre de documentation

Container Compute Service:Use Gang Scheduling

Dernière mise à jour :Aug 28, 2026

Alibaba Cloud Container Compute Service (ACS) propose la fonctionnalité Gang Scheduling pour les tâches nécessitant une planification de type « tout ou rien ».

Prérequis

  • Installez kube-scheduler dans une version répondant aux exigences suivantes :

    Version du cluster ACS Version minimale du planificateur
    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
  • Le Gang Scheduling prend uniquement en charge la classe de calcul GPU-HPN. Pour plus d'informations, consultez la section Types de calcul.

  • Désactivez l'option Enable custom labels and schedulers for GPU-HPN nodes. Pour plus d'informations, consultez la section relative à la configuration des composants.

Fonctionnement

Une tâche crée généralement plusieurs pods qui doivent démarrer et s'exécuter de manière coordonnée. Le planificateur doit allouer les ressources à un groupe de pods en tant qu'unité unique. Ainsi, soit tous les pods du groupe obtiennent des ressources, soit la planification de l'intégralité du groupe échoue si un seul pod ne peut pas être placé. Cette approche « tout ou rien » évite les interblocages de ressources qui surviennent lorsque plusieurs tâches entrent en concurrence pour l'accès aux ressources.

Le planificateur intégré d'ACS utilise le Gang Scheduling pour mettre en œuvre cette sémantique « tout ou rien » et assurer le bon déroulement de vos tâches.

Important

Tous les pods d'un groupe Gang Scheduling doivent appartenir à la même compute-class.

Procédure

Le Gang Scheduling d'ACS est compatible avec la ressource personnalisée PodGroup de la communauté Kubernetes, version podgroups.scheduling.sigs.k8s.io/v1alpha1. Avant de soumettre une tâche, créez un objet PodGroup dans le namespace de la tâche. Dans la définition du PodGroup, spécifiez le nombre minimal de pods requis par la tâche en définissant le champ minMember. Lors de la création des pods de la tâche, associez-les au PodGroup en ajoutant l'étiquette pod-group.scheduling.sigs.k8s.io et en définissant sa valeur sur le nom du PodGroup. Le planificateur ACS alloue alors les ressources à tous les pods portant la même étiquette PodGroup en tant qu'unité unique.

  1. Créez la ressource personnalisée 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. Créez une tâche et associez-la au 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
Important

Assurez-vous que la valeur parallelism de la tâche est supérieure ou égale à la valeur minMember du PodGroup. Sinon, la tâche ne sera pas planifiée.

Exemple

Cet exemple illustre un scénario d'échec et un scénario de réussite de la planification lors de l'utilisation du Gang Scheduling.

  1. Exécutez la commande suivante pour créer le namespace test-gang.

    kubectl create ns test-gang
  2. Exécutez la commande suivante pour créer un ResourceQuota dans le namespace test-gang. Cela simule un scénario de ressources insuffisantes afin de démontrer le fonctionnement du Gang Scheduling.

    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: ResourceQuota
    metadata:
      name: object-counts
      namespace: test-gang
    spec:
      hard:
        pods: "2"
    EOF
  3. Exécutez la commande suivante pour créer un objet PodGroup. Le champ minMember est défini sur 3, ce qui signifie qu'au moins trois pods du groupe doivent être planifiés simultanément. Si cette condition n'est pas remplie, les autres pods restent à l'état 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. Créez un fichier nommé gang-job.yaml avec le contenu suivant. Ce fichier définit un objet tâche avec quatre réplicas de pod et l'associe à l'objet 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. Exécutez la commande suivante pour déployer la tâche gang-job sur le cluster.

    kubectl apply -f gang-job.yaml
  6. Exécutez la commande suivante pour vérifier l'état des pods.

    kubectl get pod -n test-gang

    Résultat attendu :

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

    Le ResourceQuota limite le namespace à un maximum de deux pods, ce qui est inférieur à la valeur minMember spécifiée dans le PodGroup. Par conséquent, ces deux pods restent à l'état Pending et ne sont pas planifiés.

  7. Exécutez la commande suivante pour supprimer le ResourceQuota et retirer la limite de pods.

    kubectl delete resourcequota -n test-gang object-counts
  8. Exécutez à nouveau la commande suivante pour vérifier l'état des pods.

    kubectl get pod -n test-gang

    Résultat attendu :

    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

    Le résultat indique que les pods ont été planifiés avec succès.