Questo tutorial mostra come ottimizzare le risorse disponibili pianificando i job su Google Kubernetes Engine (GKE) con Kueue. In questo tutorial imparerai a utilizzare Kueue per gestire e pianificare in modo efficace i job batch, migliorare l'utilizzo delle risorse e semplificare la gestione dei workload. Configurerai un cluster condiviso per due team di tenant in cui ogni team ha il proprio spazio dei nomi e ogni team crea job che condividono risorse globali. Configurerai anche Kueue per pianificare i job in base alle quote delle risorse che hai definito.
Questo tutorial è rivolto agli architetti cloud e agli ingegneri di piattaforma interessati a implementare un sistema batch utilizzando GKE. Per scoprire di più sui ruoli comuni e sulle attività di esempio a cui si fa riferimento nei Google Cloud contenuti, consulta Ruoli e attività comuni degli utenti di GKE.
Prima di leggere questa pagina, assicurati di conoscere i seguenti argomenti:
Sfondo
I job sono applicazioni che vengono eseguite fino al completamento, come machine learning, rendering, simulazione, analisi, CI/CD e workload simili.
Kueue è un programma di pianificazione dei job cloud-native che funziona con il programma di pianificazione Kubernetes predefinito, il controller Job e la scalabilità automatica dei cluster per fornire un sistema batch end-to-end. Kueue implementa l'accodamento dei job, decidendo quando i job devono attendere e quando devono iniziare, in base alle quote e a una gerarchia per la condivisione equa delle risorse tra i team.
Kueue ha le seguenti caratteristiche:
- È ottimizzato per le architetture cloud, in cui le risorse sono eterogenee, intercambiabili e scalabili.
- Fornisce un insieme di API per gestire le quote elastiche e l'accodamento dei job.
- Non implementa nuovamente le funzionalità esistenti, come la scalabilità automatica, la pianificazione dei pod o la gestione del ciclo di vita dei job.
- Kueue supporta in modo integrato l'API Kubernetes
batch/v1.Job. - Può integrarsi con altre API di job.
Per evitare confusione con l'API Job di Kubernetes specifica, Kueue si riferisce ai job definiti con qualsiasi API come workload.
Obiettivi
- Crea un cluster GKE
- Crea il ResourceFlavor
- Crea la ClusterQueue
- Crea la LocalQueue
- Crea job e osserva i workload ammessi
Costi
Questo tutorial utilizza i seguenti componenti fatturabili di Google Cloud:Utilizza il Calcolatore prezzi per generare una stima dei costi in base all'utilizzo previsto.
Al termine di questo tutorial, evita l'addebito di ulteriori costi eliminando le risorse create. Per ulteriori informazioni, consulta Liberare spazio.
Prima di iniziare
Configura il progetto
- Accedi al tuo Google Cloud account. Se non conosci Google Cloud, crea un account per valutare le prestazioni dei nostri prodotti in scenari reali. I nuovi clienti ricevono anche 300 $di crediti senza costi per l'esecuzione, il test e il deployment dei workload.
-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
Enable the GKE API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.-
In the Google Cloud console, on the project selector page, click Create project to begin creating a new Google Cloud project.
Roles required to create a project
To create a project, you need the Project Creator role (
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles. -
Verify that billing is enabled for your Google Cloud project.
Enable the GKE API.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles.
Imposta i valori predefiniti per Google Cloud CLI
Nella Google Cloud console, avvia un'istanza di Cloud Shell:
Apri Cloud ShellScarica il codice sorgente per questa app di esempio:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd kubernetes-engine-samples/batch/kueue-introImposta le variabili di ambiente predefinite:
gcloud config set project PROJECT_ID gcloud config set compute/region CONTROL_PLANE_LOCATIONSostituisci i seguenti valori:
- PROJECT_ID: l'ID progetto Google Cloud .
- CONTROL_PLANE_LOCATION: la regione Compute Engine del piano di controllo del cluster.
Crea un cluster GKE
Crea un cluster GKE Autopilot denominato
kueue-autopilot:gcloud container clusters create-auto kueue-autopilot \ --release-channel "rapid" --location CONTROL_PLANE_LOCATIONI cluster Autopilot sono completamente gestiti e hanno la scalabilità automatica integrata. Scopri di più su GKE Autopilot.
Kueue supporta anche GKE Standard con il provisioning automatico dei nodi e i pool di nodi con scalabilità automatica regolare.
Una volta creato il cluster, il risultato è simile al seguente:
NAME: kueue-autopilot LOCATION: us-central1 MASTER_VERSION: 1.26.2-gke.1000 MASTER_IP: 35.193.173.228 MACHINE_TYPE: e2-medium NODE_VERSION: 1.26.2-gke.1000 NUM_NODES: 3 STATUS: RUNNINGDove
STATUSèRUNNINGperkueue-autopilot.Recupera le credenziali di autenticazione per il cluster:
gcloud container clusters get-credentials kueue-autopilotInstalla Kueue sul cluster:
VERSION=VERSION kubectl apply --server-side -f \ https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/manifests.yamlSostituisci VERSION con l'ultima versione di Kueue. Per ulteriori informazioni sulle versioni di Kueue, consulta Release di Kueue.
Attendi che i pod Kueue siano pronti:
watch kubectl -n kueue-system get podsPrima di poter continuare, l'output dovrebbe essere simile al seguente:
NAME READY STATUS RESTARTS AGE kueue-controller-manager-66d8bb946b-wr2l2 2/2 Running 0 3m36sCrea due nuovi spazi dei nomi denominati
team-aeteam-b:kubectl create namespace team-a kubectl create namespace team-b
Crea ResourceFlavor
Un ResourceFlavor è un oggetto che rappresenta le variazioni nei nodi disponibili nel cluster associandoli a etichette e taint dei nodi. Ad esempio, puoi utilizzare ResourceFlavor per rappresentare le VM con garanzie di provisioning diverse (ad esempio, spot rispetto a on demand), architetture (ad esempio, CPU x86 rispetto a ARM), brand e modelli (ad esempio, GPU Nvidia A100 rispetto a T4).
In questo tutorial, il cluster kueue-autopilot ha risorse omogenee.
Di conseguenza, crea un singolo ResourceFlavor per CPU, memoria, storage temporaneo e GPU, senza etichette o taint.
kubectl apply -f flavors.yaml
Crea ClusterQueue
Un ClusterQueue è un oggetto con ambito cluster che gestisce un pool di risorse come CPU, memoria, GPU. Gestisce i ResourceFlavor, limita l'utilizzo e determina l'ordine in cui vengono ammessi i workload.
Esegui il deployment di ClusterQueue:
kubectl apply -f cluster-queue.yaml
L'ordine di consumo è determinato da .spec.queueingStrategy, dove sono presenti due configurazioni:
BestEffortFIFO
- La configurazione della strategia di accodamento predefinita.
- L'ammissione del workload segue la regola FIFO (first in first out), ma se non è disponibile una quota sufficiente per ammettere il workload all'inizio della coda, viene provato il successivo in coda.
StrictFIFO
- Garantisce la semantica FIFO.
- Il workload all'inizio della coda può bloccare l'accodamento finché non può essere ammesso.
In cluster-queue.yaml, crei una nuova ClusterQueue denominata cluster-queue. Questa ClusterQueue gestisce quattro risorse, cpu, memory, nvidia.com/gpu e ephemeral-storage con il flavor creato in flavors.yaml.
La quota viene consumata dalle richieste nelle specifiche dei pod del workload.
Ogni flavor include limiti di utilizzo rappresentati come .spec.resourceGroups[].flavors[].resources[].nominalQuota. In questo caso, ClusterQueue ammette i workload se e solo se:
- La somma delle richieste di CPU è inferiore o uguale a 10
- La somma delle richieste di memoria è inferiore o uguale a 10 GiB
- La somma delle richieste di GPU è inferiore o uguale a 10
- La somma dello spazio di archiviazione utilizzato è inferiore o uguale a 10 GiB
Crea LocalQueue
Un LocalQueue è un oggetto con spazio dei nomi che accetta i workload degli utenti nello spazio dei nomi.
I LocalQueue di spazi dei nomi diversi possono puntare allo stesso ClusterQueue in cui possono condividere la quota delle risorse. In questo caso, LocalQueue dagli spazi dei nomi team-a e team-b punta allo stesso ClusterQueue cluster-queue in .spec.clusterQueue.
Ogni team invia i propri workload a LocalQueue nel proprio spazio dei nomi. A cui vengono poi allocate le risorse da ClusterQueue.
Esegui il deployment di LocalQueue:
kubectl apply -f local-queue.yaml
Crea job e osserva i workload ammessi
In questa sezione, creerai job Kubernetes nello spazio dei nomi team-a. Un controller Job in Kubernetes crea uno o più pod e contribuisce a garantire che eseguano correttamente un'attività specifica.
Il job nello spazio dei nomi team-a ha i seguenti attributi:
- Punta a LocalQueue
lq-team-a. - Richiede risorse GPU impostando il campo
nodeSelectorsunvidia-tesla-t4. - È composto da tre pod che rimangono inattivi per 10 secondi in parallelo. I job vengono puliti dopo 60 secondi in base al valore definito nel campo
ttlSecondsAfterFinished. - Richiede 1500 milliCPU, 1536 Mi di memoria, 1536 Mi di storage temporaneo e tre GPU, poiché sono presenti tre pod.
I job vengono creati anche nel file
job-team-b.yaml
il cui spazio dei nomi appartiene a team-b, con richieste che
rappresentano team diversi con esigenze diverse.
Per scoprire di più, consulta la sezione Eseguire il deployment dei workload GPU in Autopilot.
In un nuovo terminale, osserva lo stato di ClusterQueue che si aggiorna ogni due secondi:
watch -n 2 kubectl get clusterqueue cluster-queue -o wideIn un nuovo terminale, osserva lo stato dei nodi:
watch -n 2 kubectl get nodes -o wideIn un nuovo terminale, crea job per LocalQueue dagli spazi dei nomi
team-aeteam-bogni 10 secondi:./create_jobs.sh job-team-a.yaml job-team-b.yaml 10Osserva i job accodati, ammessi in ClusterQueue e i nodi attivati con GKE Autopilot.
Ottieni un job dallo spazio dei nomi
team-a:kubectl -n team-a get jobsIl risultato è simile al seguente:
NAME COMPLETIONS DURATION AGE sample-job-team-b-t6jnr 3/3 21s 3m27s sample-job-team-a-tm7kc 0/3 2m27s sample-job-team-a-vjtnw 3/3 30s 3m50s sample-job-team-b-vn6rp 0/3 40s sample-job-team-a-z86h2 0/3 2m15s sample-job-team-b-zfwj8 0/3 28s sample-job-team-a-zjkbj 0/3 4s sample-job-team-a-zzvjg 3/3 83s 4m50sCopia il nome di un job dal passaggio precedente e osserva lo stato di ammissione e gli eventi di un job tramite l'API Workloads:
kubectl -n team-a describe workload JOB_NAMEQuando i job in attesa iniziano ad aumentare da ClusterQueue, termina lo script premendo
CTRL + Csullo script in esecuzione.Una volta completati tutti i job, nota che i nodi vengono sottoposti a scale down.
Libera spazio
Per evitare che al tuo Account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.
Elimina il progetto
- Nella Google Cloud console, vai alla pagina Gestisci risorse.
- Nell'elenco dei progetti, seleziona il progetto che vuoi eliminare, quindi fai clic su Elimina.
- Nella finestra di dialogo, digita l'ID progetto, quindi fai clic su Chiudi per eliminare il progetto.
Elimina la singola risorsa
Elimina il sistema di quote Kueue:
kubectl delete -n team-a localqueue lq-team-a kubectl delete -n team-b localqueue lq-team-b kubectl delete clusterqueue cluster-queue kubectl delete resourceflavor default-flavorElimina il manifest Kueue:
VERSION=VERSION kubectl delete -f \ https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/manifests.yamlElimina il cluster:
gcloud container clusters delete kueue-autopilot --location=CONTROL_PLANE_LOCATION
Passaggi successivi
Consulta la documentazione di GKE.
Scopri di più sui job.
Scopri come configurare Kueue per la condivisione delle quote tra gli spazi dei nomi