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. Il est possible qu'un lot de tâches dans un espace de noms n'utilise pas entièrement le quota attribué à l'espace de noms, tandis qu'un autre espace de noms peut comporter 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 être utilisé comme débordement lorsque les tâches s'accumulent.
Utilisez l'opérateur Prometheus pour surveiller les jobs et l'allocation de ressources dans différents espaces de noms.
Ce tutoriel couvre les étapes nécessaires suivantes :
- Créer un cluster GKE
- Créer les ressources ResourceFlavors
- Pour chaque équipe, créez une ressources ClusterQueue et une ressources LocalQueue
- Créer des jobs et observer les charges de travail acceptées
- Emprunter un quota inutilisé avec des cohortes
- Ajouter une ClusterQueue de débordement régissant les VM Spot
Coûts
Ce tutoriel utilise les composants facturables suivants de Google Cloud :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.
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é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" suivie de 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 jobs seront générés dans chaque espace de noms.
Définir des valeurs par défaut pour Google Cloud CLI
Créer un cluster GKE
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 Batch peuvent limiter la visibilité de ces objets aux utilisateurs Batch.
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 ClusterQueues ont deux saveurs, on-demand
et spot
, chacune fournissant cpu
ressources.
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) Surveiller les charges de travail à l'aide de kube-prometheus
Vous pouvez utiliser Prometheus pour surveiller vos charges de travail Kueue actives et en attente.
Pour surveiller les charges de travail en cours et observer la charge sur chaque ClusterQueue, déployez kube-prometheus dans le cluster sous l'espace de noms monitoring
:
Téléchargez le code source de l'opérateur Prometheus :
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
à 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
Configurez la redirection de port vers le service Prometheus s'exécutant dans votre cluster GKE :
kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090
Ouvrez l'interface utilisateur Web de Prometheus sur localhost:9090 dans le navigateur.
Dans Cloud Shell :
Cliquez sur Aperçu sur le Web.
Cliquez sur Modifier le port et définissez le numéro de port sur
9090
.Cliquez sur Change and Preview (Modifier et prévisualiser).
L'interface utilisateur Web de Prometheus suivante s'affiche.
Dans la zone de requête Expression, saisissez la requête suivante pour créer le premier panneau qui surveille les charges de travail actives pour la ressource ClusterQueue
cq-team-a
:kueue_pending_workloads{cluster_queue="cq-team-a", status="active"} or kueue_admitted_active_workloads{cluster_queue="cq-team-a"}
Cliquez sur Ajouter un panneau.
Dans la zone de requête Expression, saisissez la requête suivante pour créer un autre panneau qui surveille les charges de travail actives pour la ressource ClusterQueue
cq-team-b
:kueue_pending_workloads{cluster_queue="cq-team-b", status="active"} or kueue_admitted_active_workloads{cluster_queue="cq-team-b"}
Cliquez sur Ajouter un panneau.
Dans la zone de requête Expression, saisissez la requête suivante pour créer un panneau qui surveille le nombre de nœuds dans le cluster :
count(kube_node_info)
(Facultatif) Surveiller les charges de travail à l'aide de Google Cloud Managed Service pour Prometheus
Vous pouvez utiliser Google Cloud Managed Service pour Prometheus afin de surveiller vos charges de travail Kueue actives et en attente. Vous trouverez la liste complète des métriques dans la documentation de Kueue.
Configurez l'identité et le RBAC pour accéder aux métriques :
La configuration suivante crée quatre ressources Kubernetes qui fournissent un accès aux métriques pour les collecteurs Google Cloud Managed Service pour Prometheus.
Un compte de service nommé
kueue-metrics-reader
dans l'espace de nomskueue-system
sera utilisé pour l'authentification lors de l'accès aux métriques Kueue.Un secret associé au compte de service
kueue-metrics-reader
stocke un jeton d'authentification utilisé par le collecteur pour s'authentifier auprès du point de terminaison des métriques exposé par le déploiement Kueue.Un rôle nommé
kueue-secret-reader
dans l'espace de nomskueue-system
, qui permet de lire le secret contenant le jeton du compte de service.Un objet ClusterRoleBinding qui accorde au compte de service
kueue-metrics-reader
le ClusterRolekueue-metrics-reader
.
apiVersion: v1 kind: ServiceAccount metadata: name: kueue-metrics-reader namespace: kueue-system --- apiVersion: v1 kind: Secret metadata: name: kueue-metrics-reader-token namespace: kueue-system annotations: kubernetes.io/service-account.name: kueue-metrics-reader type: kubernetes.io/service-account-token --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: kueue-secret-reader namespace: kueue-system rules: - resources: - secrets apiGroups: [""] verbs: ["get", "list", "watch"] resourceNames: ["kueue-metrics-reader-token"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: kueue-metrics-reader subjects: - kind: ServiceAccount name: kueue-metrics-reader namespace: kueue-system roleRef: kind: ClusterRole name: kueue-metrics-reader apiGroup: rbac.authorization.k8s.io
Configurez RoleBinding pour Google Cloud Managed Service pour Prometheus :
Selon que vous utilisez un cluster Autopilot ou Standard, vous devrez créer RoleBinding dans l'espace de noms
gke-gmp-system
ougmp-system
. Cette ressource permet au compte de service du collecteur d'accéder au secretkueue-metrics-reader-token
pour authentifier et extraire les métriques Kueue.Autopilot
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: gmp-system:collector:kueue-secret-reader namespace: kueue-system roleRef: name: kueue-secret-reader kind: Role apiGroup: rbac.authorization.k8s.io subjects: - name: collector namespace: gke-gmp-system kind: ServiceAccount
Standard
apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: gmp-system:collector:kueue-secret-reader namespace: kueue-system roleRef: name: kueue-secret-reader kind: Role apiGroup: rbac.authorization.k8s.io subjects: - name: collector namespace: gmp-system kind: ServiceAccount
Configurez la ressource PodMonitoring :
La ressource suivante configure la surveillance du déploiement Kueue. Elle spécifie que les métriques sont exposées sur le chemin d'accès /metrics via HTTPS. Il utilise le secret
kueue-metrics-reader-token
pour l'authentification lors du scraping des métriques.apiVersion: monitoring.googleapis.com/v1 kind: PodMonitoring metadata: name: kueue namespace: kueue-system spec: selector: matchLabels: control-plane: controller-manager endpoints: - port: https interval: 30s path: /metrics scheme: https tls: insecureSkipVerify: true authorization: type: Bearer credentials: secret: name: kueue-metrics-reader-token key: token
Interroger les métriques exportées
- Interroger les métriques exportées avec Cloud Monitoring
- Interroger les métriques exportées avec Grafana
Exemples de requêtes PromQL pour surveiller les systèmes basés sur Kueue
Ces requêtes PromQL vous permettent de surveiller les métriques Kueue clés telles que le débit des jobs, l'utilisation des ressources par file d'attente et les temps d'attente des charges de travail pour comprendre les performances du système et identifier les goulots d'étranglement potentiels.
Débit des jobs
Cela permet de calculer le taux par seconde des charges de travail admises sur cinq minutes pour chaque cluster_queue. Cette métrique peut vous aider à identifier les goulots d'étranglement en la ventilant par file d'attente. En l'additionnant, vous obtenez le débit global du système.
Requête :
sum(rate(kueue_admitted_workloads_total[5m])) by (cluster_queue)
Utilisation des ressources
Cela suppose que metrics.enableClusterQueueResources
est activé. Il calcule le ratio entre l'utilisation actuelle du processeur et le quota nominal de processeurs pour chaque file d'attente. Une valeur proche de 1 indique une utilisation élevée. Vous pouvez l'adapter à la mémoire ou à d'autres ressources en modifiant le libellé de la ressource.
Pour installer une version disponible de Kueue avec une configuration personnalisée dans votre cluster, suivez la documentation de Kueue.
Requête :
sum(kueue_cluster_queue_resource_usage{resource="cpu"}) by (cluster_queue) / sum(kueue_cluster_queue_nominal_quota{resource="cpu"}) by (cluster_queue)
Temps d'attente dans la file d'attente
Cela fournit le temps d'attente au 90e centile pour les charges de travail dans une file d'attente spécifique. Vous pouvez modifier la valeur du quantile (par exemple, 0,5 pour la médiane ou 0,99 pour le 99e centile) afin de comprendre la distribution du temps d'attente.
Requête :
histogram_quantile(0.9, kueue_admission_wait_time_seconds_bucket{cluster_queue="QUEUE_NAME"})
Créer des jobs et observer les charges de travail acceptées
Dans cette section, vous allez créer des jobs Kubernetes dans les espaces de noms team-a
et team-b
. Dans Kubernetes, un contrôleur Job crée un ou plusieurs pods et s'assure qu'ils exécutent correctement une tâche spécifique.
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
Reprenez 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 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
En savoir plus sur le déploiement d'un système de traitement par lots à l'aide de Kueue
Apprenez-en plus sur les tâches sur GKE.