Dokumen ini menjelaskan cara mengaktifkan penskalaan otomatis pod horizontal (HPA) untuk Google Cloud Managed Service for Prometheus. Anda dapat mengaktifkan HPA dengan melakukan salah satu tindakan berikut:
- Menggunakan library Custom Metrics Stackdriver Adapter, yang dikembangkan dan didukung oleh Google Cloud.
- Menggunakan library Prometheus Adapter pihak ketiga.
Anda harus memilih salah satu pendekatan. Anda tidak dapat menggunakan keduanya karena definisi resource-nya tumpang tindih, seperti yang dijelaskan dalam Pemecahan masalah.
Menggunakan Adaptor Stackdriver Metrik Kustom
Adaptor Stackdriver Metrik Kustom mendukung pembuatan kueri metrik dari Layanan Terkelola untuk Prometheus yang dimulai dari adaptor versi v0.13.1.
Untuk menyiapkan contoh konfigurasi HPA menggunakan Adaptor Stackdriver Metrik Kustom, lakukan langkah berikut:
- Siapkan koleksi terkelola di cluster Anda.
Instal Adaptor Stackdriver Metrik Kustom di cluster Anda.
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml
Deploy contoh pengekspor metrik Prometheus dan resource HPA:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/examples/prometheus-to-sd/custom-metrics-prometheus-sd.yaml
Perintah ini men-deploy aplikasi pengekspor yang memunculkan metrik
foo
dan resource HPA. HPA menskalakan aplikasi ini hingga 5 replika guna mencapai nilai target untuk metrikfoo
.Tentukan resource PodMonitoring dengan menempatkan konfigurasi berikut dalam file bernama
podmonitoring.yaml
.apiVersion: monitoring.googleapis.com/v1 kind: PodMonitoring metadata: name: prom-example spec: selector: matchLabels: run: custom-metric-prometheus-sd endpoints: - port: 8080 interval: 30s
Deploy resource PodMonitoring baru:
kubectl -n default apply -f podmonitoring.yaml
Dalam beberapa menit, Managed Service for Prometheus memproses metrik yang diambil dari pengekspor dan menyimpannya di Cloud Monitoring menggunakan nama formulir yang panjang. Metrik Prometheus disimpan dengan konvensi berikut:
- Awalan
prometheus.googleapis.com
. - Akhiran ini biasanya adalah salah satu dari
gauge
,counter
,summary
, atauhistogram
, meskipun metrik yang tidak berjenis mungkin memiliki akhiranunknown
atauunknown:counter
. Untuk memverifikasi akhiran, cari metrik di Cloud Monitoring menggunakan Metrics Explorer.
- Awalan
Memperbarui HPA yang di-deploy untuk membuat kueri metrik dari Cloud Monitoring. Metrik
foo
diserap sebagaiprometheus.googleapis.com/foo/gauge
. Agar metrik dapat dikueri oleh resource HorizontalPodAutoscaler yang di-deploy, gunakan nama format panjang pada HPA yang di-deploy, tetapi Anda harus mengubahnya dengan mengganti semua garis miring ke depan (/
) dengan karakter pipa (|
):prometheus.googleapis.com|foo|gauge
. Untuk informasi selengkapnya, lihat Metrik yang tersedia dari bagian Stackdriver dalam repositori Adaptor Stackdriver Metrik Kustom.Update HPA yang di-deploy dengan menjalankan perintah berikut:
kubectl edit hpa custom-metric-prometheus-sd
Ubah nilai kolom
pods.metric.name
darifoo
menjadiprometheus.googleapis.com|foo|gauge
. Bagianspec
akan terlihat seperti berikut:spec: maxReplicas: 5 metrics: - pods: metric: name: prometheus.googleapis.com|foo|gauge target: averageValue: "20" type: AverageValue type: Pods minReplicas: 1
Dalam contoh ini, konfigurasi HPA mencari nilai rata-rata metrik
prometheus.googleapis.com/foo/gauge
menjadi20
. Karena Deployment menetapkan nilai metrik adalah40
, pengontrol HPA meningkatkan jumlah pod hingga nilai kolommaxReplicas
(5
) untuk mencoba mengurangi nilai rata-rata metrik di seluruh pod menjadi20
.Kueri HPA mencakup namespace dan cluster tempat resource HPA diinstal, sehingga metrik yang identik di cluster dan namespace lain tidak akan memengaruhi penskalaan otomatis Anda.
Untuk melihat peningkatan skala workload, jalankan perintah berikut:
kubectl get hpa custom-metric-prometheus-sd --watch
Nilai kolom
REPLICAS
berubah dari1
menjadi5
.NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE custom-metric-prometheus-sd Deployment/custom-metric-prometheus-sd 40/20 1 5 5 *
Untuk menurunkan skala deployment, perbarui nilai metrik target agar lebih tinggi dari nilai metrik yang diekspor. Dalam contoh ini, Deployment menetapkan nilai metrik
prometheus.googleapis.com/foo/gauge
ke40
. Jika Anda menetapkan nilai target ke angka yang lebih tinggi dari40
, deployment akan turun skala.Misalnya, gunakan
kubectl edit
untuk mengubah nilai kolompods.target.averageValue
dalam konfigurasi HPA dari20
menjadi100
.kubectl edit hpa custom-metric-prometheus-sd
Ubah bagian spesifikasi agar sesuai dengan yang berikut:
spec: maxReplicas: 5 metrics: - pods: metric: name: prometheus.googleapis.com|foo|gauge target: averageValue: "100" type: AverageValue type: Pods minReplicas: 1
Untuk melihat penurunan skala workload, jalankan perintah berikut:
kubectl get hpa custom-metric-prometheus-sd --watch
Nilai kolom
REPLICAS
berubah dari5
menjadi1
. Secara desain, hal ini terjadi lebih lambat dibandingkan saat meningkatkan jumlah pod:NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE custom-metric-prometheus-sd Deployment/custom-metric-prometheus-sd 40/100 1 5 1 *
Untuk menghapus contoh yang di-deploy, jalankan perintah berikut:
kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter_new_resource_model.yaml kubectl delete -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/examples/prometheus-to-sd/custom-metrics-prometheus-sd.yaml kubectl delete podmonitoring/prom-example
Untuk mengetahui informasi selengkapnya, lihat contoh Prometheus dalam repositori Adaptor Stackdriver Metrik Kustom, atau lihat Penskalaan aplikasi.
Menggunakan Adaptor Prometheus
Konfigurasi prometheus-adapter yang ada dapat digunakan untuk melakukan penskalaan otomatis hanya dengan beberapa perubahan. Mengonfigurasi adaptor prometheus agar dapat diskalakan menggunakan Managed Service for Prometheus memiliki dua batasan tambahan dibandingkan dengan penskalaan menggunakan Prometheus upstream:
Kueri harus dirutekan melalui proxy UI frontend Prometheus, sama seperti saat membuat kueri Google Cloud Managed Service for Prometheus menggunakan Prometheus API atau UI. Untuk adaptor prometheus, Anda perlu mengedit Deployment
prometheus-adapter
untuk mengubah nilaiprometheus-url
sebagai berikut:--prometheus-url=http://frontend.NAMESPACE_NAME.svc:9090/
dengan NAMESPACE_NAME adalah namespace tempat frontend di-deploy.
Anda tidak dapat menggunakan matcher ekspresi reguler pada nama metrik di kolom
.seriesQuery
pada konfigurasi aturan. Sebagai gantinya, Anda harus sepenuhnya menentukan nama metrik.
Karena data memerlukan waktu sedikit lebih lama untuk tersedia dalam Google Cloud Managed Service for Prometheus dibandingkan dengan Prometheus upstream, mengonfigurasi logika penskalaan otomatis yang terlalu cepat dapat menyebabkan perilaku yang tidak diinginkan. Meskipun tidak ada jaminan keaktualan data, data biasanya tersedia untuk kueri 3-7 detik setelah dikirim ke Managed Service for Prometheus, tidak termasuk latensi jaringan.
Semua kueri yang dikeluarkan oleh prometheus-adapter memiliki cakupan global. Artinya,
jika Anda memiliki aplikasi di dua namespace yang menghasilkan metrik bernama identik,
konfigurasi HPA yang menggunakan metrik tersebut diskalakan menggunakan data dari kedua
aplikasi. Sebaiknya selalu gunakan filter namespace
atau cluster
di
PromQL Anda untuk menghindari penskalaan menggunakan data yang salah.
Untuk menyiapkan contoh konfigurasi HPA menggunakan adaptor prometheus dan koleksi terkelola, gunakan langkah-langkah berikut:
- Siapkan koleksi terkelola di cluster Anda.
- Deploy proxy UI frontend Prometheus di cluster Anda. Jika menggunakan Workload Identity, Anda juga harus mengonfigurasi dan mengizinkan akun layanan.
- Deploy manifes di direktori
examples/hpa/
dalam repo prometheus-engine:example-app.yaml
: Contoh deployment dan layanan yang memunculkan metrik.pod-monitoring.yaml
: Resource yang mengonfigurasi scraping metrik contoh.hpa.yaml
: Resource HPA yang mengonfigurasi penskalaan untuk workload Anda.
Pastikan
prometheus-adapter
terinstal di cluster Anda. Hal ini dapat dilakukan dengan men-deploy contoh manifes penginstalan ke cluster Anda. Manifes ini dikonfigurasi untuk:- Buat kueri proxy frontend yang di-deploy di namespace
default
. - Menerbitkan PromQL untuk menghitung dan menampilkan metrik
http_requests_per_second
dari contoh deployment.
- Buat kueri proxy frontend yang di-deploy di namespace
Jalankan perintah berikut, masing-masing dalam sesi terminal yang terpisah:
- Buat pemuatan HTTP terhadap layanan
prometheus-example-app
:kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://prometheus-example-app; done"
- Lihat penskalaan otomatis pod horizontal:
kubectl get hpa prometheus-example-app --watch
- Tonton peningkatan skala workload:
kubectl get po -lapp.kubernetes.io/name=prometheus-example-app --watch
- Buat pemuatan HTTP terhadap layanan
Hentikan pembuatan beban HTTP menggunakan Ctrl+C dan amati penurunan skala beban kerja.
Pemecahan masalah
Custom Metrics Adaptor Stackdriver menggunakan definisi resource dengan nama yang sama seperti yang ada di Adaptor Prometheus, prometheus-adapter. Nama tumpang-tindih ini berarti menjalankan lebih dari satu adaptor dalam cluster yang sama menyebabkan error.
Menginstal Adaptor Prometheus di cluster yang sebelumnya telah menginstal Adaptor Stackdriver Metrik Kustom dapat menampilkan error seperti FailedGetObjectMetric
karena nama yang tumpang-tindih. Untuk mengatasi hal ini, Anda mungkin harus
menghapus apiservices v1beta1.external.metrics.k8s.io
,
v1beta1.custom.metrics.k8s.io
, dan v1beta2.custom.metrics.k8s.io
yang sebelumnya didaftarkan oleh Custom Metrics Adapter.
Tips pemecahan masalah:
Beberapa metrik sistem Cloud Monitoring seperti metrik Pub/Sub tertunda selama 60 detik atau lebih. Karena Prometheus Adaptor mengeksekusi kueri menggunakan stempel waktu saat ini, membuat kueri metrik tersebut menggunakan Adaptor Prometheus mungkin secara keliru tidak menghasilkan data apa pun. Untuk membuat kueri metrik tertunda, gunakan pengubah
offset
di PromQL untuk mengubah offset waktu kueri dengan jumlah yang diperlukan.Untuk memverifikasi bahwa proxy UI frontend berfungsi sebagaimana yang diharapkan dan tidak ada masalah dengan izin, jalankan perintah berikut di terminal:
kubectl -n NAMESPACE_NAME port-forward svc/frontend 9090
Selanjutnya, buka terminal lain dan jalankan perintah berikut:
curl --silent 'localhost:9090/api/v1/series?match%5B%5D=up'
Jika proxy UI frontend berfungsi dengan baik, respons di terminal kedua akan serupa dengan yang berikut:
curl --silent 'localhost:9090/api/v1/series?match%5B%5D=up' | jq . { "status": "success", "data": [ ... ] }
Jika Anda menerima error 403, berarti proxy UI frontend tidak dikonfigurasi dengan benar. Untuk mengetahui informasi tentang cara mengatasi error 403, lihat panduan mengonfigurasi dan mengizinkan akun layanan.
Untuk memverifikasi bahwa custom metrics apiserver tersedia, jalankan perintah berikut:
kubectl get apiservices.apiregistration.k8s.io v1beta1.custom.metrics.k8s.io
Jika apiserver tersedia, responsnya akan serupa dengan berikut ini:
$ kubectl get apiservices.apiregistration.k8s.io v1beta1.custom.metrics.k8s.io NAME SERVICE AVAILABLE AGE v1beta1.custom.metrics.k8s.io monitoring/prometheus-adapter True 33m
Untuk memastikan HPA Anda berfungsi sebagaimana mestinya, jalankan perintah berikut:
$ kubectl describe hpa prometheus-example-app Name: prometheus-example-app Namespace: default Labels:
Annotations: Reference: Deployment/prometheus-example-app Metrics: ( current / target ) "http_requests_per_second" on pods: 11500m / 10 Min replicas: 1 Max replicas: 10 Deployment pods: 2 current / 2 desired Conditions: Type Status Reason Message ---- ------ ------ ------- AbleToScale True ReadyForNewScale recommended size matches current size ScalingActive True ValidMetricFound the HPA was able to successfully calculate a replica count from pods metric http_requests_per_second ScalingLimited False DesiredWithinRange the desired count is within the acceptable range Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal SuccessfulRescale 47s horizontal-pod-autoscaler New size: 2; reason: pods metric http_requests_per_second above target Jika respons berisi pernyataan seperti
FailedGetPodsMetric
, berarti HPA akan gagal. Berikut adalah ilustrasi respons terhadap panggilandescribe
saat HPA gagal:$ kubectl describe hpa prometheus-example-app Name: prometheus-example-app Namespace: default Reference: Deployment/prometheus-example-app Metrics: ( current / target ) "http_requests_per_second" on pods:
/ 10 Min replicas: 1 Max replicas: 10 Deployment pods: 1 current / 1 desired Conditions: Type Status Reason Message ---- ------ ------ ------- AbleToScale True ReadyForNewScale recommended size matches current size ScalingActive False FailedGetPodsMetric the HPA was unable to compute the replica count: unable to get metric http_requests_per_second: unable to fetch metrics from custom metrics API: the server could not find the metric http_requests_per_second for pods ScalingLimited False DesiredWithinRange the desired count is within the acceptable range Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedGetPodsMetric 104s (x11 over 16m) horizontal-pod-autoscaler unable to get metric http_requests_per_second: unable to fetch metrics from custom metrics API: the server could not find the metric http_requests_per_second for pods Saat HPA gagal, pastikan Anda membuat metrik dengan
load-generator
. Anda dapat memeriksa Custom Metrics API secara langsung, dengan perintah:kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | jq .
Output yang berhasil akan terlihat seperti di bawah ini:
$ kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | jq . { "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "custom.metrics.k8s.io/v1beta1", "resources": [ { "name": "namespaces/http_requests_per_second", "singularName": "", "namespaced": false, "kind": "MetricValueList", "verbs": [ "get" ] }, { "name": "pods/http_requests_per_second", "singularName": "", "namespaced": true, "kind": "MetricValueList", "verbs": [ "get" ] } ] }
Jika tidak ada metrik, tidak akan ada data di bagian
"resources"
dalam output, misalnya:kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | jq . { "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "custom.metrics.k8s.io/v1beta1", "resources": [] }