All Products
Search
Document Center

Container Service for Kubernetes:Konfigurasikan horizontal pod autoscaling dengan metrik Prometheus

Last Updated:Aug 21, 2026

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:

  1. Prometheus Service mengumpulkan metrik dari workload dan infrastruktur Anda.

  2. 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).

  3. 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

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:

  1. Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, pilih Operations > Prometheus Monitoring.

  3. Di pojok kanan atas, klik Alert Settings . Jika tautan tersebut tidak muncul, perbarui Managed Service for Prometheus ke versi terbaru. Lihat Prasyarat.

  4. 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

  1. Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Di halaman Clusters, klik nama kluster Anda. Di panel navigasi kiri, klik Workloads > Deployments.

  3. Di halaman Deployments, klik Create from YAML. Di halaman Create from YAML, atur Sample Template ke Custom, tempel YAML berikut, lalu klik Create.

    Detail YAML

    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.ack.aliyuncs.com/acs/autoscale-demo:v0.1.2-dfbc5fd-aliyun
            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

Tambahkan ServiceMonitor

  1. Login ke Application Real-Time Monitoring Service (ARMS) console.

  2. 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.

  3. 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

  1. 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.

  2. Di dasbor Prometheus, kueri http_requests_total untuk 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

  1. Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Klik nama kluster Anda. Di panel navigasi kiri, klik Applications > Helm.

  3. Temukan ack-alibaba-cloud-metrics-adapter dan klik Update di kolom Actions.

  4. Di panel Update Release, perbarui YAML dengan konfigurasi Anda dan klik OK.

    Detail YAML

    AlibabaCloudMetricsAdapter:
    ......
      prometheus:
        enabled: true    # Aktifkan adapter Prometheus.
        # URL permintaan data Prometheus Service. Lihat "Dapatkan URL permintaan data Prometheus" di bawah.
        url: https://cn-beijing.arms.aliyuncs.com:9443/api/v1/prometheus/xxxx/xxxx/xxxx/cn-beijing
        # Prometheus V1 dengan autentikasi token diaktifkan:
        prometheusHeader:
        - Authorization: {Token}
        # Prometheus V2 tanpa akses bebas password (hapus komentar dan ganti blok V1 di atas):
        # prometheusHeader:
        # - Authorization: Basic <base64Encode(<accessKey:secretKey>)>
        metricsRelistInterval: 1m  # Interval untuk menyegarkan daftar metrik. Gunakan nilai default.
        logLevel: 5                # Tingkat log debug. Gunakan nilai default.
        adapter:
          rules:
            default: false  # Jangan ekspos metrik yang telah ditentukan sebelumnya secara default.
            custom:
            # Contoh: konversi container_memory_working_set_bytes menjadi container_memory_working_set_bytes_per_second
            - seriesQuery: 'container_memory_working_set_bytes{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: { resource: "namespace" }
                  pod: { resource: "pod" }
              name:
                matches: "^(.*)_bytes"
                as: "${1}_bytes_per_second"
              metricsQuery: 'sum(<<.Series>>{<<.LabelMatchers>>}) by (<<.GroupBy>>)'
            # Contoh: konversi container_cpu_usage_seconds_total menjadi container_cpu_usage_core_per_second
            - seriesQuery: 'container_cpu_usage_seconds_total{namespace!="",pod!=""}'
              resources:
                overrides:
                  namespace: { resource: "namespace" }
                  pod: { resource: "pod" }
              name:
                matches: "^(.*)_seconds_total"
                as: "${1}_core_per_second"
              metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)'
            # Contoh: konversi http_requests_total menjadi http_requests_per_second
            - 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>>)'
    ......

Tabel berikut mencantumkan bidang utama adapter. Untuk referensi lengkap, lihat Referensi konfigurasi adapter.

Field

Description

AlibabaCloudMetricsAdapter.prometheus.adapter.rules.custom

Aturan konversi metrik. Ubah agar sesuai dengan contoh di atas.

alibabaCloudMetricsAdapter.prometheus.url

URL permintaan Prometheus. Lihat Dapatkan URL permintaan data Prometheus.

AlibabaCloudMetricsAdapter.prometheus.prometheusHeader[].Authorization

Header autentikasi. Prometheus V1 (jika autentikasi token diaktifkan): gunakan {Token}. Prometheus V2 (jika akses bebas password tidak diaktifkan): gunakan Basic <base64-encoded accessKey:secretKey>.

AlibabaCloudMetricsAdapter.prometheus.adapter.rules.default

