全部产品
Search
文档中心

Container Service for Kubernetes:Aktifkan penskalaan otomatis untuk menahan fluktuasi lalu lintas

更新时间:Jul 06, 2025

Knative Pod Autoscaler (KPA) adalah fitur penskalaan otomatis yang ramah pengguna, disediakan oleh Knative. Fitur ini memungkinkan Anda menetapkan kondisi penskalaan berdasarkan konkurensi pod dan permintaan per detik (RPS). Secara default, Knative akan mengurangi jumlah pod menjadi nol ketika tidak ada permintaan layanan aktif, sehingga mengoptimalkan penggunaan sumber daya. Melalui KPA, Anda dapat mengonfigurasi parameter skala turun, seperti waktu tunggu sebelum penskalaan turun ke nol, serta menentukan apakah penskalaan turun ke nol harus diaktifkan.

Prasyarat

Knative telah diterapkan di kluster Anda. Untuk informasi lebih lanjut, lihat atau Deploy and Manage Knative.

Cara kerjanya

Knative Serving menyuntikkan wadah Queue Proxy bernama queue-proxy ke setiap pod. Wadah tersebut secara otomatis melaporkan metrik konkurensi permintaan dari pod aplikasi ke KPA. Setelah menerima metrik, KPA secara otomatis menyesuaikan jumlah pod yang disediakan untuk Deployment berdasarkan jumlah permintaan bersamaan dan algoritma terkait.

Algoritma

KPA menskalakan pod berdasarkan jumlah rata-rata permintaan (atau permintaan bersamaan) yang diterima oleh setiap pod. Secara default, KPA menskalakan pod berdasarkan jumlah permintaan bersamaan. Setiap pod dapat menangani maksimal 100 permintaan secara bersamaan. KPA juga memperkenalkan anotasi target utilization (target-utilization-percentage), yang menentukan nilai persentase pemanfaatan target untuk penskalaan otomatis.

Rumus berikut digunakan untuk menghitung jumlah target pod berdasarkan jumlah permintaan bersamaan: Jumlah pod = Jumlah permintaan bersamaan / (Konkurensi maksimum pod × Target utilization).

Sebagai contoh, jika konkurensi maksimum pod suatu aplikasi diatur menjadi 10 dan target utilization diatur menjadi 0,7, maka ketika 100 permintaan bersamaan diterima, KPA membuat 15 pod berdasarkan rumus berikut: 100 / (0,7 × 10).

KPA juga mendukung mode stabil dan mode panik untuk melakukan penskalaan otomatis yang lebih halus.

  • Mode Stabil

    Dalam mode stabil, KPA menghitung jumlah rata-rata permintaan bersamaan di seluruh pod dalam jendela stabil. Jendela stabil defaultnya adalah 60 detik. Kemudian, KPA menyesuaikan jumlah pod berdasarkan nilai konkurensi rata-rata untuk menjaga beban pada tingkat yang stabil.

  • Mode Panik

    Dalam mode panik, KPA menghitung jumlah rata-rata permintaan bersamaan di seluruh pod dalam jendela panik. Jendela panik defaultnya adalah 6 detik. Jendela panik dihitung berdasarkan rumus berikut: Jendela panik = Jendela stabil × panic-window-percentage. Nilai panic-window-percentage lebih besar dari 0 dan lebih kecil dari 1, dengan nilai default 0,1. Ketika lonjakan permintaan terjadi dan pemanfaatan pod saat ini melebihi jendela panik, KPA meningkatkan jumlah pod untuk menangani lonjakan tersebut.

KPA membuat keputusan penskalaan dengan memeriksa apakah jumlah pod yang dihitung dalam mode panik melebihi ambang batas panik. Ambang batas panik dihitung berdasarkan rumus berikut: Ambang batas panik = panic-threshold-percentage / 100. Nilai default panic-threshold-percentage adalah 200. Oleh karena itu, ambang batas panik defaultnya adalah 2.

Jika jumlah pod yang dihitung dalam mode panik lebih besar dari atau sama dengan dua kali jumlah pod siap saat ini, KPA menskalakan aplikasi ke jumlah pod yang dihitung dalam mode panik. Jika tidak, KPA menskalakan aplikasi ke jumlah pod yang dihitung dalam mode stabil.

Konfigurasi KPA

Catatan

Beberapa konfigurasi dapat diaktifkan pada level revisi menggunakan anotasi atau diterapkan secara global melalui ConfigMaps. Jika kedua metode digunakan pada saat yang sama, konfigurasi level revisi memiliki prioritas.

