Penerapan multi-instans meningkatkan stabilitas aplikasi tetapi dapat menyebabkan sumber daya menganggur dan meningkatkan biaya kluster. Penskalaan manual bersifat padat karya dan lambat dalam merespons. Anda dapat menggunakan NGINX Ingress untuk menerapkan horizontal pod autoscaling (HPA) pada beberapa aplikasi, menyesuaikan jumlah replika Pod secara dinamis berdasarkan beban guna menjaga stabilitas dan responsivitas sekaligus mengoptimalkan penggunaan sumber daya dan biaya. Topik ini menjelaskan cara menerapkan HPA multi-aplikasi dengan NGINX Ingress.
Prasyarat
Pastikan Anda telah:
Alibaba Cloud Prometheus diterapkan di kluster Anda.
Add-on ack-alibaba-cloud-metrics-adapter diterapkan dengan
prometheus.urldikonfigurasi.Apache Benchmark (
ab) telah diinstal.
Cara kerja
Ingress meneruskan permintaan eksternal ke Service, yang kemudian mengarahkannya ke Pod yang sesuai. NGINX Ingress Controller mencatat jumlah permintaan per-Service dalam metrik Prometheus nginx_ingress_controller_requests.
HPA tidak dapat langsung mengonsumsi metrik Prometheus — metrik tersebut harus diekspos melalui API external metrics Kubernetes. ack-alibaba-cloud-metrics-adapter menjembatani kesenjangan ini dengan memproses nginx_ingress_controller_requests dalam empat langkah:
Langkah | Field | Peran | Nilai yang digunakan di sini |
1. Discovery |
| Mengidentifikasi metrik Prometheus mana yang akan diekspos |
|
2. Association |
| Menentukan apakah metrik ini memiliki cakupan namespace |
|
3. Naming |
| Mengganti nama metrik dalam API eksternal | Menghapus |
4. Querying |
| Menentukan templat PromQL yang digunakan untuk menghitung nilai |
|
Adapter mengisi variabel templat metricsQuery ini saat kueri dijalankan:
<<.Series>>— diganti dengan nama seri Prometheus yang cocok (nginx_ingress_controller_requests)<<.LabelMatchers>>— diganti dengan pemilih label dari spesifikasi HPA (misalnya,service="sample-app")
Setiap HPA menggunakan selector.matchLabels.service untuk memfilter metrik ini ke satu aplikasi saja, sehingga penskalaan sample-app dan test-app tetap independen.
Langkah 1: Buat aplikasi dan layanan
Buat dua Deployment dan Service yang sesuai.
Buat
nginx1.yamldengan konten berikut:Terapkan manifes:
kubectl apply -f nginx1.yamlBuat
nginx2.yamldengan konten berikut:Terapkan manifes:
kubectl apply -f nginx2.yaml
Langkah 2: Buat Ingress
Buat
ingress.yamldengan konten berikut:Field
Deskripsi
hostNama domain untuk akses Service. Diatur ke
test.example.comdalam contoh ini.pathJalur URL. Permintaan yang cocok dengan jalur ini diarahkan ke Service yang sesuai.
backendNama Service dan port tujuan untuk setiap jalur.
/diarahkan kesample-app;/homediarahkan ketest-app.Terapkan manifes:
kubectl apply -f ingress.yamlVerifikasi Ingress sedang berjalan:
kubectl get ingress -o wideOutput yang diharapkan:
NAME CLASS HOSTS ADDRESS PORTS AGE test-ingress nginx test.example.com 10.XX.XX.10 80 55sNGINX Ingress Controller mengarahkan
test.example.com/kesample-appdantest.example.com/homeketest-app. Kedua aliran permintaan tersebut dicatat dalam metrik Prometheusnginx_ingress_controller_requests, diberi label berdasarkan nama layanan.
Langkah 3: Konversi metrik Prometheus menjadi metrik yang kompatibel dengan HPA
HPA membaca metrik dari API external metrics Kubernetes, bukan langsung dari Prometheus. ack-alibaba-cloud-metrics-adapter menerjemahkan metrik Prometheus ke format ini melalui aturan dalam ConfigMap adapter-config.
Ubah file adapter-config
Masuk ke Konsol ACK. Di panel navigasi kiri, klik Clusters.
Pada halaman Clusters, temukan kluster yang diinginkan lalu klik namanya. Di panel kiri, pilih Applications > Helm.
Pada halaman Helm, klik ack-alibaba-cloud-metrics-adapter. Di bagian Resource, klik adapter-config, lalu klik Edit YAML file di pojok kanan atas.
Ganti aturan yang ada dengan berikut ini, lalu klik OK:
Semua opsi konfigurasi adapter didokumentasikan dalam Horizontal pod autoscaling berdasarkan metrik Alibaba Cloud Prometheus.
rules: - metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) name: as: ${1}_per_second matches: ^(.*)_requests resources: namespaced: false seriesQuery: nginx_ingress_controller_requests
Verifikasi metrik tersedia
Konfirmasi bahwa adapter menyediakan metrik yang telah dikonversi:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/*/nginx_ingress_controller_per_second" | jq .Output yang diharapkan:
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "nginx_ingress_controller_per_second",
"metricLabels": {},
"timestamp": "2025-07-25T07:56:04Z",
"value": "0"
}
]
}Nilai value sebesar "0" adalah hal yang diharapkan — belum ada traffic.
Langkah 4: Buat HPA
Kedua HPA menggunakan metrik eksternal yang sama, yaitu nginx_ingress_controller_per_second, tetapi memfilternya ke layanan masing-masing menggunakan selector.matchLabels.service. Adapter meneruskan label-label ini sebagai <<.LabelMatchers>> ke dalam kueri PromQL, sehingga keputusan penskalaan setiap aplikasi tetap independen.
Buat
hpa.yamldengan konten berikut:Terapkan manifes:
kubectl apply -f hpa.yamlVerifikasi kedua HPA siap:
kubectl get hpaOutput yang diharapkan:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 0/30 (avg) 1 10 1 74s test-hpa Deployment/test-app 0/30 (avg) 1 10 1 59mKedua HPA menampilkan
0/30 (avg), artinya laju permintaan saat ini berada di bawah ambang batas skala keluar sebesar 30 permintaan per detik per Pod.
Langkah 5: Verifikasi autoscaling
Gunakan Apache Benchmark untuk menghasilkan traffic dan amati respons masing-masing HPA secara independen.
Kirim 5.000 permintaan ke jalur
/home(diarahkan ketest-app):ab -c 50 -n 5000 test.example.com/homeAmati status HPA secara real-time:
kubectl get hpa --watchSetelah beban,
test-hpamelakukan skala keluar sementarasample-hpatetap pada satu replika:NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 0/30 (avg) 1 10 1 22m test-hpa Deployment/test-app 22096m/30 (avg) 1 10 3 80mTekan Ctrl+C untuk menghentikan pengamatan.
Kirim 5.000 permintaan ke jalur root (diarahkan ke
sample-app):ab -c 50 -n 5000 test.example.com/Periksa status HPA lagi:
kubectl get hpaOutput yang diharapkan:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-hpa Deployment/sample-app 27778m/30 (avg) 1 10 2 38m test-hpa Deployment/test-app 0/30 (avg) 1 10 1 96msample-hpamelakukan skala keluar saat dibebani, sementaratest-hpakembali ke satu replika setelah traffic ke/homeberhenti. Setiap aplikasi diskala secara independen berdasarkan traffic-nya sendiri.
Langkah selanjutnya
Autoscaling multi-zona: Lakukan penskalaan di beberapa zona secara simultan untuk layanan intensif data dengan ketersediaan tinggi.
Citra OS kustom untuk skalabilitas elastis: Sederhanakan autoscaling di lingkungan dengan persyaratan node tertentu menggunakan gambar kustom.