Atur ke false untuk menghindari pengeksposan metrik Prometheus yang telah ditentukan sebelumnya ke HPA.

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.

  1. Buat hpa.yaml dengan konten berikut.

    Pods hanya mendukung target AverageValue. HPA membagi total nilai metrik di seluruh pod dan membandingkannya dengan averageValue untuk 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.
  2. Terapkan HPA.

    kubectl apply -f hpa.yaml
  3. Jalankan uji stres untuk memicu penskalaan. Pertama, ekspos Service sample-app melalui instance Server Load Balancer (SLB).

    <EXTERNAL-IP> instruksi

    1. Di halaman ACK Clusters, klik nama kluster Anda. Di panel navigasi kiri, pilih Network > Services.

    2. Di namespace default, temukan Service sample-app. Klik Update di kolom Actions dan ubah Service Type menjadi LoadBalancer. Lihat LoadBalancer.

    3. Tunggu hingga alamat IP eksternal muncul di kolom External IP.

    ab -c 50 -n 2000 http://<EXTERNAL-IP>:8080/
  4. Periksa status HPA.

    kubectl get hpa sample-app-memory-high

    Output yang diharapkan:

    NAME                     REFERENCE               TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
    sample-app-memory-high   Deployment/sample-app   40886272/1024   1         10        1          22s

    Kolom TARGETS menampilkan current/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.

  1. Buat hpa.yaml dengan konten berikut.

    External mendukung baik target Value maupun AverageValue.
    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.
  2. Terapkan HPA.

    kubectl apply -f hpa.yaml
  3. Jalankan uji stres (sama seperti pada tab Custom Metrics, menggunakan <EXTERNAL-IP> dari Service sample-app).

    ab -c 50 -n 2000 http://<EXTERNAL-IP>:8080/
  4. Periksa status HPA.

    kubectl get hpa sample-app

    Output 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

<<.Series>>

Nama metrik Prometheus dari seriesQuery, misalnya http_requests_total

<<.LabelMatchers>>

Pemilih label dari permintaan HPA, misalnya namespace="default",pod="sample-app-xxx"

<<.GroupBy>>

Label resource Kubernetes yang digunakan untuk mengelompokkan hasil, misalnya pod

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 di metricsQuery disisipkan melalui <<.LabelMatchers>> saat kueri dan tidak mewarisi filter dari seriesQuery.

Dapatkan URL permintaan data Prometheus

Alibaba Cloud Prometheus Service

  1. Login ke Konsol ACK. Di panel navigasi kiri, klik Clusters.

  2. Klik nama kluster Anda. Di panel navigasi kiri, pilih Operations > Prometheus Monitoring.

  3. Di pojok kanan atas, klik Alert Settings . Jika tautan tersebut tidak muncul, perbarui ack-arms-prometheus ke versi terbaru. Lihat Prasyarat.

  4. 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.

    3.png

  5. Konfigurasikan autentikasi untuk versi Prometheus Anda.

    • Prometheus V1 (autentikasi token dinonaktifkan secara default): Jika diaktifkan, salin token dari konsol Prometheus dan konfigurasikan adapter.

      image

      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.

      1. Hasilkan string yang diencode Base64.

        Gabungkan AccessKey ID dan Rahasia AccessKey Anda sebagai AccessKey:AccessSecret, lalu encode Base64:

        echo -n 'accessKey:secretKey' | base64
      2. Konfigurasikan komponen.

        Masukkan string yang dihasilkan dalam format Basic <encoded string> ke bidang Authorization dari prometheusHeader.

        ...
            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.

  1. Terapkan ack-prometheus-operator.

    1. Login ke Konsol ACK. Di panel navigasi kiri, pilih Marketplace > Marketplace.

    2. Cari ack-prometheus-operator, klik kartunya, lalu klik Deploy.

    3. Pilih Cluster dan Namespace, atur Release Name, lalu klik Next. Sesuaikan Parameters sesuai kebutuhan dan klik OK.

  2. Verifikasi penerapan.

    1. Ekspos API Prometheus melalui Service. Contoh ini menggunakan Service ack-prometheus-operator-prometheus.

    2. Di browser, buka ServiceIP:9090. Untuk akses publik, ekspos Service melalui instance SLB.

    3. Di konsol Prometheus, klik Status > Targets untuk melihat semua job pengambilan. image.png Jika semua job menunjukkan State UP, pengambilan berfungsi dengan benar. image.png

    4. Catat nama Service dan namespace dari kolom Labels. Di sini, Service-nya adalah ack-prometheus-operator-prometheus di namespace monitoring.

  3. Atur URL Prometheus di adapter. Untuk akses internal:

    AlibabaCloudMetricsAdapter:
      prometheus:
        enabled: true
        url: http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090

    Untuk 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