config-autoscaler

Untuk mengonfigurasi KPA, Anda harus mengonfigurasi config-autoscaler. Secara default, config-autoscaler sudah dikonfigurasi. Berikut ini adalah deskripsi parameter utama.

Jalankan perintah berikut untuk menanyakan config-autoscaler:

kubectl -n knative-serving describe cm config-autoscaler

Output yang diharapkan (ConfigMap config-autoscaler default):

apiVersion: v1
kind: ConfigMap
metadata:
 name: config-autoscaler
 namespace: knative-serving
data:
# Konkurensi maksimum default pod. Nilai defaultnya adalah 100.
 container-concurrency-target-default: "100"
# Target pemanfaatan untuk konkurensi. Nilai defaultnya adalah 70, yang mewakili 0,7.
 container-concurrency-target-percentage: "70"
# Permintaan per detik (RPS) default. Nilai defaultnya adalah 200.
 requests-per-second-target-default: "200"
# Parameter kapasitas ledakan target digunakan untuk menangani lonjakan lalu lintas dan mencegah kelebihan beban pod. Nilai default saat ini adalah 211, yang berarti jika ambang batas target yang ditetapkan untuk layanan dikalikan dengan jumlah pod Ready kurang dari 211, routing akan ditangani melalui layanan Activator.
# Layanan Activator digunakan untuk menerima dan menyangga permintaan ketika kapasitas ledakan target terlampaui.
# Jika parameter kapasitas ledakan target diatur ke 0, layanan Activator hanya ditempatkan di jalur permintaan ketika jumlah pod diskalakan menjadi nol.
# Jika parameter kapasitas ledakan target diatur ke nilai lebih besar dari 0 dan container-concurrency-target-percentage diatur ke 100, layanan Activator selalu digunakan untuk menerima dan menyangga permintaan.
# Jika parameter kapasitas ledakan target diatur ke -1, kapasitas ledakan tidak terbatas. Semua permintaan disangga oleh layanan Activator. Jika Anda mengatur parameter kapasitas ledakan target ke nilai lain, parameter tersebut tidak berlaku.
# Jika nilai dari jumlah pod siap saat ini × konkurensi maksimum - kapasitas ledakan target - konkurensi yang dihitung dalam mode panik lebih kecil dari 0, lonjakan lalu lintas melebihi kapasitas ledakan target. Dalam skenario ini, layanan Activator ditempatkan untuk menyangga permintaan.
 target-burst-capacity: "211"
# Jendela stabil. Defaultnya adalah 60 detik.
 stable-window: "60s"
# Persentase jendela panik. Defaultnya adalah 10, yang menunjukkan bahwa jendela panik defaultnya adalah 6 detik (60 × 0,1).
 panic-window-percentage: "10.0"
# Persentase ambang batas panik. Defaultnya adalah 200.
 panic-threshold-percentage: "200.0"
# Tingkat skala vertikal maksimum, yang menunjukkan rasio maksimum pod yang diinginkan per aktivitas skala keluar. Nilainya dihitung berdasarkan rumus berikut: math.Ceil(MaxScaleUpRate*readyPodsCount).
 max-scale-up-rate: "1000.0"
# Tingkat skala turun maksimum. Defaultnya adalah 2, yang menunjukkan bahwa pod diskalakan menjadi setengah dari jumlah saat ini selama setiap aktivitas skala masuk.
 max-scale-down-rate: "2.0"
# Menentukan apakah jumlah pod harus diskalakan menjadi nol. Secara default, fitur ini diaktifkan.
 enable-scale-to-zero: "true"
# Periode tenggang sebelum jumlah pod diskalakan menjadi nol. Defaultnya adalah 30 detik.
 scale-to-zero-grace-period: "30s"
# Periode retensi pod terakhir sebelum jumlah pod diskalakan menjadi nol. Tentukan parameter ini jika biaya peluncuran pod tinggi.
 scale-to-zero-pod-retention-period: "0s"
# Jenis autoscaler. Autoscaler berikut didukung: KPA, Horizontal Pod Autoscaler (HPA), dan Advanced Horizontal Pod Autoscaler (AHPA).
 pod-autoscaler-class: "kpa.autoscaling.knative.dev"
# Kapasitas permintaan layanan Activator.
 activator-capacity: "100.0"
# Jumlah pod yang diinisialisasi saat revisi dibuat. Defaultnya adalah 1.
 initial-scale: "1"
