Service Mesh (ASM) menghasilkan data telemetri untuk setiap permintaan yang mengalir melalui service mesh Anda tanpa memerlukan perubahan pada kode aplikasi. Berdasarkan empat sinyal emas pemantauan—latensi, traffic, error, dan saturasi—ASM menghasilkan serangkaian metrik untuk layanan yang dikelolanya. Metrik ini dapat diintegrasikan ke dalam Horizontal Pod Autoscaler (HPA) Kubernetes untuk menskalakan workload berdasarkan sinyal traffic aktual seperti laju permintaan, bukan hanya berdasarkan pemanfaatan CPU atau memori.
Panduan ini mencakup penyiapan end-to-end: mengumpulkan metrik ASM di Prometheus, men-deploy adapter metrik kustom, dan mengonfigurasi HPA yang menskalakan workload contoh ketika laju permintaan rata-rata melebihi ambang batas tertentu.
Cara kerja
Kubernetes mendukung dua jenis skalabilitas otomatis:
Cluster Autoscaler (CA) — menambah atau menghapus node berdasarkan permintaan penjadwalan pod yang tertunda.
Horizontal Pod Autoscaler (HPA) — menyesuaikan jumlah replika Deployment atau StatefulSet.
Lapisan agregasi di Kubernetes memungkinkan aplikasi pihak ketiga memperluas API Kubernetes dengan mendaftar sebagai komponen add-on API. Komponen add-on ini dapat mengimplementasikan Custom Metrics API dan memungkinkan HPA mengakses berbagai metrik. HPA mengambil metrik dari tiga API Kubernetes:
| API | Tujuan | Contoh metrik |
|---|---|---|
Resource Metrics API (metrics.k8s.io) | Metrik resource inti | CPU, memori |
Custom Metrics API (custom.metrics.k8s.io) | Metrik spesifik aplikasi yang terikat pada objek Kubernetes | Pods, Ingresses |
External Metrics API (external.metrics.k8s.io) | Metrik dari sistem di luar kluster | Kueri Prometheus, pemantauan cloud |
Metrik ASM berasal dari Prometheus, yang berada di luar model objek Kubernetes. Oleh karena itu, External Metrics API merupakan pilihan yang tepat. kube-metrics-adapter menjembatani Prometheus dan External Metrics API sehingga HPA dapat mengkueri metrik ASM secara langsung.
Metrik ASM yang tersedia untuk autoscaling
ASM menghasilkan metrik standar Istio untuk traffic HTTP, HTTP/2, dan gRPC. Metrik yang paling umum digunakan untuk autoscaling adalah:
| Metric | Type | Use case | Contoh PromQL |
|---|---|---|---|
istio_requests_total | Counter | Skala berdasarkan laju permintaan | sum(rate(istio_requests_total{destination_workload="<workload>"}[1m])) |
istio_request_duration_milliseconds | Distribution | Skala berdasarkan latensi P99 | histogram_quantile(0.99, sum(rate(istio_request_duration_milliseconds_bucket{destination_workload="<workload>"}[1m])) by (le)) |
istio_requests_total (difilter) | Counter | Skala berdasarkan laju error | sum(rate(istio_requests_total{destination_workload="<workload>", response_code=~"5.."}[1m])) |
Label utama yang digunakan dalam kueri ini:
destination_workload— nama workload targetdestination_workload_namespace— namespace workload targetreporter— diatur kedestinationuntuk pelaporan sisi server,sourceuntuk sisi klien
Panduan ini menggunakan istio_requests_total untuk menskalakan berdasarkan laju permintaan. Ganti kueri PromQL dengan salah satu alternatif di atas untuk menskalakan berdasarkan latensi atau laju error.
Prasyarat
Sebelum memulai, pastikan Anda telah memiliki:
Instans ASM
Instans Prometheus dan Grafana yang dideploy di kluster
Prometheus yang terintegrasi untuk pemantauan mesh
Langkah 1: Aktifkan pengumpulan metrik Prometheus
Aktifkan ASM untuk mengekspor metrik ke instans Prometheus Anda. Untuk instruksi detail, lihat Kumpulkan metrik pemantauan di Managed Service for Prometheus.
Langkah 2: Deploy adapter metrik kustom
Instal kube-metrics-adapter, yang mendaftarkan dirinya sebagai penyedia untuk External Metrics API dan menerjemahkan permintaan metrik HPA menjadi kueri Prometheus.
Instal adapter dengan Helm. Ganti
http://prometheus.istio-system.svc:9090dengan URL server Prometheus Anda jika berjalan di namespace berbeda atau menggunakan nama layanan berbeda.helm -n kube-system install asm-custom-metrics ./kube-metrics-adapter \ --set prometheus.url=http://prometheus.istio-system.svc:9090Verifikasi instalasi.
Konfirmasi bahwa API
autoscaling/v2tersedia.kubectl api-versions | grep "autoscaling/v2"Output yang diharapkan:
autoscaling/v2Periksa apakah pod adapter sedang berjalan.
kubectl get po -n kube-system | grep metrics-adapterOutput yang diharapkan:
asm-custom-metrics-kube-metrics-adapter-85c6d5d865-2**** 1/1 Running 0 19sKonfirmasi bahwa endpoint External Metrics API telah terdaftar.
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1" | jq .Output yang diharapkan:
{ "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "external.metrics.k8s.io/v1beta1", "resources": [ { "name": "prometheus-query", "singularName": "", "namespaced": true, "kind": "ExternalMetricValueList", "verbs": [ "get" ] } ] }Array
resourceskosong karena belum ada HPA yang mendaftarkan kueri metrik. Array ini akan terisi setelah Anda men-deploy HPA di Langkah 4.
Langkah 3: Deploy aplikasi contoh
Buat namespace
Buat namespace bernama test dan aktifkan injeksi sidecar otomatis. Untuk informasi lebih lanjut, lihat Kelola namespace dan kuota dan Aktifkan injeksi otomatis.
Deploy aplikasi podinfo
Buat file bernama
podinfo.yamldengan konten berikut.Terapkan manifes.
kubectl apply -n test -f podinfo.yaml
Menerapkan penguji beban
Buat file bernama
loadtester.yamldengan konten berikut.Terapkan manifes.
kubectl apply -n test -f loadtester.yaml
Verifikasi deployment
Periksa apakah kedua pod berjalan dengan injeksi sidecar (2/2 kontainer). Output yang diharapkan:
kubectl get pod -n testNAME READY STATUS RESTARTS AGE loadtester-64df4846b9-nxhvv 2/2 Running 0 2m8s podinfo-6d845cc8fc-26xbq 2/2 Running 0 11mKirim permintaan uji dari load tester untuk mengonfirmasi konektivitas. Respons sukses mengonfirmasi bahwa aplikasi contoh dapat dijangkau melalui mesh.
export loadtester=$(kubectl -n test get pod -l "app=loadtester" \ -o jsonpath='{.items[0].metadata.name}') kubectl -n test exec -it ${loadtester} -c loadtester -- \ hey -z 5s -c 10 -q 2 http://podinfo.test:9898
Langkah 4: Konfigurasikan HPA dengan metrik ASM
Definisikan HPA yang menskalakan Deployment podinfo berdasarkan laju permintaan. Konfigurasi ini menghubungkan tiga komponen:
| Apa yang Anda konfigurasikan | Di mana ditempatkan | Tujuan |
|---|---|---|
| Kueri PromQL | Anotasi HPA | Menentukan metrik Prometheus yang akan dikueri |
| Nama metrik + label | spec.metrics[].external | Kunci pencarian yang digunakan HPA untuk mereferensikan anotasi |
| Ambang batas target | spec.metrics[].external.target | Laju permintaan saat skala keluar dimulai |
Contoh ini menggunakan versi API HPAautoscaling/v2, yang memerlukan Kubernetes 1.23 atau lebih baru. Versiv2beta2telah dihapus di Kubernetes 1.26.
Buat file bernama
hpa.yamldengan konten berikut.Penjelasan field utama:
Field Deskripsi metric-config.external.prometheus-query.prometheus/processed-requests-per-secondAnotasi yang menyematkan kueri PromQL. Akhiran ( processed-requests-per-second) adalah nama yang ditentukan pengguna yang menghubungkan anotasi dengan pemilih metrik HPA.metrics[].external.metric.nameHarus prometheus-query— pengenal tetap yang dikenali oleh kube-metrics-adapter.metrics[].external.metric.selector.matchLabels.query-nameHarus sesuai dengan akhiran kunci anotasi ( processed-requests-per-second).target.averageValueAmbang batas per pod. HPA membagi hasil total kueri dengan jumlah replika saat ini dan membandingkannya dengan nilai ini. apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: podinfo namespace: test annotations: # Format anotasi: metric-config.external.prometheus-query.prometheus/<query-name> # <query-name> harus sesuai dengan label query-name di spec.metrics di bawah. # Nilainya adalah kueri PromQL yang dikirim kube-metrics-adapter ke Prometheus. metric-config.external.prometheus-query.prometheus/processed-requests-per-second: | sum( rate( istio_requests_total{ destination_workload="podinfo", destination_workload_namespace="test", reporter="destination" }[1m] ) ) spec: maxReplicas: 10 minReplicas: 1 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: podinfo metrics: - type: External # Gunakan External karena metrik Prometheus bukan objek Kubernetes external: metric: name: prometheus-query # Nama metrik tetap untuk kube-metrics-adapter selector: matchLabels: query-name: processed-requests-per-second # Harus sesuai dengan kunci anotasi di atas target: type: AverageValue averageValue: "10" # Lakukan skala keluar ketika laju permintaan rata-rata melebihi 10 req/s per podTerapkan HPA.
kubectl apply -f hpa.yamlVerifikasi bahwa External Metrics API sekarang mencantumkan metrik yang terdaftar. Output yang diharapkan: Resource
prometheus-querymengonfirmasi bahwa HPA telah mendaftarkan metriknya ke adapter.kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1" | jq .{ "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "external.metrics.k8s.io/v1beta1", "resources": [ { "name": "prometheus-query", "singularName": "", "namespaced": true, "kind": "ExternalMetricValueList", "verbs": [ "get" ] } ] }
Verifikasi skalabilitas otomatis
Hasilkan beban berkelanjutan dari pod load tester. Ini mengirim 50 permintaan per detik (10 pekerja konkuren dengan 5 QPS masing-masing) selama 5 menit.
# Dapatkan nama pod load tester (lewati ini jika $loadtester sudah diatur dari Langkah 3) export loadtester=$(kubectl -n test get pod -l "app=loadtester" \ -o jsonpath='{.items[0].metadata.name}') kubectl -n test exec -it ${loadtester} -c loadtester -- \ hey -z 5m -c 10 -q 5 http://podinfo.test:9898Pantau HPA di terminal terpisah. Output yang diharapkan (setelah sekitar satu menit):
CatatanHPA menyinkronkan metrik setiap 30 detik. Keputusan penskalaan hanya berlaku jika tidak ada peristiwa penskalaan dalam 3–5 menit sebelumnya. Jeda ini mencegah keputusan penskalaan yang cepat dan bertentangan serta memberi waktu bagi Cluster Autoscaler untuk menyediakan node baru jika diperlukan.
watch kubectl -n test get hpa/podinfoNAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE podinfo Deployment/podinfo 8308m/10 (avg) 1 10 6 124mAmati skala turun setelah pengujian beban selesai. Ketika pengujian beban berakhir, laju permintaan turun menjadi nol. HPA secara bertahap melakukan skala turun Deployment hingga jumlah replika kembali ke 1.
Langkah selanjutnya
Untuk menskalakan berdasarkan latensi atau laju error alih-alih laju permintaan, ganti kueri PromQL di anotasi HPA dengan salah satu alternatif dari tabel Metrik ASM yang tersedia untuk autoscaling.
Untuk menyesuaikan perilaku skala naik dan skala turun (jendela stabilisasi, kebijakan penskalaan), tambahkan field
behaviorke spesifikasi HPA. Lihat Configurable scaling behavior dalam dokumentasi Kubernetes.Untuk daftar lengkap metrik Istio dan labelnya, lihat Istio standard metrics.