Questo tutorial utilizza Kueue per mostrarti come implementare un sistema di coda dei job, configurare la condivisione delle risorse e delle quote dei carichi di lavoro tra diversi spazi dei nomi su Google Kubernetes Engine (GKE) e massimizzare l'utilizzo del cluster.
Sfondo
In qualità di ingegnere dell'infrastruttura o amministratore del cluster, è molto importante massimizzare l'utilizzo tra gli spazi dei nomi. Un batch di job in uno spazio dei nomi potrebbe non utilizzare completamente la quota assegnata allo spazio dei nomi, mentre un altro spazio dei nomi potrebbe avere più job in attesa. Per utilizzare in modo efficiente le risorse del cluster tra i job in spazi dei nomi diversi e per aumentare la flessibilità della gestione delle quote, puoi configurare i coorti in Kueue. Una coorte è un gruppo di ClusterQueue che possono prendere in prestito la quota inutilizzata l'uno dall'altro. Un ClusterQueue gestisce un pool di risorse come CPU, memoria e acceleratori hardware.
Puoi trovare una definizione più dettagliata di tutti questi concetti nella documentazione di Kueue
Obiettivi
Questo tutorial è rivolto a ingegneri dell'infrastruttura o amministratori di cluster che vogliono implementare un sistema di coda dei job su Kubernetes utilizzando Kueue con condivisione della quota.Questo tutorial simulerà due team in due diversi spazi dei nomi, in cui ogni team ha le proprie risorse dedicate, ma può prendere in prestito risorse dall'altro. Un terzo insieme di risorse può essere utilizzato come riserva quando i job si accumulano.
Utilizza l'operatore Prometheus per monitorare i job e l'allocazione delle risorse in spazi dei nomi diversi.
Questo tutorial illustra i seguenti passaggi necessari:
- Creare un cluster GKE
- Crea ResourceFlavors
- Per ogni team, crea ClusterQueue e LocalQueue
- Crea job e osserva i workload ammessi
- Prendere in prestito la quota non utilizzata con le coorti
- Aggiungi un ClusterQueue per lo spillover che gestisce le VM spot
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, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, vedi Pulizia.
Prima di iniziare
Configura il progetto
- 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.
Impostare i valori predefiniti per Google Cloud CLI
Nella console Google Cloud, avvia un'istanza Cloud Shell:
Apri Cloud ShellScarica il codice sorgente di questa app di esempio:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples
Imposta le variabili di ambiente predefinite:
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGION
Sostituisci i seguenti valori:
- PROJECT_ID: il tuo ID progetto Google Cloud.
- COMPUTE_REGION: la regione Compute Engine.
Creare un cluster GKE
Crea un cluster GKE denominato
kueue-cohort
:Creerai un cluster con 6 nodi (2 per zona) nel pool predefinito e senza scalabilità automatica. Queste saranno tutte le risorse disponibili per i team all'inizio, quindi dovranno competere per ottenerle.
Vedrai più avanti come Kueue gestisce i carichi di lavoro che entrambi i team invieranno alle rispettive code.
gcloud container clusters create kueue-cohort --region COMPUTE_REGION \ --release-channel rapid --machine-type e2-standard-4 --num-nodes 2
Una volta creato il cluster, il risultato è simile al seguente:
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
Dove
STATUS
èRUNNING
perkueue-cluster
.Crea un pool di nodi denominato
spot
.Questo pool di nodi utilizza una VM spot e ha la scalabilità automatica abilitata. Inizia con 0 nodi, ma in un secondo momento lo renderai disponibile ai team per l'utilizzo come capacità di riserva.
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
Installa la versione release di Kueue nel cluster:
VERSION=VERSION kubectl apply -f \ https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/manifests.yaml
Sostituisci VERSION con la lettera v in base all'ultima versione di Kueue, ad esempio
v0.4.0
. Per ulteriori informazioni sulle versioni di Kueue, consulta Uscite di Kueue.Attendi che il controller Kueue sia pronto:
watch kubectl -n kueue-system get pods
Prima di poter continuare, l'output dovrebbe essere simile al seguente:
NAME READY STATUS RESTARTS AGE kueue-controller-manager-6cfcbb5dc5-rsf8k 2/2 Running 0 3m
Crea due nuovi spazi dei nomi denominati
team-a
eteam-b
:kubectl create namespace team-a kubectl create namespace team-b
I job verranno generati in ogni spazio dei nomi.
Crea le ResourceFlavors
Un ResourceFlavor rappresenta le variazioni delle risorse nei nodi del cluster, ad esempio diverse VM (ad esempio on demand rispetto a spot), architetture (ad esempio CPU x86 rispetto a ARM), brand e modelli (ad esempio GPU Nvidia A100 rispetto a T4).
ResourceFlavors utilizza le etichette e gli elementi taint dei nodi per trovare una corrispondenza con un insieme di nodi nel cluster.
In questo manifest:
- L'etichetta di ResourceFlavor
on-demand
è impostata sucloud.google.com/gke-provisioning: standard
. - L'etichetta di ResourceFlavor
spot
è impostata sucloud.google.com/gke-provisioning: spot
.
Quando a un carico di lavoro viene assegnato un ResourceFlavor, Kueue assegna i pod del carico di lavoro ai nodi corrispondenti alle etichette dei nodi definite per il ResourceFlavor.
Esegui il deployment di ResourceFlavor:
kubectl apply -f flavors.yaml
Crea ClusterQueue e LocalQueue
Crea due code cluster cq-team-a
e cq-team-b
e le relative code locali lq-team-a
e lq-team-b
con spazi dei nomi rispettivamente team-a
e team-b
.
ClusterQueues sono oggetti con ambito a livello di cluster che governano un pool di risorse come CPU, memoria e acceleratori hardware. Gli amministratori dei batch possono limitare la visibilità di questi oggetti agli utenti del batch.
Le code locali sono oggetti con spazio dei nomi che gli utenti possono elencare in batch. Questi puntano a CluterQueues, da cui vengono allocate le risorse per l'esecuzione dei workload LocalQueue.
ClusterQueues consente alle risorse di avere più versioni. In questo caso, entrambi i flussi di lavoro hanno due versioni, on-demand
e spot
, che forniscono ciascuna cpu
risorse.
La quota di ResourceFlavor spot
è impostata su 0
e non verrà utilizzata per ora.
Entrambi i ClusterQueue condividono la stessa coorte denominata all-teams
, definita in .spec.cohort
.
Quando due o più ClusterQueue condividono la stessa coorte, possono prendere in prestito la quota inutilizzata l'uno dall'altro.
Per scoprire di più sul funzionamento delle coorti e sulla semantica del prestito, consulta la documentazione di Kueue.
Esegui il deployment di ClusterQueues e LocalQueues:
kubectl apply -f cq-team-a.yaml
kubectl apply -f cq-team-b.yaml
(Facoltativo) Monitorare i carichi di lavoro utilizzando kube-prometheus
Puoi utilizzare Prometheus per monitorare i carichi di lavoro di Kueue attivi e in attesa.
Per monitorare i carichi di lavoro in fase di avvio e osservare il carico su ogni
ClusterQueue, esegui il deployment di kube-prometheus nel
cluster nello spazio dei nomi monitoring
:
Scarica il codice sorgente dell'operatore Prometheus:
cd git clone https://github.com/prometheus-operator/kube-prometheus.git
Crea CustomResourceDefinitions(CRD):
kubectl create -f kube-prometheus/manifests/setup
Crea i componenti di monitoraggio:
kubectl create -f kube-prometheus/manifests
Consenti a
prometheus-operator
di estrarre le metriche dai componenti Kueue:kubectl apply -f https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/prometheus.yaml
Passa alla directory di lavoro:
cd kubernetes-engine-samples/batch/kueue-cohort
Configura l'inoltro delle porte al servizio Prometheus in esecuzione nel tuo cluster GKE:
kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090
Apri l'interfaccia utente web di Prometheus su localhost:9090 nel browser.
In Cloud Shell:
Fai clic su Anteprima web.
Fai clic su Cambia porta e imposta il numero di porta su
9090
.Fai clic su Modifica e anteprima.
Viene visualizzata la seguente interfaccia utente web di Prometheus.
Nella casella di query Espressione, inserisci la seguente query per creare il primo riquadro che monitora i carichi di lavoro attivi per
cq-team-a
ClusterQueue:kueue_pending_workloads{cluster_queue="cq-team-a", status="active"} or kueue_admitted_active_workloads{cluster_queue="cq-team-a"}
Fai clic su Aggiungi riquadro.
Nella casella di query Espressione, inserisci la seguente query per creare un altro riquadro che monitora i carichi di lavoro attivi per
cq-team-b
ClusterQueue:kueue_pending_workloads{cluster_queue="cq-team-b", status="active"} or kueue_admitted_active_workloads{cluster_queue="cq-team-b"}
Fai clic su Aggiungi riquadro.
Nella casella di query Espressione, inserisci la seguente query per creare un riquadro che monitora il numero di nodi nel cluster:
count(kube_node_info)
(Facoltativo) Monitora i carichi di lavoro utilizzando Google Cloud Managed Service per Prometheus
Puoi utilizzare Google Cloud Managed Service per Prometheus per monitorare i carichi di lavoro di Kueue attivi e in attesa. Un elenco completo delle metriche è disponibile nella documentazione di Kueue.
Configura l'identità e il RBAC per l'accesso alle metriche:
La seguente configurazione crea quattro risorse Kubernetes che forniscono accesso alle metriche per i raccoglitori di Google Cloud Managed Service per Prometheus.
Un account di servizio denominato
kueue-metrics-reader
nello spazio dei nomikueue-system
verrà utilizzato per l'autenticazione quando si accede alle metriche di Kueue.Un secret associato all'account di servizio
kueue-metrics-reader
memorizza un token di autenticazione utilizzato dal collector per autenticarsi con l'endpoint delle metriche esposto dal deployment di Kueue.Un ruolo denominato
kueue-secret-reader
nello spazio dei nomikueue-system
, che consente di leggere il segreto contenente il token dell'account di servizio.Un ClusterRoleBinding che concede all'account di servizio
kueue-metrics-reader
il 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
Configura RoleBinding per Google Cloud Managed Service per Prometheus:
A seconda che tu stia utilizzando un cluster Autopilot o Standard, dovrai creare il ruolo di appartenenza nello spazio dei nomi
gke-gmp-system
ogmp-system
. Questa risorsa consente all'account di servizio del collector di accedere al segretokueue-metrics-reader-token
per autenticare e estrarre le metriche di 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
Configura la risorsa di monitoraggio dei pod:
La seguente risorsa configura il monitoraggio per il deployment di Kueue e specifica che le metriche sono esposte sul percorso /metrics tramite HTTPS. Utilizza il secret
kueue-metrics-reader-token
per l'autenticazione durante lo scraping delle metriche.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
Esegui query sulle metriche esportate
- Eseguire query sulle metriche esportate con Cloud Monitoring
- Eseguire query sulle metriche esportate con Grafana
Query PromQL di esempio per il monitoraggio di sistemi basati su Kueue
Queste query PromQL ti consentono di monitorare le metriche chiave di Kueue, come il throughput dei job, l'utilizzo delle risorse per coda e i tempi di attesa del carico di lavoro, per comprendere le prestazioni del sistema e identificare potenziali colli di bottiglia.
Throughput dei job
Viene calcolata la frequenza al secondo dei workload ammessi in 5 minuti per ogni cluster_queue. Questa metrica può essere utile per suddividere i dati in base alla coda e individuare i colli di bottiglia. La somma di queste metriche fornisce la produttività complessiva del sistema.
Query:
sum(rate(kueue_admitted_workloads_total[5m])) by (cluster_queue)
Utilizzo delle risorse
Si presume che metrics.enableClusterQueueResources
sia attivato. Calcola il rapporto tra l'utilizzo corrente della CPU e la quota nominale della CPU per ogni coda. Un valore prossimo a 1 indica un utilizzo elevato. Puoi adattarlo per la memoria o altre risorse modificando l'etichetta della risorsa.
Per installare una versione rilasciata di Kueue configurata in modo personalizzato nel tuo cluster, segui la documentazione di Kueue.
Query:
sum(kueue_cluster_queue_resource_usage{resource="cpu"}) by (cluster_queue) / sum(kueue_cluster_queue_nominal_quota{resource="cpu"}) by (cluster_queue)
Tempi di attesa in coda
Fornisce il tempo di attesa del 90° percentile per i carichi di lavoro in una coda specifica. Puoi modificare il valore del quantile (ad es. 0,5 per la mediana, 0,99 per il 99° percentile) per comprendere la distribuzione del tempo di attesa.
Query:
histogram_quantile(0.9, kueue_admission_wait_time_seconds_bucket{cluster_queue="QUEUE_NAME"})
Crea job e osserva i workload ammessi
Genera job per entrambi i ClusterQueue che rimarranno inattivi per 10 secondi, con tre job in parallelo e verranno completati con tre completamenti. Verrà poi cleanup dopo 60 secondi.
job-team-a.yaml
crea job nello spazio dei nomi team-a
e punta alla coda locale lq-team-a
e alla coda del cluster cq-team-a
.
Analogamente, job-team-b.yaml
crea job nello spazio dei nomi team-b
e punta alla coda locale lq-team-b
e alla coda del cluster cq-team-b
.
Avvia un nuovo terminale ed esegui questo script per generare un job ogni secondo:
./create_jobs.sh job-team-a.yaml 1
Avvia un altro terminale e crea job per lo spazio dei nomi
team-b
:./create_jobs.sh job-team-b.yaml 1
Osserva i job in coda in Prometheus. In alternativa, con questo comando:
watch -n 2 kubectl get clusterqueues -o wide
L'output dovrebbe essere simile al seguente:
NAME COHORT STRATEGY PENDING WORKLOADS ADMITTED WORKLOADS
cq-team-a all-teams BestEffortFIFO 0 5
cq-team-b all-teams BestEffortFIFO 0 4
Prendere in prestito la quota inutilizzata con i gruppi di coorte
ClusterQueues potrebbe non essere sempre a piena capacità. L'utilizzo delle quote non viene massimizzato quando i carichi di lavoro non sono distribuiti uniformemente tra i ClusterQueue. Se i cluster condividono la stessa coorte tra loro, possono prendere in prestito quote da altri cluster per massimizzare l'utilizzo delle quote.
Una volta che i job sono in coda per entrambi i cluster
cq-team-a
ecq-team-b
, interrompi lo script per lo spazio dei nomiteam-b
premendoCTRL+c
sul terminale corrispondente.Una volta elaborati tutti i job in attesa nello spazio dei nomi
team-b
, i job dello spazio dei nomiteam-a
possono prendere in prestito le risorse disponibili incq-team-b
:kubectl describe clusterqueue cq-team-a
Poiché
cq-team-a
ecq-team-b
condividono la stessa coorte denominataall-teams
, questi ClusterQueue sono in grado di condividere risorse non utilizzate.Flavors Usage: Name: on-demand Resources: Borrowed: 5 Name: cpu Total: 15 Borrowed: 5Gi Name: memory Total: 15Gi
Riprendi lo script per lo spazio dei nomi
team-b
../create_jobs.sh job-team-b.yaml 3
Osserva come le risorse prese in prestito da
cq-team-a
tornano a0
, mentre le risorse dicq-team-b
vengono utilizzate per i propri carichi di lavoro:kubectl describe clusterqueue cq-team-a
Flavors Usage: Name: on-demand Resources: Borrowed: 0 Name: cpu Total: 9 Borrowed: 0 Name: memory Total: 9Gi
Aumentare la quota con le VM spot
Quando la quota deve essere aumentata temporaneamente, ad esempio per soddisfare una domanda elevata nei carichi di lavoro in attesa, puoi configurare Kueue per soddisfare la domanda aggiungendo altri ClusterQueue alla coorte. I ClusterQueue con risorse inutilizzate possono condividerle con altri ClusterQueue che appartengono alla stessa coorte.
All'inizio del tutorial hai creato un pool di nodi denominato spot
utilizzando VM spot e un ResourceFlavor denominato spot
con l'etichetta impostata su cloud.google.com/gke-provisioning: spot
. Crea un ClusterQueue per utilizzare questo pool di nodi e il ResourceFlavor che lo rappresenta:
Crea un nuovo ClusterQueue denominato
cq-spot
con la coorte impostata suall-teams
:Poiché questo ClusterQueue condivide la stessa coorte con
cq-team-a
ecq-team-b
, sia ClusterQueuecq-team-a
checq-team-b
possono prendere in prestito risorse fino a 15 richieste di CPU e 15 Gi di memoria.kubectl apply -f cq-spot.yaml
In Prometheus, osserva come i carichi di lavoro ammessi aumentano sia per
cq-team-a
che percq-team-b
grazie alla quota aggiunta dacq-spot
che condivide la stessa coorte. In alternativa, con questo comando:watch -n 2 kubectl get clusterqueues -o wide
In Prometheus, osserva il numero di nodi nel cluster. In alternativa, con questo comando:
watch -n 2 kubectl get nodes -o wide
Interrompi entrambi gli script premendo
CTRL+c
per lo spazio dei nomiteam-a
eteam-b
.
Esegui la pulizia
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
- 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.
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 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
Elimina il file manifest di Kueue:
VERSION=VERSION kubectl delete -f \ https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/manifests.yaml
Elimina il cluster:
gcloud container clusters delete kueue-cohort --region=COMPUTE_REGION
Passaggi successivi
Scopri di più su come eseguire il deployment di un sistema batch utilizzando Kueue.
Scopri di più sui job su GKE.