# Menentukan apakah tidak ada pod yang diinisialisasi saat revisi dibuat. Defaultnya adalah false, yang menunjukkan bahwa pod diinisialisasi saat revisi dibuat.
 allow-zero-initial-scale: "false"
# Jumlah minimum pod yang dipertahankan untuk revisi. Defaultnya adalah 0, yang berarti tidak ada pod yang dipertahankan.
 min-scale: "0"
# Jumlah maksimum pod ke mana revisi dapat diskalakan. Defaultnya adalah 0, yang berarti jumlah pod ke mana revisi dapat diskalakan tidak terbatas.
 max-scale: "0"
# Penundaan skala turun. Defaultnya adalah 0, yang menunjukkan aktivitas skala masuk dilakukan segera.
 scale-down-delay: "0s"

Metrik

Anda dapat menggunakan anotasi autoscaling.knative.dev/metric untuk mengonfigurasi metrik untuk revisi. Autoscaler yang berbeda mendukung metrik yang berbeda.

  • Metrik yang didukung: "concurrency", "rps", "cpu", "memory", dan metrik kustom.

  • Metrik default: "concurrency".

Konfigurasikan metrik konkurensi

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/metric: "concurrency"

Konfigurasikan metrik RPS

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/metric: "rps"

Konfigurasikan metrik CPU

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/class: "hpa.autoscaling.knative.dev"
        autoscaling.knative.dev/metric: "cpu"

Konfigurasikan metrik memori

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/class: "hpa.autoscaling.knative.dev"
        autoscaling.knative.dev/metric: "memory"

Konfigurasikan ambang batas target

Anda dapat menggunakan anotasi autoscaling.knative.dev/target untuk mengonfigurasi target untuk revisi. Anda juga dapat menggunakan anotasi container-concurrency-target-default untuk mengonfigurasi target global dalam ConfigMap.

Konfigurasikan untuk revisi

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target: "50"

Konfigurasikan secara global

apiVersion: v1
kind: ConfigMap
metadata:
 name: config-autoscaler
 namespace: knative-serving
data:
 container-concurrency-target-default: "200"

Konfigurasikan skala ke nol

Konfigurasikan skala ke nol global

Parameter enable-scale-to-zero menentukan apakah jumlah pod harus diskalakan menjadi nol ketika Layanan Knative tertentu menganggur. Nilai validnya adalah "false" dan "true".

apiVersion: v1
kind: ConfigMap
metadata:
 name: config-autoscaler
 namespace: knative-serving
data:
 enable-scale-to-zero: "false" # Jika parameter diatur ke "false", fitur skala ke nol dinonaktifkan. Dalam hal ini, ketika Layanan Knative tertentu menganggur, pod tidak diskalakan menjadi nol.

Konfigurasikan periode tenggang untuk skala ke nol

Parameter scale-to-zero-grace-period menentukan periode tenggang sebelum pod Layanan Knative tertentu diskalakan menjadi nol.

apiVersion: v1
kind: ConfigMap
metadata:
 name: config-autoscaler
 namespace: knative-serving
data:
 scale-to-zero-grace-period: "40s"

Konfigurasikan periode retensi untuk skala ke nol

Konfigurasikan untuk revisi

Anotasi autoscaling.knative.dev/scale-to-zero-pod-retention-period menentukan periode retensi pod terakhir sebelum pod Layanan Knative diskalakan menjadi nol.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/scale-to-zero-pod-retention-period: "1m5s"
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56

Konfigurasikan secara global

Anotasi scale-to-zero-pod-retention-period menentukan periode retensi global pod terakhir sebelum pod Layanan Knative diskalakan menjadi nol.

apiVersion: v1
kind: ConfigMap
metadata:
 name: config-autoscaler
 namespace: knative-serving
data:
 scale-to-zero-pod-retention-period: "42s"

Konfigurasikan konkurensi

Konkurensi menunjukkan jumlah maksimum permintaan yang dapat diproses oleh pod secara bersamaan. Anda dapat mengonfigurasi konkurensi dengan menetapkan batas konkurensi lunak, batas konkurensi keras, pemanfaatan target, dan RPS.

Konfigurasikan batas konkurensi lunak

Batas konkurensi lunak adalah batas yang ditargetkan, bukan batas yang ditegakkan secara ketat. Dalam beberapa skenario, terutama jika terjadi lonjakan permintaan, nilainya mungkin terlampaui.

Konfigurasikan untuk revisi
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target: "200"
Konfigurasikan secara global
apiVersion: v1
kind: ConfigMap
metadata:
 name: config-autoscaler
 namespace: knative-serving
