Ce tutoriel utilise Kueue pour vous montrer comment implémenter un système de mise en file d'attente de tâches, configurer les ressources de charge de travail et le partage de quotas entre différents espaces de noms sur Google Kubernetes Engine (GKE) et optimiser l'utilisation de votre cluster.
Contexte
En tant qu'ingénieur en infrastructure ou administrateur de cluster, il est très important de maximiser l'utilisation entre les espaces de noms. Un lot de tâches dans un espace de noms peut ne pas utiliser pleinement le quota complet attribué à l'espace de noms, tandis qu'un autre espace de noms peut avoir plusieurs tâches en attente. Pour utiliser efficacement les ressources de cluster entre les tâches dans différents espaces de noms et augmenter la flexibilité de gestion des quotas, vous pouvez configurer des cohortes dans Kueue. Une cohorte est un groupe de ressources ClusterQueue qui peuvent emprunter un quota inutilisé les uns des autres. Une ressources ClusterQueue régit un pool de ressources telles que le processeur, la mémoire et les accélérateurs matériels.
Vous trouverez une définition plus détaillée de tous ces concepts dans la documentation de Kueue.
Objectifs
Ce tutoriel s'adresse aux ingénieurs d'infrastructure ou aux administrateurs de cluster souhaitant mettre en œuvre un système de mise en file d'attente de tâches sur Kubernetes à l'aide de Kueue avec le partage de quotas.Ce tutoriel imite deux équipes dans deux espaces de noms différents, où chaque équipe dispose de ses ressources dédiées, mais peut emprunter celles de l'autre. Un troisième ensemble de ressources peut servir de débordement lorsque les tâches s'accumulent.
Utilisez l'opérateur Prometheus pour surveiller les jobs et l'allocation des ressources dans différents espaces de noms.
Ce tutoriel couvre les étapes suivantes :
- Créer un cluster GKE
- Créer les ressources ResourceFlavors
- Pour chaque équipe, créez une ressources ClusterQueue et une ressources LocalQueue
- (Facultatif) Déployer kube-prometheus et surveiller les charges de travail à l'aide de Prometheus
- Créer des jobs et observer les charges de travail acceptées
- Emprunter un quota inutilisé avec des cohortes
- Ajouter une ressources QueueQueue de débordement régissant les VM Spot
Coûts
Ce tutoriel utilise les composants facturables Google Cloud suivants :Utilisez le simulateur de coût pour générer une estimation des coûts en fonction de votre utilisation prévue.
Une fois que vous avez terminé ce tutoriel, évitez de continuer à payer des frais en supprimant les ressources que vous avez créées. Pour en savoir plus, consultez la section Effectuer un nettoyage.
Avant de commencer
Configurer votre projet
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the GKE API.
Définir des valeurs par défaut pour Google Cloud CLI
Dans la console Google Cloud, démarrez une instance Cloud Shell :
Ouvrir Cloud ShellTéléchargez le code source pour cet exemple d'application :
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Définissez les variables d'environnement par défaut :
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGION
Remplacez les valeurs suivantes :
- PROJECT_ID : ID de votre projet Google Cloud.
- COMPUTE_REGION : région Compute Engine.
Créer un cluster GKE
Créez un cluster GKE nommé
kueue-cohort
:Vous allez créer un cluster avec 6 nœuds (2 par zone) dans le pool par défaut, sans autoscaling. Ce sont toutes les ressources disponibles pour les équipes au début. Elles devront donc se mettre d'accord pour les obtenir.
Vous verrez plus tard comment Kueue gère les charges de travail que les deux équipes enverront aux files d'attente respectives.
gcloud container clusters create kueue-cohort --region COMPUTE_REGION \ --release-channel rapid --machine-type e2-standard-4 --num-nodes 2
Une fois le cluster créé, le résultat ressemble à ce qui suit:
kubeconfig entry generated for kueue-cohort. NAME: kueue-cohort LOCATION: us-central1 MASTER_VERSION: 1.26.2-gke.1000 MASTER_IP: 35.224.108.58 MACHINE_TYPE: e2-medium NODE_VERSION: 1.26.2-gke.1000 NUM_NODES: 6 STATUS: RUNNING
Où
STATUS
estRUNNING
pourkueue-cluster
.Créez un pool de nœuds nommé
spot
.Ce pool de nœuds utilise des VM Spot et l'autoscaling est activé. Il commence avec 0 nœud, mais vous le mettrez à la disposition des équipes en tant que capacité de surcharge.
gcloud container node-pools create spot --cluster=kueue-cohort --region COMPUTE_REGION \ --spot --enable-autoscaling --max-nodes 20 --num-nodes 0 \ --machine-type e2-standard-4
Installez la version disponible de Kueue sur le cluster :
VERSION=VERSION kubectl apply -f \ https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/manifests.yaml
Remplacez VERSION par la lettre v qui suit la dernière version de Kueue, par exemple
v0.4.0
. Pour en savoir plus sur les versions de Kueue, consultez la page Versions de Kueue.Attendez que le contrôleur Kueue soit prêt :
watch kubectl -n kueue-system get pods
Avant de continuer, le résultat doit ressembler à ce qui suit :
NAME READY STATUS RESTARTS AGE kueue-controller-manager-6cfcbb5dc5-rsf8k 2/2 Running 0 3m
Créez deux espaces de noms appelés
team-a
etteam-b
:kubectl create namespace team-a kubectl create namespace team-b
Les tâches seront générées sur chaque espace de noms.
Créer les ressources ResourceFlavors
Une ressource ResourceFlavor représente les variations de ressources dans vos nœuds de cluster, telles que différentes VM (par exemple, Spot ou à la demande), les architectures (par exemple, processeurs x86 et ARM), les marques et les modèles (par exemple, Nvidia A100 par rapport aux GPU T4).
Les ressources ResourceFlavors utilisent des libellés et des rejets de nœuds pour correspondre à un ensemble de nœuds du cluster.
Dans le fichier manifeste :
- Le libellé de la ressource ResourceFlavor
on-demand
est défini surcloud.google.com/gke-provisioning: standard
. - Le libellé de la ressource ResourceFlavor
spot
est défini surcloud.google.com/gke-provisioning: spot
.
Lorsqu'une charge de travail est attribuée à une ressource ResourceFlavor, Kueue en attribue les pods aux nœuds correspondant aux libellés de nœud définis pour la ressource ResourceFlavor.
Déployez la ressource ResourceFlavor :
kubectl apply -f flavors.yaml
Créer les ressources ClusterQueue et LocalQueue
Créez deux ressources ClusterQueue cq-team-a
et cq-team-b
, ainsi que les ressources LocalQueues lq-team-a
et lq-team-b
correspondantes, respectivement liées à team-a
et team-b
.
Les ressources QueueQueue sont des objets à l'échelle d'un cluster qui régissent un pool de ressources telles que le processeur, la mémoire et les accélérateurs matériels. Les administrateurs de lot peuvent limiter la visibilité de ces objets aux utilisateurs de lot.
Les ressources LocalQueue sont des objets d'espace de noms que les utilisateurs peuvent répertorier. Elles pointent vers des ressources CluterQueues à partir desquelles les ressources sont allouées pour exécuter les charges de travail LocalQueue.
ClusterQueues permet aux ressources d'avoir plusieurs types. Dans ce cas, les deux ressources ClusterQueue ont deux scénarios, on-demand
et spot
, chacun fournissant des ressources cpu
.
Le quota de la ressource ResourceFlavor spot
est défini sur 0
et ne sera pas utilisé pour le moment.
Les deux ressources ClusterQueue partagent la même cohorte appelée all-teams
, définie dans .spec.cohort
.
Lorsque deux ou plusieurs ressources ClusterQueue partagent la même cohorte, elles peuvent s'emprunter leur quota inutilisé.
Pour en savoir plus sur le fonctionnement des cohortes et la sémantique de l'emprunt, consultez la documentation de Kueue.
Déployez les ressources ClusterQueue et LocalQueues :
kubectl apply -f cq-team-a.yaml
kubectl apply -f cq-team-b.yaml
(Facultatif) Déployer kube-prometheus et surveiller les charges de travail à l'aide de Prometheus
Vous pouvez utiliser Prometheus pour surveiller les charges de travail en attente Kueue et les charges de travail actives. Pour surveiller les charges de travail en cours et observer la charge sur chaque ressource ClusterQueue, configurez Prometheus dans le cluster sous la surveillance des espaces de noms.
Téléchargez le code source de l'opérateur Prometheus pour la surveillance :
cd git clone https://github.com/prometheus-operator/kube-prometheus.git
Créez les ressources CustomResourceDefinition(CRD) :
kubectl create -f kube-prometheus/manifests/setup
Créez les composants de surveillance :
kubectl create -f kube-prometheus/manifests
Autorisez prometheus-operator pour récupérer les métriques des composants Kueue :
kubectl apply -f https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/prometheus.yaml
Accédez au répertoire de travail :
cd kubernetes-engine-samples/batch/kueue-cohort
Démarrez un nouveau terminal pour accéder à Prometheus en transférant le port du service :
kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090
Ouvrez Prometheus sur localhost:9090 dans le navigateur.
Si vous utilisez Cloud Shell, cliquez sur Aperçu sur le Web, sélectionnez le port de modification, définissez le numéro de port sur 9090, puis sélectionnez
Change and Preview
.Saisissez la requête du premier panneau qui surveille la ressource ClusterQueue
cq-team-a
active :kueue_pending_workloads{cluster_queue="cq-team-a", status="active"} or kueue_admitted_active_workloads{cluster_queue="cq-team-a"}
Ajoutez un autre panneau et saisissez la requête qui surveille la ressource ClusterQueue
cq-team-b
active :kueue_pending_workloads{cluster_queue="cq-team-b", status="active"} or kueue_admitted_active_workloads{cluster_queue="cq-team-b"}
Ajoutez un autre panneau et saisissez la requête qui surveille le nombre de nœuds dans le cluster :
count(kube_node_info)
Créer des jobs et observer les charges de travail acceptées
Générez des tâches sur les deux ressources ClusterQueue, qui resteront en veille pendant 10 secondes, avec trois tâches parallèles et seront effectuées avec trois tâches terminées. Cela sera ensuite nettoyé au bout de 60 secondes.
job-team-a.yaml
crée des tâches sous l'espace de noms team-a
et pointe vers la ressource LocalQueue lq-team-a
et la ressource ClusterQueue cq-team-a
.
De même, job-team-b.yaml
crée des tâches sous l'espace de noms team-b
, et pointe vers la ressource LocalQueue lq-team-b
et la ressource ClusterQueue cq-team-b
.
Démarrez un nouveau terminal et exécutez ce script pour générer une tâche toutes les secondes :
./create_jobs.sh job-team-a.yaml 1
Démarrez un autre terminal et créez des tâches pour l'espace de noms
team-b
:./create_jobs.sh job-team-b.yaml 1
Observez les tâches en train d'être mises en file d'attente dans Prometheus. Ou à l'aide de la commande suivante :
watch -n 2 kubectl get clusterqueues -o wide
La sortie devrait ressembler à ce qui suit :
NAME COHORT STRATEGY PENDING WORKLOADS ADMITTED WORKLOADS
cq-team-a all-teams BestEffortFIFO 0 5
cq-team-b all-teams BestEffortFIFO 0 4
Emprunter un quota inutilisé avec des cohortes
Les ressources ClusterQueue ne sont pas toujours saturées. L'utilisation des quotas n'est pas maximisée lorsque les charges de travail ne sont pas réparties uniformément entre les ressources ClusterQueue. Si les ressources ClusterQueue partagent la même cohorte entre elles, elles peuvent emprunter des quotas d'autres ressources ClusterQueue pour maximiser l'utilisation du quota.
Une fois que des tâches sont mises en file d'attente pour les ressources ClusterQueue
cq-team-a
etcq-team-b
, arrêtez le script destiné à l'espace de nomsteam-b
en appuyant surCTRL+c
dans le terminal correspondant.Une fois que toutes les tâches en attente de l'espace de noms
team-b
sont traitées, les tâches de l'espace de nomsteam-a
peuvent emprunter les ressources disponibles danscq-team-b
:kubectl describe clusterqueue cq-team-a
Comme
cq-team-a
etcq-team-b
partagent la même cohorte appeléeall-teams
, ces ressources ClusterQueue peuvent partager des ressources qui ne sont pas utilisées.Flavors Usage: Name: on-demand Resources: Borrowed: 5 Name: cpu Total: 15 Borrowed: 5Gi Name: memory Total: 15Gi
Reprendre le script pour l'espace de noms
team-b
../create_jobs.sh job-team-b.yaml 3
Observez comment les ressources empruntées de
cq-team-a
reviennent à0
, tandis que les ressources decq-team-b
sont utilisées pour leurs propres charges de travail :kubectl describe clusterqueue cq-team-a
Flavors Usage: Name: on-demand Resources: Borrowed: 0 Name: cpu Total: 9 Borrowed: 0 Name: memory Total: 9Gi
Augmenter le quota avec des VM Spot
Lorsque le quota doit être temporairement augmenté, par exemple pour répondre à une demande élevée dans les charges de travail en attente, vous pouvez configurer Kueue pour répondre à la demande en ajoutant d'autres ressources ClusterQueue à la cohorte. Les ressources ClusterQueue avec des ressources inutilisées peuvent partager ces ressources avec d'autres ressources ClusterQueue appartenant à la même cohorte.
Au début du tutoriel, vous avez créé un pool de nœuds nommé spot
à l'aide de VM Spot et une ressource ResourceFlavor nommée spot
avec le libellé défini sur cloud.google.com/gke-provisioning: spot
. Créez une ressource ClusterQueue pour utiliser ce pool de nœuds et la ressource ResourceFlavor qui le représente :
Créez une nouvelle ressource ClusterQueue appelée
cq-spot
avec la cohorte définie surall-teams
:Étant donné que cette ressource ClusterQueue partage la même cohorte avec
cq-team-a
etcq-team-b
, les ressources ClusterQueuecq-team-a
etcq-team-b
peuvent emprunter des ressources jusqu'à 15 requêtes de processeur et 15 Gio de mémoire.kubectl apply -f cq-spot.yaml
Dans Prometheus, observez comment les charges de travail admises augmentent à la fois pour
cq-team-a
etcq-team-b
grâce au quota ajouté parcq-spot
, qui partage la même cohorte. Ou à l'aide de la commande suivante :watch -n 2 kubectl get clusterqueues -o wide
Dans Prometheus, observez le nombre de nœuds du cluster. Ou à l'aide de la commande suivante :
watch -n 2 kubectl get nodes -o wide
Arrêtez les deux scripts en appuyant sur
CTRL+c
pour les espaces de nomsteam-a
etteam-b
.
Effectuer un nettoyage
Pour éviter que les ressources utilisées lors de ce tutoriel soient facturées sur votre compte Google Cloud, supprimez le projet contenant les ressources, ou conservez le projet et supprimez les ressources individuelles.
Supprimer le projet
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Supprimer la ressource individuelle
Supprimez le système de quota Kueue :
kubectl delete -n team-a localqueue lq-team-a kubectl delete -n team-b localqueue lq-team-b kubectl delete clusterqueue cq-team-a kubectl delete clusterqueue cq-team-b kubectl delete clusterqueue cq-spot kubectl delete resourceflavor default kubectl delete resourceflavor on-demand kubectl delete resourceflavor spot
Supprimez le fichier manifeste Kueue :
VERSION=VERSION kubectl delete -f \ https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/manifests.yaml
Supprimez le cluster à l'aide de la commande suivante :
gcloud container clusters delete kueue-cohort --region=COMPUTE_REGION
Étapes suivantes
Découvrez comment déployer un système par lots à l'aide de Kueue.
Apprenez-en plus sur les tâches sur GKE.