Secara default, HPA mendukung metrik CPU dan memori, yang mungkin tidak mencakup skenario yang lebih kompleks. Topik ini menjelaskan cara mengonversi Custom Metrics dan External Metrics dari Managed Service for Prometheus menjadi metrik yang kompatibel dengan HPA serta mengonfigurasi autoscaling untuk skala keluar dan skala-masuk yang lebih fleksibel.
Cara kerja
Data mengalir melalui tiga lapisan:
-
Prometheus Service mengumpulkan metrik dari workload dan infrastruktur Anda.
-
ack-alibaba-cloud-metrics-adapter membaca metrik Prometheus, mengubahnya berdasarkan aturan yang dapat dikonfigurasi, dan mengeksposnya melalui Kubernetes Custom Metrics API (
custom.metrics.k8s.io) atau External Metrics API (external.metrics.k8s.io). -
HPA secara berkala mengkueri adapter dan menyesuaikan jumlah replika workload target.
Tersedia dua jenis metrik:
-
Custom Metric: Metrik yang cakupannya terbatas pada objek Kubernetes, seperti pod. Gunakan untuk penskalaan per-pod (misalnya, working set memori atau laju permintaan).
-
External Metric: Metrik yang tidak terikat pada objek Kubernetes. Gunakan untuk penskalaan global, seperti total permintaan per detik (QPS) di seluruh pod.
Jika memungkinkan, lebih baik gunakan Custom Metrics daripada External Metrics. API Custom Metrics lebih mudah diamankan oleh administrator; API External Metrics dapat mengekspos metrik Prometheus apa pun.
Prasyarat
-
Komponen pemantauan Prometheus telah diterapkan. Lihat Hubungkan ke dan konfigurasikan Prometheus Service.
-
Add-on ack-alibaba-cloud-metrics-adapter telah diterapkan. Lihat Instal ack-alibaba-cloud-metrics-adapter.
-
Add-on ack-arms-prometheus telah diperbarui ke versi terbaru. Untuk memperbarui, buka Components and Add-ons di konsol ACK. Lihat Pembaruan komponen dan catatan rilis.
Untuk menerapkan ack-alibaba-cloud-metrics-adapter, login ke Konsol ACK dan buka Marketplace > Marketplace.
Langkah 1: Dapatkan data pemantauan Prometheus
Opsi A: Gunakan metrik bawaan ACK
Prometheus Service diinstal secara default di ACK dan mengumpulkan metrik termasuk:
-
Metrik kontainer cAdvisor
-
Metrik infrastruktur Node Exporter
-
Metrik GPU Exporter
-
Metrik tambahan apa pun yang telah Anda hubungkan ke Prometheus Service
Untuk melihat semua metrik yang terhubung:
-
Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, pilih Operations > Prometheus Monitoring.
-
Di pojok kanan atas, klik Alert Settings . Jika tautan tersebut tidak muncul, perbarui Managed Service for Prometheus ke versi terbaru. Lihat Prasyarat.
-
Di konsol Prometheus Service, klik Settings di panel navigasi kiri untuk melihat semua metrik yang terhubung.
Opsi B: Ekspos metrik kustom dari pod
Jika aplikasi Anda mengekspos metrik dalam format Prometheus, ambil metrik tersebut dengan ServiceMonitor. Contoh ini menerapkan aplikasi sampel yang mengekspos http_requests_total dan mengonfigurasi pengambilan metrik.
Terapkan aplikasi sampel
-
Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Deployments.
-
Di halaman Deployments, klik Create from YAML. Di halaman Create from YAML, atur Sample Template ke Custom, tempel YAML berikut, lalu klik Create.
Tambahkan ServiceMonitor
-
Login ke Application Real-Time Monitoring Service (ARMS) console.
-
Di panel navigasi kiri, klik Integration Management. Di halaman Integration Management, pada tab Integrated Environments, pilih Region Anda dan klik lingkungan yang sesuai dengan kluster Anda.
-
Di halaman lingkungan kontainer, klik tab Metric Scraping . Di panel navigasi kiri, klik Service Monitor , lalu klik Create . Di panel Add ServiceMonitor Configuration, klik YAML, tempel YAML berikut, lalu ikuti petunjuk di layar untuk membuat ServiceMonitor.
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: annotations: arms.prometheus.io/discovery: 'true' name: sample-app namespace: default spec: endpoints: - interval: 30s port: http path: /metrics namespaceSelector: any: true selector: matchLabels: app: sample-app
Verifikasi status pemantauan
-
Klik tab Self-Monitoring. Di tab Targets, pastikan
default/sample-app/0(1/1 up)ditampilkan. Hal ini mengonfirmasi bahwa Prometheus sedang mengambil metrik dari aplikasi. -
Di dasbor Prometheus, kueri
http_requests_totaluntuk memastikan data mengalir.
Langkah 2: Konfigurasikan ack-alibaba-cloud-metrics-adapter
Adapter mengonversi metrik Prometheus menjadi metrik yang dapat dibaca HPA melalui empat operasi per aturan: discovery, association, naming, dan querying. Bagian-bagian berikut membangun aturan lengkap secara bertahap.
Perbarui konfigurasi adapter
-
Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Klik nama kluster Anda. Di panel navigasi kiri, klik Applications > Helm.
-
Temukan ack-alibaba-cloud-metrics-adapter dan klik Update di kolom Actions.
-
Di panel Update Release, perbarui YAML dengan konfigurasi Anda dan klik OK.
Tabel berikut mencantumkan bidang utama adapter. Untuk referensi lengkap, lihat Referensi konfigurasi adapter.
|
Field |
Description |
|
|
Aturan konversi metrik. Ubah agar sesuai dengan contoh di atas. |
|
|
URL permintaan Prometheus. Lihat Dapatkan URL permintaan data Prometheus. |
|
|
Header autentikasi. Prometheus V1 (jika autentikasi token diaktifkan): gunakan |
|
|
Atur ke |
Verifikasi adapter berfungsi
Jalankan perintah berikut untuk memastikan adapter mengekspos metrik melalui Kubernetes aggregation API.
Periksa Custom Metrics:
# Daftar semua Custom Metrics yang tersedia
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | jq .
# Kueri container_memory_working_set_bytes_per_second untuk pod di kube-system
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_memory_working_set_bytes_per_second" | jq .
# Kueri container_cpu_usage_core_per_second untuk pod di kube-system
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_cpu_usage_core_per_second" | jq .
Respons yang berhasil terlihat seperti:
{
"kind": "MetricValueList",
"apiVersion": "custom.metrics.k8s.io/v1beta1",
"metadata": {
"selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/%2A/container_cpu_usage_core_per_second"
},
"items": [
{
"describedObject": {
"kind": "Pod",
"namespace": "kube-system",
"name": "ack-cost-exporter-7f44d55c66-cgtz7",
"apiVersion": "/v1"
},
"metricName": "container_cpu_usage_core_per_second",
"timestamp": "2025-12-30T03:30:21Z",
"value": "4m",
"selector": null
}
]
}
Respons ini mengonfirmasi bahwa adapter telah menemukan dan mengaitkan metrik dengan pod yang benar. Larik items mencantumkan satu entri per pod. Bidang value menggunakan akhiran m (satuan mili), sehingga 4m berarti 0,004 core CPU per detik.
Periksa Metrik Eksternal:
# Daftar semua External Metrics yang tersedia
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/" | jq .
# Kueri http_requests_per_second di namespace default
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/http_requests_per_second" | jq .
Respons yang berhasil terlihat seperti:
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "http_requests_per_second",
"metricLabels": {},
"timestamp": "2025-12-30T03:29:40Z",
"value": "328m"
}
]
}
Berbeda dengan Custom Metrics, respons External Metrics berisi satu nilai agregat (bukan per pod) karena metrik tersebut tidak dibatasi cakupannya pada objek Kubernetes.
Langkah 3: Terapkan HPA
Adapter mengekspos Custom Metrics dan External Metrics. Pilih jenis yang sesuai dengan strategi penskalaan Anda.
Custom Metrics
Gunakan Custom Metrics untuk menskalakan berdasarkan pengukuran per-pod.
-
Buat
hpa.yamldengan konten berikut.Podshanya mendukung targetAverageValue. HPA membagi total nilai metrik di seluruh pod dan membandingkannya denganaverageValueuntuk memutuskan apakah akan menskalakan.kind: HorizontalPodAutoscaler apiVersion: autoscaling/v2 metadata: name: sample-app-memory-high spec: scaleTargetRef: # Workload yang dikendalikan HPA. apiVersion: apps/v1 kind: Deployment name: sample-app minReplicas: 1 maxReplicas: 10 metrics: - type: Pods pods: metric: name: container_memory_working_set_bytes_per_second target: type: AverageValue averageValue: 1024000m # Target: rata-rata 1 KB/s per pod. # Satuannya adalah byte/s. Kubernetes menggunakan 'm' untuk satuan mili: # 1024000m = 1024 byte = 1 KB. -
Terapkan HPA.
kubectl apply -f hpa.yaml -
Jalankan uji stres untuk memicu penskalaan. Pertama, ekspos Service sample-app melalui instance Server Load Balancer (SLB).
ab -c 50 -n 2000 http://<EXTERNAL-IP>:8080/ -
Periksa status HPA.
kubectl get hpa sample-app-memory-highOutput yang diharapkan:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-app-memory-high Deployment/sample-app 40886272/1024 1 10 1 22sKolom
TARGETSmenampilkancurrent/desired. Saat nilai saat ini melebihi ambang batas, HPA akan menambah pod.
External Metrics
Gunakan External Metrics untuk menskalakan berdasarkan pengukuran global yang tidak terikat pada pod individual.
-
Buat
hpa.yamldengan konten berikut.Externalmendukung baik targetValuemaupunAverageValue.apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: sample-app spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-app minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metric: name: http_requests_per_second selector: matchLabels: job: "sample-app" target: type: AverageValue averageValue: 500m # Target: rata-rata 0,5 permintaan/s per pod. -
Terapkan HPA.
kubectl apply -f hpa.yaml -
Jalankan uji stres (sama seperti pada tab Custom Metrics, menggunakan
<EXTERNAL-IP>dari Servicesample-app).ab -c 50 -n 2000 http://<EXTERNAL-IP>:8080/ -
Periksa status HPA.
kubectl get hpa sample-appOutput yang diharapkan:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-app Deployment/sample-app 33m/500m 1 10 1 7m
Referensi konfigurasi adapter
Adapter mengonversi metrik Prometheus menjadi metrik yang kompatibel dengan HPA melalui empat bidang: seriesQuery, resources, name, dan metricsQuery. Bagian-bagian berikut membangun aturan lengkap yang mengonversi http_requests_total menjadi http_requests_per_second.
Variabel templat di metricsQuery
Bidang metricsQuery adalah templat Go, bukan PromQL biasa. Adapter mengisinya dengan nilai dari permintaan HPA sebelum mengkueri Prometheus. Pembatasnya adalah << dan >> (bukan {{ dan }}) untuk menghindari konflik dengan sintaks PromQL.
|
Variable |
Populated with |
|
|
Nama metrik Prometheus dari |
|
|
Pemilih label dari permintaan HPA, misalnya |
|
|
Label resource Kubernetes yang digunakan untuk mengelompokkan hasil, misalnya |
Discovery
seriesQuery menentukan metrik Prometheus mana yang akan dikonversi dan menerima pemilih PromQL yang valid, termasuk filter label.
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
Filter label namespace!="" dan pod!="" membatasi metrik hanya pada pod yang memiliki kedua label tersebut, yang merupakan persyaratan untuk asosiasi resource pada langkah berikutnya.
Untuk mempersempit seri yang cocok, tambahkan blok seriesFilters:
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
seriesFilters:
- isNot: "^container_.*_seconds_total"
seriesFilters menerima dua operator:
-
is:<regex>: hanya menyimpan seri yang namanya cocok dengan regex. -
isNot:<regex>: mengecualikan seri yang namanya cocok dengan regex.
Association
resources.overrides memetakan nama label Prometheus ke resource API Kubernetes. Ini memberi tahu adapter label mana yang harus dicocokkan saat HPA meminta metrik untuk pod atau namespace tertentu.
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
Kunci (namespace, pod) adalah nama label Prometheus. Nilai ("namespace", "pod") adalah jenis resource API Kubernetes, seperti yang tercantum di kubectl api-resources -o wide. Setiap kunci harus ada sebagai label dalam data Prometheus Anda.
Naming
name mengonversi nama metrik Prometheus menjadi nama metrik HPA menggunakan ekspresi reguler. Nama metrik Prometheus asli tetap tidak berubah.
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "^(.*)_total"
as: "${1}_per_second"
matches adalah regex yang menangkap bagian dari nama metrik Prometheus. as menentukan nama metrik HPA, menggunakan ${1} untuk mereferensikan grup tangkapan pertama. Di sini, http_requests_total menjadi http_requests_per_second.
Untuk External Metrics, konversi huruf kapital dalam nama metrik Prometheus menjadi huruf kecil dalam nama metrik HPA.
Untuk mencantumkan semua nama metrik HPA yang tersedia:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
Querying
metricsQuery menentukan ekspresi PromQL yang dikirim adapter ke Prometheus setelah mengganti variabel templat.
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: "^(.*)_total"
as: "${1}_per_second"
metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)'
Pemilih label dimetricsQuerydisisipkan melalui<<.LabelMatchers>>saat kueri dan tidak mewarisi filter dariseriesQuery.
Dapatkan URL permintaan data Prometheus
Alibaba Cloud Prometheus Service
-
Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
-
Klik nama kluster Anda. Di panel navigasi kiri, pilih Operations > Prometheus Monitoring.
-
Di pojok kanan atas, klik Alert Settings . Jika tautan tersebut tidak muncul, perbarui ack-arms-prometheus ke versi terbaru. Lihat Prasyarat.
-
Di konsol Prometheus Service, klik Settings > Settings untuk menemukan HTTP API Address (Grafana Read URL) . Gunakan alamat Internal Network jika tersedia; jika tidak, gunakan alamat Internet.