data:
 container-concurrency-target-default: "200" # Tentukan target konkurensi untuk Layanan Knative.

Konfigurasikan batas konkurensi keras untuk revisi

Penting

Kami merekomendasikan agar Anda menentukan batas konkurensi keras hanya jika aplikasi Anda memiliki batas konkurensi atas tertentu. Mengatur batas konkurensi keras yang rendah berdampak buruk pada throughput dan latensi respons aplikasi Anda.

Batas konkurensi keras adalah batas yang ditegakkan secara ketat. Ketika batas konkurensi keras tercapai, permintaan berlebih disangga oleh queue-proxy atau layanan Activator sampai sumber daya yang cukup tersedia untuk menangani permintaan tersebut.

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    spec:
      containerConcurrency: 50

Pemanfaatan target

Pemanfaatan target menentukan persentase aktual dari target autoscaler. Anda juga dapat menggunakan pemanfaatan target untuk menyesuaikan nilai konkurensi. Pemanfaatan target juga dikenal sebagai tingkat panas di mana pod beroperasi. Hal ini menyebabkan autoscaler melakukan skala keluar sebelum batas konkurensi keras yang ditentukan tercapai.

Sebagai contoh, jika containerConcurrency diatur ke 10 dan pemanfaatan target diatur ke 70 (persentase), autoscaler membuat pod ketika jumlah rata-rata permintaan bersamaan di semua pod yang ada mencapai 7. Dibutuhkan waktu bagi pod untuk memasuki status Ready setelah pod dibuat. Anda dapat mengurangi nilai pemanfaatan target untuk membuat pod baru sebelum batas konkurensi keras tercapai. Ini membantu mengurangi latensi respons yang disebabkan oleh cold start.

Konfigurasikan untuk revisi
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target-utilization-percentage: "70" # Konfigurasikan persentase pemanfaatan target.
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
Konfigurasikan secara global
apiVersion: v1
kind: ConfigMap
metadata:
 name: config-autoscaler
 namespace: knative-serving
data:
 container-concurrency-target-percentage: "70" # KPA berusaha memastikan bahwa konkurensi setiap pod tidak melebihi 70% dari sumber daya saat ini.

Konfigurasikan RPS

RPS menentukan jumlah permintaan yang dapat diproses oleh pod per detik.

Konfigurasikan untuk revisi
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: helloworld-go
  namespace: default
spec:
  template:
    metadata:
      annotations:
        autoscaling.knative.dev/target: "150"
        autoscaling.knative.dev/metric: "rps" # Jumlah pod disesuaikan berdasarkan nilai RPS.
    spec:
      containers:
        - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/helloworld-go:73fbdd56
Konfigurasikan secara global
apiVersion: v1
kind: ConfigMap
metadata:
 name: config-autoscaler
 namespace: knative-serving
data:
 requests-per-second-target-default: "150"

Skenario 1: Aktifkan penskalaan otomatis dengan menetapkan target konkurensi

Contoh ini menunjukkan cara mengaktifkan KPA untuk melakukan penskalaan otomatis dengan menetapkan target konkurensi.

  1. Untuk informasi lebih lanjut tentang cara menerapkan Knative, lihat Deploy Knative in an ACK Cluster dan Deploy Knative in an ACK Serverless Cluster.

  2. Gunakan template YAML berikut untuk membuat file bernama autoscale-go.yaml dan terapkan file tersebut di kluster:

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: autoscale-go
      namespace: default
    spec:
      template:
        metadata:
          labels:
            app: autoscale-go
          annotations:
            autoscaling.knative.dev/target: "10" # Tetapkan target konkurensi menjadi 10.
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1
    kubectl apply -f autoscale-go.yaml
  3. Dapatkan Gateway Ingress.

    ALB

    Jalankan perintah berikut untuk mendapatkan Gateway Ingress:

    kubectl get albconfig knative-internet

    Output yang diharapkan:

    NAME               ALBID                    DNSNAME                                              PORT&PROTOCOL   CERTID   AGE
    knative-internet   alb-hvd8nngl0lsdra15g0   alb-hvd8nng******.cn-beijing.alb.aliyuncs.com                            2

    MSE

    Jalankan perintah berikut untuk mendapatkan Gateway Ingress:

    kubectl -n knative-serving get ing stats-ingress

    Output yang diharapkan:

    NAME            CLASS                  HOSTS   ADDRESS                         PORTS   AGE
    stats-ingress   knative-ingressclass   *       101.201.XX.XX,192.168.XX.XX   80      15d

    ASM

    Jalankan perintah berikut untuk mendapatkan Gateway Ingress:

    kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"

    Output yang diharapkan:

    121.XX.XX.XX

    Kourier

    Jalankan perintah berikut untuk mendapatkan Gateway Ingress:

    kubectl -n knative-serving get svc kourier

    Output yang diharapkan:

    NAME      TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)                      AGE
    kourier   LoadBalancer   10.0.XX.XX    39.104.XX.XX     80:31133/TCP,443:32515/TCP   49m
  4. Gunakan alat pengujian beban hey untuk mengirim 50 permintaan bersamaan ke aplikasi dalam 30 detik.

    Catatan

    Untuk informasi lebih lanjut tentang hey, lihat hey.

    hey -z 30s -c 50   -host "autoscale-go.default.example.com"   "http://121.199.XXX.XXX" # 121.199.XXX.XXX adalah alamat IP gateway Ingress.

    Output yang diharapkan:

    hey

    Output menunjukkan bahwa lima pod ditambahkan sesuai harapan.

