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
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-autoscalerOutput 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
Konfigurasikan metrik RPS
Konfigurasikan metrik CPU
Konfigurasikan metrik memori
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:73fbdd56Konfigurasikan 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
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: 50Pemanfaatan 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:73fbdd56Konfigurasikan 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:73fbdd56Konfigurasikan 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.
Untuk informasi lebih lanjut tentang cara menerapkan Knative, lihat Deploy Knative in an ACK Cluster dan Deploy Knative in an ACK Serverless Cluster.
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.1kubectl apply -f autoscale-go.yamlDapatkan Gateway Ingress.
ALB
Jalankan perintah berikut untuk mendapatkan Gateway Ingress:
kubectl get albconfig knative-internetOutput yang diharapkan:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE knative-internet alb-hvd8nngl0lsdra15g0 alb-hvd8nng******.cn-beijing.alb.aliyuncs.com 2MSE
Jalankan perintah berikut untuk mendapatkan Gateway Ingress:
kubectl -n knative-serving get ing stats-ingressOutput yang diharapkan:
NAME CLASS HOSTS ADDRESS PORTS AGE stats-ingress knative-ingressclass * 101.201.XX.XX,192.168.XX.XX 80 15dASM
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.XXKourier
Jalankan perintah berikut untuk mendapatkan Gateway Ingress:
kubectl -n knative-serving get svc kourierOutput 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 49mGunakan alat pengujian beban hey untuk mengirim 50 permintaan bersamaan ke aplikasi dalam 30 detik.
CatatanUntuk 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:

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.
Untuk informasi lebih lanjut tentang cara menerapkan Knative, lihat Deploy Knative in an ACK Cluster dan Deploy Knative in an ACK Serverless Cluster.
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-scalemenjadi 1, danmax-scalemenjadi 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.1kubectl apply -f autoscale-go.yamlDapatkan Gateway Ingress.
ALB
Jalankan perintah berikut untuk mendapatkan Gateway Ingress:
kubectl get albconfig knative-internetOutput yang diharapkan:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE knative-internet alb-hvd8nngl0lsdra15g0 alb-hvd8nng******.cn-beijing.alb.aliyuncs.com 2MSE
Jalankan perintah berikut untuk mendapatkan Gateway Ingress:
kubectl -n knative-serving get ing stats-ingressOutput yang diharapkan:
NAME CLASS HOSTS ADDRESS PORTS AGE stats-ingress knative-ingressclass * 101.201.XX.XX,192.168.XX.XX 80 15dASM
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.XXKourier
Jalankan perintah berikut untuk mendapatkan Gateway Ingress:
kubectl -n knative-serving get svc kourierOutput 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 49mGunakan alat pengujian beban hey untuk mengirim 50 permintaan bersamaan ke aplikasi dalam 30 detik.
CatatanUntuk 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:

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