Tutorial ini menggunakan Kueue untuk menunjukkan cara menerapkan sistem antrean Tugas, mengonfigurasi resource workload, dan pembagian kuota antar-namespace yang berbeda di Google Kubernetes Engine (GKE), serta untuk memaksimalkan pemanfaatan cluster Anda.
Latar belakang
Sebagai engineer infrastruktur atau administrator cluster, memaksimalkan pemanfaatan antar-namespace sangatlah penting. Batch Tugas dalam satu namespace mungkin tidak sepenuhnya menggunakan seluruh kuota yang ditetapkan ke namespace, sementara namespace lain mungkin memiliki beberapa Tugas yang tertunda. Untuk menggunakan resource cluster secara efisien di antara Tugas dalam berbagai namespace dan untuk meningkatkan fleksibilitas pengelolaan kuota, Anda dapat mengonfigurasi kelompok di Kueue. Kelompok adalah grup ClusterQueue yang dapat meminjam kuota yang tidak digunakan dari satu sama lain. ClusterQueue mengatur kumpulan resource seperti CPU, memori, dan akselerator hardware.
Anda dapat menemukan definisi yang lebih mendetail dari semua konsep ini di dokumentasi Kueue
Tujuan
Tutorial ini ditujukan untuk engineer infrastruktur atau administrator cluster yang ingin menerapkan sistem antrean Tugas di Kubernetes menggunakan Kueue dengan pembagian kuota.Tutorial ini akan meniru dua tim dalam dua namespace berbeda, dan setiap tim memiliki resource khusus, tetapi dapat saling meminjam. Set ketiga dari resource dapat digunakan sebagai spillover ketika tugas terakumulasi.
Gunakan operator Prometheus untuk memantau Tugas dan alokasi resource di namespace yang berbeda.
Tutorial ini membahas langkah-langkah penting berikut:
- Membuat cluster GKE
- Membuat ResourceFlavors
- Untuk setiap tim, buat ClusterQueue dan LocalQueue
- Membuat Job dan mengamati workload yang diterima
- Meminjam kuota yang tidak digunakan dengan kelompok
- Menambahkan spillover ClusterQueue yang mengatur Spot VM
Biaya
Tutorial ini menggunakan komponen Google Cloudyang dapat ditagih berikut:Gunakan Kalkulator Harga untuk membuat perkiraan biaya berdasarkan penggunaan yang Anda proyeksikan.
Setelah menyelesaikan tutorial ini, Anda dapat menghindari penagihan berkelanjutan dengan menghapus resource yang Anda buat. Untuk informasi selengkapnya, lihat Membersihkan.
Sebelum memulai
Menyiapkan project
- 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.
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. Di konsol Google Cloud , mulai instance Cloud Shell:
Buka Cloud ShellDownload kode sumber untuk aplikasi contoh ini:
git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samplesTetapkan variabel lingkungan default:
gcloud config set project PROJECT_ID gcloud config set compute/region COMPUTE_REGIONGanti nilai berikut:
- PROJECT_ID: Google Cloud Project ID Anda.
- COMPUTE_REGION: region Compute Engine.
Buat cluster GKE bernama
kueue-cohort:Anda akan membuat cluster dengan 6 node (2 per zona) di kumpulan default tanpa penskalaan otomatis. Jumlah tersebut adalah seluruh resource yang tersedia untuk tim di awal, sehingga harus bersaing untuk mendapatkannya.
Anda akan melihat nanti bagaimana Kueue mengelola workload yang akan dikirim oleh kedua tim ke antrean masing-masing.
gcloud container clusters create kueue-cohort --location COMPUTE_REGION \ --release-channel rapid --machine-type e2-standard-4 --num-nodes 2Setelah cluster dibuat, hasilnya tampak seperti berikut ini:
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: RUNNINGDengan
STATUSadalahRUNNINGuntukkueue-cluster.Buat node pool bernama
spot.Node pool ini menggunakan Spot VM dan mengaktifkan penskalaan otomatis. Node pool dimulai dengan 0 node, tetapi kemudian Anda akan menyediakannya bagi tim untuk digunakan sebagai kapasitas overspill.
gcloud container node-pools create spot --cluster=kueue-cohort --location COMPUTE_REGION \ --spot --enable-autoscaling --max-nodes 20 --num-nodes 0 \ --machine-type e2-standard-4Instal versi rilis Kueue ke cluster:
VERSION=VERSION kubectl apply -f \ https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/manifests.yamlGanti VERSION dengan huruf v setelah versi terbaru Kueue, misalnya
v0.4.0. Untuk informasi selengkapnya tentang versi Kueue, lihat rilis Kueue.Tunggu hingga pengontrol Kueue siap:
watch kubectl -n kueue-system get podsOutputnya akan mirip dengan berikut ini sebelum Anda dapat melanjutkan:
NAME READY STATUS RESTARTS AGE kueue-controller-manager-6cfcbb5dc5-rsf8k 2/2 Running 0 3mBuat dua namespace baru bernama
team-adanteam-b:kubectl create namespace team-a kubectl create namespace team-bTugas akan dibuat untuk setiap namespace.
on-demandResourceFlavor memiliki label yang ditetapkan kecloud.google.com/gke-provisioning: standard.spotResourceFlavor memiliki label yang ditetapkan kecloud.google.com/gke-provisioning: spot.Download kode sumber untuk operator Prometheus:
cd git clone https://github.com/prometheus-operator/kube-prometheus.gitBuat CustomResourceDefinitions(CRD):
kubectl create -f kube-prometheus/manifests/setupBuat komponen pemantauan:
kubectl create -f kube-prometheus/manifestsIzinkan
prometheus-operatoruntuk melakukan scraping metrik dari komponen Kueue:kubectl apply -f https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/prometheus.yamlUbah ke direktori kerja:
cd kubernetes-engine-samples/batch/kueue-cohortSiapkan penerusan port ke layanan Prometheus yang berjalan di cluster GKE Anda:
kubectl --namespace monitoring port-forward svc/prometheus-k8s 9090Buka UI web Prometheus di localhost:9090 pada browser.
Di Cloud Shell:
Klik Pratinjau Web.
Klik Ubah port dan tetapkan nomor port ke
9090.Klik Ubah dan Pratinjau.
UI web Prometheus berikut akan muncul.

