Tutorial ini menunjukkan cara mengoptimalkan pemanfaatan resource di Google Kubernetes Engine (GKE) dengan mengonfigurasi workload agar diskalakan secara otomatis ke nol replika saat tidak ada aktivitas, dan diskalakan kembali saat permintaan meningkat. Pendekatan ini mengintegrasikan Horizontal Pod Autoscaler (HPA) dengan infrastruktur penskalaan otomatis terkelola GKE untuk mengelola penskalaan berdasarkan metrik eksternal.
Konfigurasi deployment Anda agar diskalakan ke nol dengan menyetel nilai kolom minReplicas ke 0 dan
menentukan metrik dengan jenis External atau Object dalam manifes HPA.
GKE memantau metrik ini melalui resource kustom AutoscalingMetric, yang membantu memastikan pengelolaan resource yang efisien untuk aplikasi Anda.
Dengan konfigurasi ini, Anda tidak perlu menggunakan adaptor metrik pihak ketiga, seperti KEDA, untuk menskalakan workload GKE. Solusi ini mengelola penyerapan metrik dan rekomendasi penskalaan langsung di bidang kontrol GKE, sehingga mengurangi overhead pengelolaan cluster.
Dalam tutorial ini, Anda akan men-deploy aplikasi pekerja asinkron contoh yang
memproses pesan dari antrean Pub/Sub. Anda mengonfigurasi penskalaan otomatis Pod horizontal untuk memantau kedalaman antrean (pubsub.googleapis.com:num_undelivered_messages) menggunakan resource kustom AutoscalingMetric:
- Saat pesan tiba di langganan: GKE akan menskalakan Pod pekerja untuk memproses antrean.
- Saat antrean kosong: GKE secara otomatis menurunkan skala Deployment pekerja menjadi nol replika.
Tutorial ini ditujukan bagi Developer aplikasi, Admin dan operator platform, serta DevOps yang ingin mengoptimalkan penggunaan resource di GKE dengan menskalakan workload ke nol saat tidak ada aktivitas.
Pertimbangan
Sebelum mengonfigurasi workload untuk menskalakan ke nol, tinjau pertimbangan berikut:
- Menskalakan workload ke dan dari nol menggunakan HPA mengharuskan bidang kontrol dan node cluster GKE menjalankan versi 1.37 atau yang lebih baru di cluster baru dan cluster lama yang diupgrade. Jika Anda menggunakan cluster yang ada, pastikan versinya atau upgrade cluster atau nodenya ke versi 1.37 atau yang lebih baru.
- Manifes HPA Anda harus menggunakan konfigurasi
apiVersion: autoscaling/v2untuk mendukung setelanminReplicas: 0dan metrik eksternal. - Sebelum melakukan downgrade node pool ke versi yang lebih lama dari 1.37, perbarui semua manifes HPA yang dikonfigurasi untuk melakukan penskalaan ke dan dari nol dengan menyetel kolom
minReplicaske1atau yang lebih besar. Versi sebelum 1.37 tidak mendukung setelanminReplicas: 0, yang dapat menyebabkan workload tetap macet pada nol replika. - Anda harus mengonfigurasi setidaknya satu metrik
ExternalatauObject(seperti kedalaman antrean) di penskalaan otomatis Pod horizontal. GKE tidak dapat mengumpulkan metrik CPU atau memori (Resource) saat workload memiliki nol Pod, sehingga metrik resource saja tidak dapat memicu penskalaan dari nol. - AutoscalingMetric, HorizontalPodAutoscaler, dan Deployment target harus berada di namespace Kubernetes yang sama.
Sebelum memulai
-
Instal Google Cloud CLI.
-
Konfigurasi gcloud CLI agar menggunakan identitas gabungan Anda.
Untuk mengetahui informasi selengkapnya, lihat Login ke gcloud CLI dengan identitas gabungan Anda.
-
Untuk melakukan inisialisasi gcloud CLI, jalankan perintah berikut:
gcloud init -
Buat atau pilih Google Cloud project.
Peran yang diperlukan untuk memilih atau membuat project
- Pilih project: Memilih project tidak memerlukan peran IAM tertentu—Anda dapat memilih project mana pun yang telah diberi peran.
-
Membuat project: Untuk membuat project, Anda memerlukan peran Project Creator
(
roles/resourcemanager.projectCreator), yang berisi izinresourcemanager.projects.create. Pelajari cara memberikan peran.
-
Buat Google Cloud project:
gcloud projects create PROJECT_ID
Ganti
PROJECT_IDdengan nama untuk Google Cloud project yang Anda buat. -
Pilih project Google Cloud yang Anda buat:
gcloud config set project PROJECT_ID
Ganti
PROJECT_IDdengan nama project Google Cloud Anda.
-
Verifikasi bahwa penagihan diaktifkan untuk project Google Cloud Anda.
Aktifkan GKE API dan Pub/Sub API:
Peran yang diperlukan untuk mengaktifkan API
Untuk mengaktifkan API, Anda memerlukan izin
serviceusage.services.enable. Jika Anda membuat project, kemungkinan Anda sudah memiliki izin ini melalui peran Pemilik (roles/owner). Jika tidak, Anda bisa mendapatkan izin ini melalui peran Admin Penggunaan Layanan (roles/serviceusage.serviceUsageAdmin). Pelajari cara memberikan peran.gcloud services enable container.googleapis.com
pubsub.googleapis.com
Peran yang diperlukan
Untuk mendapatkan izin yang Anda perlukan untuk menyelesaikan tutorial ini, minta administrator Anda untuk memberi Anda peran IAM berikut di project Anda:
- GKE Cluster Admin (
roles/container.clusterAdmin) - Pub/Sub Admin (
roles/pubsub.admin) - Project IAM Admin (
roles/resourcemanager.projectIamAdmin) - Service Account User (
roles/iam.serviceAccountUser)
Untuk mengetahui informasi selengkapnya tentang pemberian peran, lihat Mengelola akses ke project, folder, dan organisasi.
Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.
Menyiapkan lingkungan Anda
Untuk mempermudah, perintah dalam tutorial ini akan membuat semua resource (cluster GKE, serta topik dan langganan Pub/Sub) dalam satu Google Cloud project
(PROJECT_ID).
Untuk menyiapkan lingkungan Anda, ikuti langkah-langkah berikut:
Menetapkan variabel lingkungan:
export PROJECT_ID=PROJECT_ID export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format 'get(projectNumber)') export LOCATION=LOCATIONGanti kode berikut:
PROJECT_ID: Google Cloud Project ID Anda.LOCATION: region atau zona tempat Anda ingin membuat cluster GKE, sepertius-central1. Untuk cluster Autopilot, tentukan region.
Buat cluster GKE yang menjalankan versi 1.37 atau yang lebih baru dengan mengaktifkan Workload Identity Federation for GKE. Sebaiknya gunakan cluster Autopilot untuk pengalaman Kubernetes yang terkelola sepenuhnya dan untuk memaksimalkan penghematan biaya saat workload diskalakan ke nol. Untuk memilih mode operasi yang paling sesuai untuk workload Anda, lihat Memilih mode operasi GKE:
Autopilot
Buat cluster Autopilot:
gcloud container clusters create-auto scale-to-zero \ --project=${PROJECT_ID} \ --location=${LOCATION}Workload Identity Federation for GKE diaktifkan secara default di cluster Autopilot.
Standar
Buat cluster Standard dengan Workload Identity Federation untuk GKE diaktifkan:
gcloud container clusters create scale-to-zero \ --project=${PROJECT_ID} \ --location=${LOCATION} \ --workload-pool=${PROJECT_ID}.Konfigurasi
kubectluntuk berkomunikasi dengan cluster Anda:gcloud container clusters get-credentials scale-to-zero \ --project=${PROJECT_ID} \ --location=${LOCATION}
Membuat resource Pub/Sub
Tutorial ini menggunakan kedalaman antrean Pub/Sub sebagai contoh sumber metrik eksternal.
Untuk membuat topik dan langganan Pub/Sub, ikuti langkah-langkah berikut:
Buat topik Pub/Sub:
gcloud pubsub topics create my-worker-topic \ --project=${PROJECT_ID}Buat langganan yang dilampirkan ke topik:
gcloud pubsub subscriptions create my-worker-subscription \ --topic=my-worker-topic \ --project=${PROJECT_ID}
Menyiapkan Workload Identity Federation for GKE
Konfigurasi Workload Identity Federation for GKE untuk mengizinkan aplikasi pekerja Anda melakukan autentikasi dengan Google Cloud API dan menggunakan pesan dari Pub/Sub.
GKE secara otomatis menangani autentikasi dengan Cloud Monitoring untuk resource AutoscalingMetric dalam project yang sama. Untuk mempelajari lebih lanjut cara menentukan metrik untuk penskalaan otomatis, lihat Mengambil metrik kustom atau eksternal dari Cloud Monitoring.
Untuk mengonfigurasi Workload Identity Federation for GKE untuk workload pekerja Anda, ikuti langkah-langkah berikut:
Buat akun layanan Kubernetes untuk aplikasi pekerja Anda di namespace
default:kubectl create serviceaccount async-worker-sa \ --namespace defaultBerikan peran
roles/pubsub.subscriberke akun layanan Kubernetes agar aplikasi dapat menerima pesan dari langganan Pub/Sub Anda:gcloud projects add-iam-policy-binding projects/${PROJECT_ID} \ --role=roles/pubsub.subscriber \ --member=principal://iam.googleapis.com/projects/${PROJECT_NUMBER}/locations/global/workloadIdentityPools/${PROJECT_ID}./subject/ns/default/sa/async-worker-sa
Untuk mengetahui informasi selengkapnya, lihat Mengonfigurasi aplikasi untuk menggunakan Workload Identity Federation untuk GKE.
Membuat contoh Deployment
Sebelum dapat membuat objek HPA, Anda harus membuat workload yang akan dipantau.
Untuk membuat contoh Deployment, ikuti langkah-langkah berikut:
Simpan manifes berikut sebagai
async-worker.yaml:apiVersion: apps/v1 kind: Deployment metadata: name: async-worker namespace: default spec: replicas: 3 selector: matchLabels: app: async-worker template: metadata: labels: app: async-worker spec: containers: - name: async-worker image: nginx:latest ports: - containerPort: 80 resources: limits: memory: 100Mi requests: cpu: 50m memory: 100MiTerapkan Deployment
async-worker.yaml:kubectl apply -f async-worker.yaml
Mengonfigurasi workload untuk menskalakan ke dan dari nol
Di bagian ini, Anda akan mengonfigurasi Deployment async-worker untuk memperkecil skala ke nol saat antrean Pub/Sub kosong, dan menaikkan skala kembali saat pesan baru tiba.
Buat resource AutoscalingMetric
Untuk menentukan sinyal eksternal yang dipantau oleh GKE, buat resource kustom
AutoscalingMetric. Dalam contoh manifes berikut, kueri metrik meminta Cloud Monitoring untuk mendapatkan jumlah pesan Pub/Sub yang tidak terkirim pada langganan my-worker-subscription.
Untuk membuat resource AutoscalingMetric, ikuti langkah-langkah berikut:
Simpan manifes berikut sebagai file
pubsub-metric.yaml:apiVersion: autoscaling.gke.io/v1beta1 kind: AutoscalingMetric metadata: name: pubsub-queue-depth namespace: default spec: metrics: - promql: name: pubsub-undelivered query: > { "pubsub.googleapis.com/subscription/num_undelivered_messages", subscription_id="my-worker-subscription" }Terapkan manifes
pubsub-metric.yaml:kubectl apply -f pubsub-metric.yamlVerifikasi status metrik dan ambil ID metrik:
kubectl describe autoscalingmetric pubsub-queue-depthDi bagian
Statusoutput, pastikan tidak ada error yang tercantum dan catat nilaiHpa Nameyang ada dalam formatautoscaling.gke.io|CUSTOM_RESOURCE_NAME|METRIC_NAME. Anda akan mereferensikan ID metrik eksternal ini saat membuat objek HorizontalPodAutoscaler di bagian berikutnya. Jika bagianStatusmelaporkan error konfigurasi atau metrik tidak diambil seperti yang diharapkan, lihat Memecahkan masalah metrik yang diambil untuk penskalaan otomatis.
Mengonfigurasi penskalaan otomatis Pod horizontal
Untuk mengonfigurasi perilaku penskalaan otomatis, buat resource HorizontalPodAutoscaler yang menargetkan Deployment.
Untuk mengonfigurasi penskala otomatis Pod horizontal, ikuti langkah-langkah berikut:
Simpan manifes berikut sebagai file
worker-hpa.yaml:apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: async-worker-hpa namespace: default spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: async-worker minReplicas: 0 maxReplicas: 20 metrics: - type: External external: metric: name: autoscaling.gke.io|pubsub-queue-depth|pubsub-undelivered target: type: AverageValue averageValue: "10"Manifes ini mengonfigurasi kolom utama berikut:
minReplicas: 0: mengaktifkan penskalaan hingga nol dengan mengizinkan pengontrol untuk menurunkan skala Deployment menjadi0replika saat permintaan turun menjadi nol.type: External: mengonfigurasi sumber metrik eksternal sehingga HPA dapat memicu penskalaan saat workload memiliki nol Pod.name: autoscaling.gke.io|pubsub-queue-depth|pubsub-undelivered: memetakan HPA secara langsung ke resource AutoscalingMetric yang dibuat pada langkah sebelumnya dengan menggunakan formatautoscaling.gke.io|CUSTOM_RESOURCE_NAME|METRIC_NAMEID.
Terapkan manifes
worker-hpa.yaml:kubectl apply -f worker-hpa.yaml
Memverifikasi perilaku dan kondisi skala nol
Setelah semua pesan dalam langganan Pub/Sub diproses, penskalaan otomatis Pod horizontal akan mengevaluasi permintaan nol dan menurunkan skala Deployment menjadi 0 replika.
Untuk memverifikasi bahwa penskala otomatis Pod horizontal mengaktifkan status nol, periksa kondisi status resource async-worker-hpa
dengan menjalankan perintah berikut:
kubectl describe hpa async-worker-hpa
Outputnya mirip dengan hal berikut ini:
Name: async-worker-hpa
Namespace: default
Reference: Deployment/async-worker
Metrics: ( current / target )
"autoscaling.gke.io|pubsub-queue-depth|pubsub-undelivered" (external metric): 0 / 10
Min replicas: 0
Max replicas: 20
Deployment pods: 0 current / 0 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True SucceededGetScale the HPA controller was able to get the target's current scale
ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from external metric
ScaledToZero True ScaledToZero the HPA has scaled the target resource to 0 replicas due to zero metric demand
Memahami kondisi ScaledToZero
Kondisi ScaledToZero menunjukkan apakah autoscaler Pod horizontal telah menskalakan workload ke nol replika:
ScaledToZero: True(Reason: ScaledToZero): menunjukkan bahwa pengontrol HPA berhasil menskalakan workload Anda ke0replika karena permintaan metrik eksternal turun menjadi nol. HPA tetap aktif (ScalingActive: True) dan terus melakukan polling GKE untuk mendeteksi kapan permintaan workload meningkat.ScaledToZero: False: menunjukkan bahwa workload telah di-scale up ke satu atau beberapa replika.
Jika Anda menskalakan Deployment secara manual ke nol replika, misalnya, dengan perintah kubectl scale --replicas=0, HPA akan menjeda penskalaan otomatis (ScalingActive:
False) untuk mencegah perubahan yang bertentangan. Untuk melanjutkan penskalaan otomatis, skala
deployment kembali ke satu atau beberapa replika (kubectl scale deployment
async-worker --replicas=1).
Untuk skenario pemecahan masalah saat workload gagal diskalakan hingga nol atau gagal peningkatan skala dari nol, lihat Memecahkan masalah penskalaan workload GKE ke dan dari nol menggunakan HPA. Jika Horizontal Pod Autoscaler melaporkan metrik eksternal yang tidak ada atau tidak valid, lihat Memecahkan masalah metrik yang diambil untuk penskalaan otomatis.
Pembersihan
Agar akun Google Cloud Anda tidak dikenai biaya untuk resource yang digunakan dalam tutorial ini, ikuti langkah-langkah berikut:
Hapus cluster GKE:
gcloud container clusters delete scale-to-zero \ --project=${PROJECT_ID} \ --location=${LOCATION}Hapus langganan dan topik Pub/Sub:
gcloud pubsub subscriptions delete my-worker-subscription \ --project=${PROJECT_ID} gcloud pubsub topics delete my-worker-topic \ --project=${PROJECT_ID}
Langkah berikutnya
- Pelajari cara mengurangi latensi cold start dengan menggunakan buffer Kapasitas GKE.
- Pelajari cara mendiagnosis masalah penskalaan saat melakukan penskalaan ke dan dari nol menggunakan HPA.