Questo tutorial utilizza Kueue per mostrarti come implementare un sistema di accodamento dei job, configurare la condivisione di risorse e 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, massimizzare l'utilizzo tra gli spazi dei nomi è molto importante. 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 cohort in Kueue. Una coorte è un gruppo di ClusterQueue che possono prendere in prestito la quota inutilizzata l'una dall'altra. Una 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.
Crea ResourceFlavors
Un ResourceFlavor rappresenta le variazioni delle risorse nei nodi del cluster, ad esempio VM diverse (ad esempio spot rispetto a on demand), architetture (ad esempio CPU x86 e ARM), marche e modelli (ad esempio GPU Nvidia A100 e T4).
ResourceFlavors utilizza le etichette e i taint dei nodi per trovare una corrispondenza con un insieme di nodi nel cluster.
In questo manifest:
- ResourceFlavor
on-demand
ha l'etichetta impostata sucloud.google.com/gke-provisioning: standard
. - ResourceFlavor
spot
ha l'etichetta impostata sucloud.google.com/gke-provisioning: spot
.
Quando a un workload viene assegnato un ResourceFlavor, Kueue assegna i pod del workload ai nodi che corrispondono alle etichette dei nodi definite per ResourceFlavor.
Esegui il deployment di ResourceFlavor:
kubectl apply -f flavors.yaml
Crea ClusterQueue e LocalQueue
Crea due ClusterQueue cq-team-a
e cq-team-b
e le relative LocalQueue lq-team-a
e lq-team-b
con spazi dei nomi team-a
e team-b
rispettivamente.
ClusterQueue sono oggetti con ambito a livello di cluster che regolano un pool di risorse come CPU, memoria e acceleratori hardware. Gli amministratori batch possono limitare la visibilità di questi oggetti agli utenti batch.
LocalQueues sono oggetti con spazi dei nomi che gli utenti batch possono elencare. Puntano a ClusterQueues, da cui vengono allocate le risorse per eseguire i workload LocalQueue.
ClusterQueues consente alle risorse di avere più varianti. In questo caso, entrambe le
ClusterQueue hanno due varianti, on-demand
e spot
, ognuna delle quali fornisce cpu
risorse.
La quota di ResourceFlavor spot
è impostata su 0
e non verrà utilizzata per
ora.
Entrambe le 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'una dall'altra.
Per saperne di più sul funzionamento dei cohort e sulla semantica di 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) Monitora i workload utilizzando kube-prometheus
Puoi utilizzare Prometheus per monitorare i carichi di lavoro Kueue attivi e in attesa.
Per monitorare i workload 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 le 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 eseguire lo scraping delle metriche dai componenti di 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 il port forwarding al servizio Prometheus in esecuzione nel cluster GKE:
kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090
Apri la UI 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 visualizza anteprima.
Viene visualizzata la seguente UI web di Prometheus.
Nella casella di query Espressione, inserisci la seguente query per creare il primo pannello 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 della 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 pannello 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 Kueue attivi e in attesa. Un elenco completo delle metriche è disponibile nella documentazione di Kueue.
Configura l'identità e il controllo dell'accesso basato sui ruoli per l'accesso alle metriche:
La seguente configurazione crea quattro risorse Kubernetes che forniscono l'accesso alle metriche per i raccoglitori di Google Cloud Managed Service per Prometheus.
Un service account denominato
kueue-metrics-reader
all'interno dello spazio dei nomikueue-system
verrà utilizzato per l'autenticazione durante l'accesso alle metriche di Kueue.Un secret associato al account di servizio
kueue-metrics-reader
memorizza un token di autenticazione utilizzato dal raccoglitore per l'autenticazione 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 secret contenente il token del 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 RoleBinding nello spazio dei nomi
gke-gmp-system
ogmp-system
. Questa risorsa consente al account di servizio del collettore di accedere al secretkueue-metrics-reader-token
per autenticare ed 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 Pod Monitoring:
La seguente risorsa configura il monitoraggio per il deployment di Kueue, 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: 8443 interval: 30s path: /metrics scheme: https tls: insecureSkipVerify: true authorization: type: Bearer credentials: secret: name: kueue-metrics-reader-token key: token
Metriche esportate delle query
- 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 la velocità effettiva dei job, l'utilizzo delle risorse per coda e i tempi di attesa dei carichi di lavoro, per comprendere le prestazioni del sistema e identificare potenziali colli di bottiglia.
Throughput del job
Questo valore calcola la tariffa al secondo dei workload ammessi in 5 minuti per ogni cluster_queue. Questa metrica può essere utile per suddividerla per coda, in modo da individuare i colli di bottiglia e la somma fornisce la velocità effettiva complessiva del sistema.
Query:
sum(rate(kueue_admitted_workloads_total[5m])) by (cluster_queue)
Utilizzo delle risorse
Ciò presuppone che metrics.enableClusterQueueResources
sia attivato. Calcola il rapporto tra l'utilizzo attuale della CPU e la quota nominale di CPU per ogni coda. Un valore
vicino a 1 indica un utilizzo elevato. Puoi adattare questo valore per la memoria o altre
risorse modificando l'etichetta della risorsa.
Per installare una versione rilasciata di Kueue configurata personalizzata 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 90° percentile del tempo di attesa per i workload 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
In questa sezione, creerai i job Kubernetes negli spazi dei nomi team-a
e team-b
. Un controller Job in Kubernetes crea uno o più pod e assicura che eseguano correttamente un'attività specifica.
Genera job per entrambe le ClusterQueue che rimarranno inattive per 10 secondi, con tre job paralleli e tre completamenti. Verrà poi ripulito dopo 60 secondi.
job-team-a.yaml
crea job nello spazio dei nomi team-a
e punta a LocalQueue lq-team-a
e ClusterQueue cq-team-a
.
Analogamente, job-team-b.yaml
crea job nello spazio dei nomi team-b
e punta
a LocalQueue lq-team-b
e a ClusterQueue 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 cohort
ClusterQueues potrebbe non essere sempre alla massima capacità. L'utilizzo delle quote non viene ottimizzato quando i workload non sono distribuiti in modo uniforme tra le ClusterQueue. Se ClusterQueue condividono la stessa coorte, possono prendere in prestito quote da altre ClusterQueue per massimizzare l'utilizzo delle quote.
Una volta che sono presenti job in coda per ClusterQueue
cq-team-a
ecq-team-b
, interrompi lo script per lo spazio dei nomiteam-b
premendoCTRL+c
nel terminale corrispondente.Una volta elaborati tutti i job in attesa dello 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
, queste ClusterQueue possono condividere le 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 workload: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 è necessario aumentare temporaneamente la quota, ad esempio per soddisfare la domanda elevata nei workload in attesa, puoi configurare Kueue in modo che soddisfi la domanda aggiungendo altre ClusterQueue al coorte. ClusterQueue con risorse inutilizzate può condividere queste risorse con altre ClusterQueue che appartengono alla stessa coorte.
All'inizio del tutorial, hai creato un pool di nodi denominato spot
utilizzando le VM spot e un ResourceFlavor denominato spot
con l'etichetta impostata su cloud.google.com/gke-provisioning: spot
. Crea una ClusterQueue per utilizzare questo pool di nodi e ResourceFlavor che lo rappresenta:
Crea una nuova ClusterQueue denominata
cq-spot
con la coorte impostata suall-teams
:Poiché questa ClusterQueue condivide lo stesso gruppo con
cq-team-a
ecq-team-b
, entrambe le ClusterQueuecq-team-a
ecq-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 picchi dei carichi di lavoro ammessi per
cq-team-a
ecq-team-b
grazie alla quota aggiuntiva dicq-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
.