All Products
Search
Document Center

Container Service for Kubernetes:Konfigurasikan metrik kustom menggunakan AHPA untuk penskalaan aplikasi

Last Updated:Mar 26, 2026

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:

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

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

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

  3. Pada halaman Deployments, klik Create from YAML. Tempel YAML berikut, lalu klik Create. Ini akan mendeploy:

    • sample-app: server yang mengekspos metrik requests_per_second di /metrics pada port 8080

    • fib-loader-qps: generator beban yang mengirim traffic ke sample-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

Buat ServiceMonitor

  1. Pada halaman Create, tempel YAML berikut untuk membuat ServiceMonitor, lalu klik Create. ServiceMonitor memberi tahu Prometheus untuk mengambil titik akhir /metrics dari Service sample-app setiap 30 detik.

    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      name: sample-app
      namespace: default
    spec:
      endpoints:
      - interval: 30s
        port: http
        path: /metrics
      namespaceSelector:
        any: true
      selector:
        matchLabels:
          app: sample-app

Aktifkan ServiceMonitor di ARMS

  1. Masuk ke Konsol ARMS. Di panel navigasi kiri, klik Integration Management.

  2. Pada tab Integrated Environments, klik tab Container Service. Temukan instans ACK Anda dan klik Metric Scraping di kolom Actions.

  3. Pada halaman Metric Collection, klik tab Service Monitor. Temukan sample-app, klik Enable di kolom Actions, lalu konfirmasi.

    image

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

  1. Masuk ke Konsol ARMS. Di panel navigasi kiri, pilih Managed Service for Prometheus > Instances.

  2. Pada halaman Prometheus Instances, pilih wilayah instans Anda dan klik nama instans tersebut. Nama instans mengikuti format arms_metrics_{RegionId}_XXX.

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

    2.jpg

Instal ack-alibaba-cloud-metrics-adapter

  1. Di Konsol ACK, klik Marketplace > Marketplace di panel navigasi kiri.

  2. Klik tab App Catalog, cari ack-alibaba-cloud-metrics-adapter, lalu klik Deploy di pojok kanan atas.

  3. Pada halaman Basic Information, pilih Cluster dan Namespace Anda, lalu klik Next.

  4. Pada wizard Parameter Configuration, pilih Chart Version. Di area Parameters, atur nilai berikut, lalu klik OK.

    ParameterWajibDeskripsi
    prometheus.urlYaURL jaringan internal instans Managed Service for Prometheus
    prometheus.prometheusHeaderTidakHeader 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

  1. Di Konsol ACK, klik Applications > Helm di panel navigasi kiri. Temukan alibaba-cloud-metrics-adapter dan klik Update di kolom Actions.

  2. Salin konten YAML berikut dan tempelkan untuk menimpa parameter terkait dalam templat. Perhatikan bahwa parameter requests_per_second harus 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.
    ParameterWajibDeskripsi
    seriesQueryYaNama metrik di Prometheus. Harus sesuai persis.
    name.asYaNama yang diekspos melalui External Metrics API. AHPA mereferensikan nama ini.
    metricsQueryYaAgregasi PromQL yang diterapkan saat AHPA mengkueri metrik.
    enabledYaAtur ke true untuk 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
    ......
  3. 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.

  1. Terapkan YAML berikut. Sesuaikan nama metrik, ambang batas averageValue, dan minReplicas/maxReplicas agar 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 batas averageValue. 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 batas averageValue.
    ParameterDeskripsi
    metrics[].external.metric.nameHarus sesuai dengan nilai name.as dalam 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 observer untuk 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: 1
  2. Verifikasi bahwa AHPA melakukan penskalaan dengan benar:

    kubectl get ahpa

    Output 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        7h53m

    Kubernetes menyatakan nilai metrik dalam satuan milli (m) untuk presisi. Pada contoh ini, 60000m sama dengan 60 permintaan per detik. Dengan ambang batas 10, AHPA menghitung DESIREDPODS sebesar 6 (60 / 10).

Pemecahan masalah penskalaan AHPA

Jika AHPA tidak melakukan penskalaan seperti yang diharapkan, periksa kondisi statusnya:

kubectl describe ahpa customer-deployment

Periksa bagian Conditions pada output. Bidang utama:

BidangYang perlu diperiksa
AbleToScaleApakah AHPA dapat mengeluarkan keputusan penskalaan. Nilai False menunjukkan adanya masalah pada controller atau izin.
ScalingActiveApakah AHPA berhasil mengambil metrik. Nilai False biasanya berarti External Metrics API tidak mengembalikan data.
ScalingLimitedApakah 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 observer ke autoscaling aktif, ubah scaleStrategy menjadi strategi penskalaan dan hapus pengaturan observer.

  • Untuk menerapkan pola ini ke metrik lain, perbarui seriesQuery dan name.as dalam konfigurasi adapter, lalu perbarui metrics[].external.metric.name dalam resource AHPA agar sesuai.