Metrik CPU dan memori tidak selalu mencerminkan beban aplikasi yang sebenarnya. Ketika sinyal penskalaan Anda berada di tingkat bisnis—seperti jumlah permintaan HTTP per detik (RPS) atau kedalaman antrian pesan—metrik kustom memberikan pemicu yang lebih akurat. Panduan ini menjelaskan cara mengonfigurasi AdvancedHorizontalPodAutoscaler (AHPA) dengan komponen ack-alibaba-cloud-metrics-adapter untuk melakukan autoscale pada deployment berdasarkan metrik yang diambil dari Prometheus.
AHPA menggunakan Kubernetes External Metrics API, yang memungkinkannya mengkueri metrik apa pun yang tersedia di instans Prometheus Anda—tidak hanya metrik tingkat pod. Dibandingkan dengan metrik kustom HPA standar (tipe Pods/Object), External Metrics menawarkan fleksibilitas yang lebih luas. Gunakan External Metrics ketika sinyal penskalaan Anda berasal dari layanan pemantauan seperti Managed Service for Prometheus.
Prasyarat
Sebelum memulai, pastikan Anda telah:
Memiliki kluster ACK dengan Managed Service for Prometheus yang diaktifkan
Langkah 1: Deploy aplikasi contoh dan konfigurasikan pengambilan metrik
Langkah ini mendeploy aplikasi contoh yang mengekspos metrik requests_per_second ke Prometheus serta generator beban, lalu mengonfigurasi Prometheus untuk mengambilnya.
Deploy aplikasi dan generator beban
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Deployments.
Pada halaman Deployments, klik Create from YAML. Tempel YAML berikut, lalu klik Create. Ini akan mendeploy:
sample-app: server yang mengekspos metrikrequests_per_seconddi/metricspada port 8080fib-loader-qps: generator beban yang mengirim traffic kesample-app
apiVersion: apps/v1 kind: Deployment metadata: name: sample-app labels: app: sample-app spec: replicas: 1 selector: matchLabels: app: sample-app template: metadata: labels: app: sample-app spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/acs/knative-sample-fib-server:v1 name: metrics-provider ports: - name: http containerPort: 8080 --- apiVersion: v1 kind: Service metadata: name: sample-app namespace: default labels: app: sample-app spec: ports: - port: 8080 name: http protocol: TCP targetPort: 8080 selector: app: sample-app type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: fib-loader-qps namespace: default spec: progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: fib-loader-qps strategy: rollingUpdate: maxSurge: 25% maxUnavailable: 25% type: RollingUpdate template: metadata: creationTimestamp: null labels: app: fib-loader-qps spec: containers: - args: - -c - | /ko-app/fib-loader --service-url="http://sample-app.${NAMESPACE}:8080/" --save-path=/tmp/fib-loader-chart.html command: - sh env: - name: NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace image: registry.cn-huhehaote.aliyuncs.com/kubeway/knative-sample-fib-loader:20201126-110434 imagePullPolicy: IfNotPresent name: loader ports: - containerPort: 8090 name: chart protocol: TCP
Aktifkan ServiceMonitor di ARMS
Masuk ke Konsol ARMS. Di panel navigasi kiri, klik Integration Management.
Pada tab Integrated Environments, klik tab Container Service. Temukan instans ACK Anda dan klik Metric Scraping di kolom Actions.
Pada halaman Metric Collection, klik tab Service Monitor. Temukan
sample-app, klik Enable di kolom Actions, lalu konfirmasi.
Langkah 2: Deploy adapter metrik
Adapter metrik menjembatani Managed Service for Prometheus ke Kubernetes External Metrics API sehingga AHPA dapat mengkueri metrik kustom Anda.
Dapatkan titik akhir internal Prometheus
Masuk ke Konsol ARMS. Di panel navigasi kiri, pilih Managed Service for Prometheus > Instances.
Pada halaman Prometheus Instances, pilih wilayah instans Anda dan klik nama instans tersebut. Nama instans mengikuti format
arms_metrics_{RegionId}_XXX.Di bilah navigasi kiri, klik Settings. Di bawah HTTP API Address (Grafana Read Address), salin URL Internal network.
Jika autentikasi berbasis token diaktifkan untuk instans Anda, salin juga token aksesnya.

