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.
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.
-
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. -
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
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.
-
Exécutez la commande suivante pour créer le namespace
test-gang.kubectl create ns test-gang -
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 -
Exécutez la commande suivante pour créer un objet PodGroup. Le champ
minMemberest 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 -
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 -
Exécutez la commande suivante pour déployer la tâche gang-job sur le cluster.
kubectl apply -f gang-job.yaml -
Exécutez la commande suivante pour vérifier l'état des pods.
kubectl get pod -n test-gangRésultat attendu :
NAME READY STATUS RESTARTS AGE gang-job-hrnc6 0/1 Pending 0 23s gang-job-wthnq 0/1 Pending 0 23sLe ResourceQuota limite le namespace à un maximum de deux pods, ce qui est inférieur à la valeur
minMemberspécifiée dans le PodGroup. Par conséquent, ces deux pods restent à l'état Pending et ne sont pas planifiés. -
Exécutez la commande suivante pour supprimer le ResourceQuota et retirer la limite de pods.
kubectl delete resourcequota -n test-gang object-counts -
Exécutez à nouveau la commande suivante pour vérifier l'état des pods.
kubectl get pod -n test-gangRé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 96sLe résultat indique que les pods ont été planifiés avec succès.