-
Konfigurasikan autentikasi untuk versi Prometheus Anda.
-
Prometheus V1 (autentikasi token dinonaktifkan secara default): Jika diaktifkan, salin token dari konsol Prometheus dan konfigurasikan adapter.

prometheus: prometheusHeader: - Authorization: {Token} -
Prometheus V2 (autentikasi AccessKey diaktifkan secara default): Jika akses bebas password tidak diaktifkan, encode AccessKey ID dan Rahasia AccessKey Anda dalam Base64.
-
Hasilkan string yang diencode Base64.
Gabungkan AccessKey ID dan Rahasia AccessKey Anda sebagai
AccessKey:AccessSecret, lalu encode Base64:echo -n 'accessKey:secretKey' | base64 -
Konfigurasikan komponen.
Masukkan string yang dihasilkan dalam format
Basic <encoded string>ke bidangAuthorizationdariprometheusHeader.... prometheus: prometheusHeader: - Authorization: Basic YWxxxxeQ== ...
-
-
Prometheus open source
Untuk Prometheus yang dikelola sendiri, ekspos API-nya melalui Service Kubernetes dan atur URL Service tersebut di konfigurasi adapter.
Contoh ini menggunakan chart Helm ack-prometheus-operator dari Marketplace ACK. Lihat Pemantauan Prometheus open source.
-
Terapkan ack-prometheus-operator.
-
Login ke Konsol ACK. Di panel navigasi kiri, pilih Marketplace > Marketplace.
-
Cari ack-prometheus-operator, klik kartunya, lalu klik Deploy.
-
Pilih Cluster dan Namespace, atur Release Name, lalu klik Next. Sesuaikan Parameters sesuai kebutuhan dan klik OK.
-
-
Verifikasi penerapan.
-
Ekspos API Prometheus melalui Service. Contoh ini menggunakan Service
ack-prometheus-operator-prometheus. -
Di browser, buka
ServiceIP:9090. Untuk akses publik, ekspos Service melalui instance SLB. -
Di konsol Prometheus, klik Status > Targets untuk melihat semua job pengambilan.
Jika semua job menunjukkan State UP, pengambilan berfungsi dengan benar. 
-
Catat nama Service dan namespace dari kolom Labels. Di sini, Service-nya adalah
ack-prometheus-operator-prometheusdi namespacemonitoring.
-
-
Atur URL Prometheus di adapter. Untuk akses internal:
AlibabaCloudMetricsAdapter: prometheus: enabled: true url: http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090Untuk akses publik:
AlibabaCloudMetricsAdapter: prometheus: enabled: true url: http://your_domain.com:9090 # Ganti dengan alamat IP publik atau domain Anda.
Untuk menambahkan sumber data Prometheus, lihat Tambahkan sumber data Prometheus di Grafana.
Langkah selanjutnya
-
Untuk menskalakan berdasarkan metrik eksternal seperti laju permintaan HTTP atau QPS Ingress, lihat Horizontal pod autoscaling berdasarkan metrik komponen Alibaba Cloud.
-
Untuk menskalakan beberapa aplikasi menggunakan metrik traffic Nginx Ingress, lihat Skala horizontal beberapa aplikasi berdasarkan metrik traffic Nginx Ingress.