Instal ack-alibaba-cloud-metrics-adapter
Di Konsol ACK, klik Marketplace > Marketplace di panel navigasi kiri.
Klik tab App Catalog, cari
ack-alibaba-cloud-metrics-adapter, lalu klik Deploy di pojok kanan atas.Pada halaman Basic Information, pilih Cluster dan Namespace Anda, lalu klik Next.
Pada wizard Parameter Configuration, pilih Chart Version. Di area Parameters, atur nilai berikut, lalu klik OK.
Parameter Wajib Deskripsi prometheus.urlYa URL jaringan internal instans Managed Service for Prometheus prometheus.prometheusHeaderTidak Header otorisasi untuk autentikasi berbasis token. Biarkan kosong jika autentikasi tidak diaktifkan. prometheus: enabled: true # Wajib: URL jaringan internal Managed Service for Prometheus url: http://cn-beijing-intranet.arms.aliyuncs.com:9090/api/v1/prometheus/<instance-id>/<uid>/<cluster-id>/<region> # Wajib hanya jika autentikasi berbasis token diaktifkan prometheusHeader: - Authorization: <your-access-token>
Konfigurasikan metrik kustom
Di Konsol ACK, klik Applications > Helm di panel navigasi kiri. Temukan alibaba-cloud-metrics-adapter dan klik Update di kolom Actions.
Salin konten YAML berikut dan tempelkan untuk menimpa parameter terkait dalam templat. Perhatikan bahwa parameter
requests_per_secondharus diubah menjadi nama metrik Prometheus yang sebenarnya. Lalu, klik Update.Berikut adalah cuplikan konfigurasi parsial. Tempelkan untuk menimpa parameter terkait dalam templat yang ada; jangan mengganti seluruh file values Helm.
Parameter Wajib Deskripsi seriesQueryYa Nama metrik di Prometheus. Harus sesuai persis. name.asYa Nama yang diekspos melalui External Metrics API. AHPA mereferensikan nama ini. metricsQueryYa Agregasi PromQL yang diterapkan saat AHPA mengkueri metrik. enabledYa Atur ke trueuntuk mengaktifkan adapter Prometheus....... prometheus: adapter: rules: custom: - metricsQuery: sum(<<.Series>>{<<.LabelMatchers>>}) name: as: requests_per_second # Nama yang diekspos ke External Metrics API resources: overrides: namespace: resource: namespace seriesQuery: requests_per_second # Harus sesuai dengan nama metrik di Prometheus default: false enabled: true # Atur ke true untuk mengaktifkan adapter Prometheus ......Verifikasi metrik tersedia melalui External Metrics API:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/requests_per_second"Output yang diharapkan:
{"kind":"ExternalMetricValueList","apiVersion":"external.metrics.k8s.io/v1beta1","metadata":{},"items":[{"metricName":"requests_per_second","metricLabels":{},"timestamp":"2023-08-15T07:59:09Z","value":"10"}]}Jika metrik muncul dalam respons, adapter telah dikonfigurasi dengan benar.
Langkah 3: Buat resource AHPA
Dengan External Metrics API yang sudah mengembalikan data, buat resource AHPA untuk melakukan autoscale sample-app berdasarkan requests_per_second.
Terapkan YAML berikut. Sesuaikan nama metrik, ambang batas
averageValue, danminReplicas/maxReplicasagar sesuai dengan workload Anda.Contoh ini mengatur
minReplicas: 0, yang memungkinkan AHPA menskalakan deployment hingga nol. Penskalaan dari nol ke satu replika memerlukan nilai metrik melebihi ambang batasaverageValue. Saat deployment diskalakan ke nol, AHPA bertanggung jawab atas transisi dari 0 ke 1. Setelah setidaknya satu replika berjalan, logika penskalaan standar (1 ke N replika) berlaku berdasarkan ambang batasaverageValue.Parameter Deskripsi metrics[].external.metric.nameHarus sesuai dengan nilai name.asdalam konfigurasi adapter.target.averageValueAmbang batas pemicu per pod. Lakukan scale out saat metrik melebihi nilai ini. prediction.quantilePersentil prakiraan metrik historis yang digunakan untuk penskalaan proaktif. prediction.scaleUpForwardHitungan detik untuk melakukan penskalaan sebelum lonjakan lalu lintas yang diprediksi. scaleStrategyAtur ke observeruntuk memungkinkan AHPA mengamati dan melaporkan tanpa menegakkan keputusan penskalaan.instanceBoundsPenggantian min/maks replika berbasis waktu menggunakan ekspresi cron. apiVersion: autoscaling.alibabacloud.com/v1beta1 kind: AdvancedHorizontalPodAutoscaler metadata: name: customer-deployment namespace: default spec: metrics: - external: metric: name: requests_per_second # Harus sesuai dengan name.as dalam konfigurasi adapter selector: matchLabels: namespace: default service: sample-app target: type: AverageValue averageValue: 10 # Lakukan scale out saat RPS rata-rata per pod melebihi 10 type: External minReplicas: 0 maxReplicas: 50 prediction: quantile: 95 # Gunakan prakiraan persentil ke-95 untuk penskalaan proaktif scaleUpForward: 180 # Lakukan pre-scale 180 detik sebelum lonjakan permintaan diprediksi scaleStrategy: observer scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-app instanceBounds: - startTime: "2023-08-01 00:00:00" endTime: "2033-08-01 00:00:00" bounds: - cron: "* 0-8 ? * MON-FRI" maxReplicas: 50 minReplicas: 4 - cron: "* 9-15 ? * MON-FRI" maxReplicas: 50 minReplicas: 5 - cron: "* 16-23 ? * MON-FRI" maxReplicas: 50 minReplicas: 1Verifikasi bahwa AHPA melakukan penskalaan dengan benar:
kubectl get ahpaOutput yang diharapkan:
NAME STRATEGY REFERENCE METRIC TARGETS DESIREDPODS REPLICAS MINPODS MAXPODS AGE customer-deployment observer Deployment/sample-app requests_per_second 60000m/10 6 1 1 50 7h53mKubernetes menyatakan nilai metrik dalam satuan milli (m) untuk presisi. Pada contoh ini,
60000msama dengan 60 permintaan per detik. Dengan ambang batas 10, AHPA menghitungDESIREDPODSsebesar 6 (60 / 10).
Pemecahan masalah penskalaan AHPA
Jika AHPA tidak melakukan penskalaan seperti yang diharapkan, periksa kondisi statusnya:
kubectl describe ahpa customer-deploymentPeriksa bagian Conditions pada output. Bidang utama:
| Bidang | Yang perlu diperiksa |
|---|---|
AbleToScale | Apakah AHPA dapat mengeluarkan keputusan penskalaan. Nilai False menunjukkan adanya masalah pada controller atau izin. |
ScalingActive | Apakah AHPA berhasil mengambil metrik. Nilai False biasanya berarti External Metrics API tidak mengembalikan data. |
ScalingLimited | Apakah jumlah replika saat ini dibatasi oleh minReplicas, maxReplicas, atau instanceBounds. |
Jika ScalingActive bernilai False, jalankan kembali perintah verifikasi dari Langkah 2 untuk memastikan metrik tersedia:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/requests_per_second"Langkah selanjutnya
Untuk beralih dari mode
observerke autoscaling aktif, ubahscaleStrategymenjadi strategi penskalaan dan hapus pengaturanobserver.Untuk menerapkan pola ini ke metrik lain, perbarui
seriesQuerydanname.asdalam konfigurasi adapter, lalu perbaruimetrics[].external.metric.namedalam resource AHPA agar sesuai.