Di kotak kueri Expression, masukkan kueri berikut untuk membuat panel pertama yang memantau beban kerja aktif untuk ClusterQueue
cq-team-a:kueue_pending_workloads{cluster_queue="cq-team-a", status="active"} or kueue_admitted_active_workloads{cluster_queue="cq-team-a"}Klik Tambahkan panel.
Di kotak kueri Expression, masukkan kueri berikut untuk membuat panel lain yang memantau beban kerja aktif untuk ClusterQueue
cq-team-b:kueue_pending_workloads{cluster_queue="cq-team-b", status="active"} or kueue_admitted_active_workloads{cluster_queue="cq-team-b"}Klik Tambahkan panel.
Di kotak kueri Expression, masukkan kueri berikut untuk membuat panel yang memantau jumlah node di cluster:
count(kube_node_info)Menyiapkan Identity dan RBAC untuk akses metrik:
Konfigurasi berikut membuat 4 resource Kubernetes, yang menyediakan akses metrik untuk pengumpul Google Cloud Managed Service for Prometheus.
ServiceAccount bernama
kueue-metrics-readerdalam namespacekueue-systemakan digunakan untuk melakukan autentikasi saat mengakses metrik Kueue.Secret yang terkait dengan akun layanan
kueue-metrics-reader, menyimpan token autentikasi, yang digunakan oleh pengumpul, untuk melakukan autentikasi dengan endpoint metrik yang diekspos oleh deployment Kueue.Peran bernama
kueue-secret-readerdi namespacekueue-system, yang memungkinkan pembacaan secret yang berisi token akun layanan.ClusterRoleBinding yang memberikan peran ClusterRole
kueue-metrics-readerke akun layanankueue-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.ioKonfigurasi RoleBinding untuk Google Cloud Managed Service for Prometheus:
Bergantung pada apakah Anda menggunakan cluster Autopilot atau Standard, Anda harus membuat RoleBinding di namespace
gke-gmp-systemataugmp-system. Resource ini memungkinkan akun layanan pengumpul mengakses rahasiakueue-metrics-reader-tokenuntuk mengautentikasi dan meng-scrape metrik 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: ServiceAccountStandar
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: ServiceAccountMengonfigurasi resource Pemantauan Pod:
Resource berikut mengonfigurasi pemantauan untuk deployment Kueue, yang menentukan bahwa metrik diekspos di jalur /metrics melalui HTTPS. Agen ini menggunakan secret
kueue-metrics-reader-tokenuntuk autentikasi saat meng-scraping metrik.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- Membuat kueri metrik yang diekspor dengan Cloud Monitoring
- Membuat kueri metrik yang diekspor dengan Grafana
Mulai terminal baru dan jalankan skrip ini untuk menghasilkan Tugas setiap detik:
./create_jobs.sh job-team-a.yaml 1Mulai terminal lain dan buat Tugas untuk namespace
team-b:./create_jobs.sh job-team-b.yaml 1Amati Tugas yang mengantre di Prometheus. Atau dengan perintah ini:
watch -n 2 kubectl get clusterqueues -o wideSetelah ada Tugas yang diantrekan untuk ClusterQueues
cq-team-adancq-team-b, hentikan skrip untuk namespaceteam-bdengan menekanCTRL+cdi terminal yang sesuai.Setelah semua Tugas yang tertunda dari namespace
team-bdiproses, tugas dari namespaceteam-adapat meminjam resource yang tersedia dicq-team-b:kubectl describe clusterqueue cq-team-aKarena
cq-team-adancq-team-bmemiliki kelompok yang sama yang disebutall-teams, ClusterQueues ini dapat berbagi resource yang tidak digunakan.Flavors Usage: Name: on-demand Resources: Borrowed: 5 Name: cpu Total: 15 Borrowed: 5Gi Name: memory Total: 15GiMelanjutkan skrip untuk namespace
team-b../create_jobs.sh job-team-b.yaml 3Amati bagaimana resource yang dipinjam dari
cq-team-akembali ke0, sedangkan resource daricq-team-bdigunakan untuk workloadnya sendiri:kubectl describe clusterqueue cq-team-aFlavors Usage: Name: on-demand Resources: Borrowed: 0 Name: cpu Total: 9 Borrowed: 0 Name: memory Total: 9GiBuat ClusterQueue baru bernama
cq-spotdengan kelompok yang ditetapkan keall-teams:Karena ClusterQueue ini berbagi kelompok yang sama dengan
cq-team-adancq-team-b, ClusterQueuecq-team-adancq-team-bdapat meminjam resource hingga 15 permintaan CPU, dan 15 Gi memori.kubectl apply -f cq-spot.yamlDi Prometheus, amati lonjakan workload yang diterima untuk
cq-team-adancq-team-bberkat kuota tambahan olehcq-spotyang berbagi kelompok yang sama. Atau dengan perintah ini:watch -n 2 kubectl get clusterqueues -o wideDi Prometheus, amati jumlah node dalam cluster. Atau dengan perintah ini:
watch -n 2 kubectl get nodes -o wideHentikan kedua skrip dengan menekan
CTRL+cuntuk namespaceteam-adanteam-b.- 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.
Hapus sistem kuota 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 spotHapus manifes Kueue:
VERSION=VERSION kubectl delete -f \ https://github.com/kubernetes-sigs/kueue/releases/download/$VERSION/manifests.yamlHapus kluster:
gcloud container clusters delete kueue-cohort --location=COMPUTE_REGIONPelajari cara Men-deploy sistem batch menggunakan Kueue lebih lanjut.
Pelajari Tugas di GKE lebih lanjut.
Menetapkan setelan default untuk Google Cloud CLI
Membuat cluster GKE
Membuat ResourceFlavors
ResourceFlavor mewakili variasi resource di node cluster Anda, seperti VM yang berbeda (misalnya spot versus on-demand), arsitektur (misalnya, CPU x86 vs ARM), merek, dan model (misalnya, GPU Nvidia A100 versus T4).
ResourceFlavors menggunakan label dan taint node agar cocok dengan set node dalam cluster.
Dalam manifes ini:
Saat workload diberi ResourceFlavor, Kueue menetapkan Pod workload ke node yang cocok dengan label node yang ditentukan untuk ResourceFlavor.
Men-deploy ResourceFlavor:
kubectl apply -f flavors.yaml
Membuat ClusterQueue dan LocalQueue
Membuat dua ClusterQueue cq-team-a dan cq-team-b, serta
LocalQueues lq-team-a dan lq-team-b yang sesuai, dengan namespace masing-masing team-a dan team-b.
ClusterQueues adalah objek cakupan cluster yang mengatur kumpulan resource seperti CPU, memori, dan akselerator hardware. Administrator batch dapat membatasi visibilitas objek ini untuk pengguna batch.
LocalQueue adalah objek dengan namespace yang dapat dicantumkan oleh pengguna batch. Antrean mengarah ke CluterQueues, tempat resource dialokasikan untuk menjalankan workload LocalQueue.
ClusterQueues memungkinkan resource memiliki beberapa ragam. Dalam hal ini, kedua
ClusterQueues memiliki dua ragam, on-demand dan spot, masing-masing menyediakan resource cpu.
Kuota spot ResourceFlavor ditetapkan ke 0, dan tidak akan digunakan untuk
saat ini.
Kedua ClusterQueues memiliki kelompok yang sama bernama all-teams, yang ditentukan di .spec.cohort.
Jika dua atau beberapa ClusterQueue berbagi kelompok yang sama, cluster tersebut dapat meminjam kuota yang tidak digunakan dari satu
sama lain.
Anda dapat mempelajari lebih lanjut cara kerja kelompok dan semantik pinjaman di dokumentasi Kueue
Men-deploy ClusterQueues dan LocalQueues:
kubectl apply -f cq-team-a.yaml
kubectl apply -f cq-team-b.yaml
(Opsional) Memantau Workload menggunakan kube-prometheus
Anda dapat menggunakan Prometheus untuk memantau workload Kueue aktif dan tertunda.
Untuk memantau workload yang ditampilkan dan mengamati muatan di setiap
ClusterQueue, deploy kube-prometheus ke cluster di bagian namespace monitoring:
(Opsional) Memantau Workload menggunakan Google Cloud Managed Service for Prometheus
Anda dapat menggunakan Google Cloud Managed Service for Prometheus untuk memantau workload Kueue yang aktif dan tertunda. Daftar lengkap metrik dapat ditemukan di dokumentasi Kueue.
Mengueri metrik yang diekspor
Contoh kueri PromQL untuk memantau sistem berbasis Kueue
Kueri PromQL ini memungkinkan Anda memantau metrik utama Kueue seperti throughput tugas, penggunaan resource menurut antrean, dan waktu tunggu beban kerja untuk memahami performa sistem dan mengidentifikasi potensi hambatan.
Throughput Tugas
Kueri ini menghitung kecepatan per detik workload yang diizinkan selama 5 menit untuk setiap cluster_queue. Metrik ini dapat membantu memecahnya berdasarkan antrean untuk membantu menunjukkan hambatan dan menjumlahkannya akan memberikan throughput sistem secara keseluruhan.
Kueri:
sum(rate(kueue_admitted_workloads_total[5m])) by (cluster_queue)
Pemanfaatan Sumber Daya
Hal ini mengasumsikan bahwa metrics.enableClusterQueueResources diaktifkan. Metrik ini menghitung rasio penggunaan CPU saat ini terhadap kuota CPU nominal untuk setiap antrean. Nilai yang mendekati 1 menunjukkan pemakaian yang tinggi. Anda dapat menyesuaikannya untuk memori atau resource
lainnya dengan mengubah label resource.
Untuk menginstal versi rilis Kueue yang dikonfigurasi secara kustom di cluster Anda, ikuti dokumentasi Kueue.
Kueri:
sum(kueue_cluster_queue_resource_usage{resource="cpu"}) by (cluster_queue) / sum(kueue_cluster_queue_nominal_quota{resource="cpu"}) by (cluster_queue)Waktu Tunggu Antrean
Hal ini memberikan waktu tunggu persentil ke-90 untuk beban kerja dalam antrean tertentu. Anda dapat mengubah nilai kuantil (misalnya, 0,5 untuk median, 0,99 untuk persentil ke-99) untuk memahami distribusi waktu tunggu.
Kueri:
histogram_quantile(0.9, kueue_admission_wait_time_seconds_bucket{cluster_queue="QUEUE_NAME"})Membuat Job dan mengamati workload yang diterima
Di bagian ini, Anda akan membuat Tugas Kubernetes di namespace team-a dan team-b. Pengontrol Tugas di Kubernetes membuat satu atau beberapa Pod dan memastikan bahwa Pod tersebut berhasil menjalankan tugas tertentu.
Hasilkan Tugas ke kedua ClusterQueue yang akan tidur selama 10 detik, dengan tiga Tugas yang setara dan akan diselesaikan dengan tiga penyelesaian. Kemudian, data akan dibersihkan setelah 60 detik.
job-team-a.yaml membuat Tugas pada namespace team-a dan mengarah ke
LocalQueue lq-team-a dan ClusterQueue cq-team-a.
Demikian pula, job-team-b.yaml membuat Tugas pada namespace team-b, dan menunjuk
ke LocalQueue lq-team-b dan ClusterQueue cq-team-b.
Outputnya akan mirip dengan berikut ini:
NAME COHORT STRATEGY PENDING WORKLOADS ADMITTED WORKLOADS
cq-team-a all-teams BestEffortFIFO 0 5
cq-team-b all-teams BestEffortFIFO 0 4
Meminjam kuota yang tidak digunakan dengan kelompok
ClusterQueues mungkin tidak selalu memiliki kapasitas penuh. Penggunaan kuota tidak akan dimaksimalkan saat workload tidak tersebar secara merata di antara ClusterQueue. Jika ClusterQueues berbagi kelompok yang sama satu sama lain, ClusterQueues dapat meminjam kuota dari ClusterQueues lain untuk memaksimalkan penggunaan kuota.
Meningkatkan kuota dengan Spot VM
Ketika kuota perlu ditingkatkan sementara, misalnya untuk memenuhi permintaan tinggi dalam workload yang tertunda, Anda dapat mengonfigurasi Kueue untuk mengakomodasi permintaan dengan menambahkan lebih banyak ClusterQueues ke kelompok. ClusterQueue dengan resource yang tidak digunakan dapat berbagi resource tersebut dengan ClusterQueues lain yang termasuk dalam kelompok yang sama.
Di awal tutorial, Anda telah membuat node pool bernama spot menggunakan Spot VM dan ResourceFlavor bernama spot dengan label yang ditetapkan ke cloud.google.com/gke-provisioning: spot. Buat ClusterQueue untuk menggunakan node pool ini dan ResourceFlavor yang mewakilinya:
Pembersihan
Agar tidak perlu membayar biaya pada akun Google Cloud Anda untuk resource yang digunakan dalam tutorial ini, hapus project yang berisi resource tersebut, atau simpan project dan hapus setiap resource.