Knative Pod Autoscaler (KPA) adalah fitur penskalaan otomatis yang ramah pengguna dari Knative. Fitur ini memungkinkan Anda menetapkan kondisi penskalaan berdasarkan konkurensi pod dan permintaan per detik (RPS). Secara default, Knative mengurangi jumlah pod menjadi nol ketika tidak ada permintaan layanan aktif, 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 ACS. Untuk informasi lebih lanjut, lihat Terapkan Knative.
Cara kerjanya
Knative Serving menyuntikkan wadah Queue Proxy bernama queue-proxy ke setiap pod. Wadah ini secara otomatis melaporkan metrik konkurensi permintaan dari pod aplikasi ke KPA. Setelah KPA menerima metrik tersebut, KPA secara otomatis menyesuaikan jumlah pod yang disediakan untuk Deployment berdasarkan jumlah permintaan bersamaan dan algoritma terkait.
Perluas untuk melihat algoritma KPA
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 telah 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 utilitas 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 bahwa 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 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 penskalaan vertikal maksimum, yang menunjukkan rasio maksimum pod yang diinginkan per aktivitas penskalaan keluar. Nilainya dihitung berdasarkan rumus berikut: math.Ceil(MaxScaleUpRate*readyPodsCount).
max-scale-up-rate: "1000.0"
# Tingkat penskalaan turun maksimum. Defaultnya adalah 2, yang menunjukkan bahwa pod diskalakan menjadi setengah dari jumlah saat ini selama setiap aktivitas penskalaan 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 lembut 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 akan 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 penskalaan turun. Defaultnya adalah 0, yang menunjukkan bahwa aktivitas penskalaan 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 penskalaan ke nol
Konfigurasikan penskalaan ke nol secara global
Parameter enable-scale-to-zero menentukan apakah jumlah pod harus diskalakan menjadi nol ketika Layanan Knative yang ditentukan tidak aktif. 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 ini diatur ke "false", fitur penskalaan ke nol dinonaktifkan. Dalam hal ini, ketika Layanan Knative yang ditentukan tidak aktif, pod tidak diskalakan menjadi nol.Konfigurasikan periode lembut untuk penskalaan ke nol
Parameter scale-to-zero-grace-period menentukan periode lembut sebelum pod Layanan Knative yang ditentukan 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 penskalaan 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, target utilitas, 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. Menetapkan 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.
apiVersion: serving.knative.dev/v1
kind: Service
metadata:
name: helloworld-go
namespace: default
spec:
template:
spec:
containerConcurrency: 50Target utilitas
Target utilitas menentukan persentase aktual dari target autoscaler. Anda juga dapat menggunakan target utilitas untuk menyesuaikan nilai konkurensi. Target utilitas juga dikenal sebagai tingkat panas di mana pod beroperasi. Hal ini menyebabkan autoscaler melakukan penskalaan keluar sebelum batas konkurensi keras yang ditentukan tercapai.
Sebagai contoh, jika containerConcurrency diatur ke 10 dan target utilitas 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 Siap setelah pod dibuat. Anda dapat mengurangi nilai target utilitas 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 target utilitas.
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 mencoba 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: Konfigurasikan penskalaan otomatis dengan menetapkan target konkurensi
Contoh ini menunjukkan cara mengaktifkan KPA untuk melakukan penskalaan otomatis dengan menetapkan target konkurensi.
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 ke 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.
Gunakan template YAML berikut untuk membuat file bernama autoscale-go.yaml dan terapkan file tersebut ke kluster:
Template YAML ini menetapkan target konkurensi ke 10,
min-scaleke 1, danmax-scaleke 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 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.
Referensi
Anda dapat menggunakan AHPA di Knative untuk menskalakan sumber daya secara proaktif berdasarkan nilai metrik historis. Untuk informasi lebih lanjut, lihat Gunakan AHPA untuk mengimplementasikan penskalaan otomatis terjadwal.