Skenario 2: Aktifkan penskalaan otomatis dengan menetapkan batas skala

Batas skala mengontrol jumlah minimum dan maksimum pod yang dapat disediakan untuk aplikasi. Contoh ini menunjukkan cara mengaktifkan penskalaan otomatis dengan menetapkan batas skala.

  1. Untuk informasi lebih lanjut tentang cara menerapkan Knative, lihat Deploy Knative in an ACK Cluster dan Deploy Knative in an ACK Serverless Cluster.

  2. Gunakan template YAML berikut untuk membuat file bernama autoscale-go.yaml dan terapkan file tersebut ke kluster:

    Template YAML ini menetapkan target konkurensi menjadi 10, min-scale menjadi 1, dan max-scale menjadi 3.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: autoscale-go
      namespace: default
    spec:
      template:
        metadata:
          labels:
            app: autoscale-go
          annotations:
            autoscaling.knative.dev/target: "10"
            autoscaling.knative.dev/min-scale: "1"
            autoscaling.knative.dev/max-scale: "3"   
        spec:
          containers:
            - image: registry.cn-hangzhou.aliyuncs.com/knative-sample/autoscale-go:0.1
    kubectl apply -f autoscale-go.yaml
  3. Dapatkan Gateway Ingress.

    ALB

    Jalankan perintah berikut untuk mendapatkan Gateway Ingress:

    kubectl get albconfig knative-internet

    Output yang diharapkan:

    NAME               ALBID                    DNSNAME                                              PORT&PROTOCOL   CERTID   AGE
    knative-internet   alb-hvd8nngl0lsdra15g0   alb-hvd8nng******.cn-beijing.alb.aliyuncs.com                            2

    MSE

    Jalankan perintah berikut untuk mendapatkan Gateway Ingress:

    kubectl -n knative-serving get ing stats-ingress

    Output yang diharapkan:

    NAME            CLASS                  HOSTS   ADDRESS                         PORTS   AGE
    stats-ingress   knative-ingressclass   *       101.201.XX.XX,192.168.XX.XX   80      15d

    ASM

    Jalankan perintah berikut untuk mendapatkan Gateway Ingress:

    kubectl get svc istio-ingressgateway --namespace istio-system --output jsonpath="{.status.loadBalancer.ingress[*]['ip']}"

    Output yang diharapkan:

    121.XX.XX.XX

    Kourier

    Jalankan perintah berikut untuk mendapatkan Gateway Ingress:

    kubectl -n knative-serving get svc kourier

    Output yang diharapkan:

    NAME      TYPE           CLUSTER-IP    EXTERNAL-IP      PORT(S)                      AGE
    kourier   LoadBalancer   10.0.XX.XX    39.104.XX.XX     80:31133/TCP,443:32515/TCP   49m
  4. Gunakan alat pengujian beban hey untuk mengirim 50 permintaan bersamaan ke aplikasi dalam 30 detik.

    Catatan

    Untuk informasi lebih lanjut tentang hey, lihat hey.

    hey -z 30s -c 50   -host "autoscale-go.default.example.com"   "http://121.199.XXX.XXX" # 121.199.XXX.XXX adalah alamat IP gateway Ingress.

    Output yang diharapkan:auto-scaling

    Paling banyak tiga pod ditambahkan. Satu pod tetap tersedia ketika tidak ada lalu lintas yang mengalir ke aplikasi.