Secara default, Horizontal Pod Autoscaler (HPA) mendukung penskalaan otomatis berdasarkan metrik CPU dan memori. Namun, metrik ini mungkin tidak cukup untuk skenario operasional yang kompleks. Untuk mengonversi metrik kustom dan eksternal yang dikumpulkan oleh Managed Service for Prometheus menjadi metrik yang didukung HPA, Anda dapat merujuk pada topik ini, yang menjelaskan cara mengambil data pemantauan dan mengimplementasikan konfigurasi penskalaan yang sesuai. Solusi ini menawarkan mekanisme penskalaan fleksibel dan nyaman untuk aplikasi Anda.
Prasyarat
Fitur
Secara default, HPA hanya mendukung penskalaan otomatis berdasarkan penggunaan CPU dan memori, yang mungkin tidak memenuhi persyaratan O&M. Managed Service for Prometheus adalah layanan pemantauan sepenuhnya dikelola yang terhubung dengan ekosistem open-source Prometheus. Managed Service for Prometheus memantau berbagai komponen dan menyediakan beberapa dasbor siap pakai. Untuk mengaktifkan penskalaan pod horizontal otomatis berdasarkan metrik Prometheus, ikuti langkah-langkah berikut:
Gunakan Managed Service for Prometheus di kluster ACK untuk mengekspos metrik.
Gunakan ack-alibaba-cloud-metrics-adapter untuk mengonversi metrik Prometheus menjadi metrik Kubernetes yang didukung HPA. Untuk informasi lebih lanjut, lihat Penskalaan Otomatis pada Metrik yang Tidak Terkait dengan Objek Kubernetes.
Konfigurasikan dan terapkan HPA untuk melakukan penskalaan otomatis berdasarkan metrik sebelumnya.
Metrik dapat diklasifikasikan ke dalam jenis-jenis berikut berdasarkan skenario:
Metrik Kustom: Menskalakan objek Kubernetes, seperti pod, berdasarkan metrik yang terkait dengan objek tersebut. Misalnya, Anda dapat menskalakan pod berdasarkan metrik pod. Untuk informasi lebih lanjut, lihat Penskalaan Otomatis pada Beberapa Metrik dan Metrik Kustom.
Metrik Eksternal: Menskalakan objek Kubernetes, seperti pod, berdasarkan metrik yang tidak terkait dengan objek tersebut. Misalnya, Anda dapat menskalakan pod dari beban kerja berdasarkan QPS bisnis. Untuk informasi lebih lanjut, lihat Penskalaan Otomatis pada Metrik yang Tidak Terkait dengan Objek Kubernetes.
Berikut ini menjelaskan cara mengonfigurasi alibaba-cloud-metrics-adapter untuk mengonversi metrik Prometheus menjadi metrik yang didukung HPA untuk penskalaan otomatis.
Langkah 1: Kumpulkan metrik Prometheus
Contoh 1: Gunakan metrik yang telah ditentukan sebelumnya
Anda dapat melakukan penskalaan otomatis berdasarkan metrik yang telah ditentukan sebelumnya yang tersedia di Managed Service for Prometheus yang diinstal di kluster ACK Anda. Metrik yang telah ditentukan sebelumnya mencakup metrik cadvisor untuk pemantauan kontainer, metrik Node-Exporter dan GPU-Exporter untuk pemantauan node, serta semua metrik yang disediakan oleh Managed Service for Prometheus. Untuk melihat metrik yang telah ditentukan sebelumnya di Managed Service for Prometheus, ikuti langkah-langkah berikut:
Masuk ke Konsol ACK. Di panel navigasi sisi kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel sisi kiri, pilih .
Klik Go to ARMS Prometheus di pojok kanan atas.
Di panel navigasi sisi kiri, klik Settings untuk melihat semua metrik yang didukung oleh Managed Service for Prometheus.
Contoh 2: Gunakan metrik Prometheus yang dilaporkan oleh pod
Terapkan aplikasi pengujian dan ekspos metrik aplikasi berdasarkan standar metrik open-source Prometheus. Untuk informasi lebih lanjut, lihat TIPE METRIK. Bagian berikut menjelaskan cara menerapkan aplikasi bernama sample-app dan mengekspos metrik http_requests_total untuk menunjukkan jumlah permintaan yang dikirim ke aplikasi.
Terapkan beban kerja aplikasi.
Masuk ke Konsol ACK. Di panel navigasi sisi kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di panel navigasi sisi kiri, pilih .
Di bagian atas halaman Deployments, klik Create from YAML. Di halaman Create, pilih Custom dari daftar drop-down Sample Template, tambahkan konten berikut ke template, dan kemudian klik Create.
Buat ServiceMonitor.
Masuk ke Konsol Application Real-Time Monitoring Service (ARMS).
Di panel navigasi sisi kiri, klik Integration Management. Di bagian atas halaman, pilih wilayah tempat kluster Anda berada.
Di tab Integrated Environments halaman Integration Management, klik tab Container Service. Di kolom Environment Name/ID, klik instance Prometheus yang memiliki nama yang sama dengan kluster.
Di halaman Container Service, klik tab Metric Scraping.
Di panel navigasi sisi kiri tab saat ini, klik Service Monitor. Kemudian, klik Create. Di panel Add ServiceMonitor Configuration, klik YAML, tambahkan konfigurasi berikut untuk ServiceMonitor, dan klik Create.
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: annotations: arms.prometheus.io/discovery: 'true' name: sample-app namespace: default spec: endpoints: - interval: 30s port: http path: /metrics namespaceSelector: any: true selector: matchLabels: app: sample-app
Periksa status pemantauan.
Di tab Self-Monitoring halaman detail instance, klik tab Targets. Jika default/sample-app/0(1/1 up) ditampilkan, Managed Service for Prometheus sedang memantau aplikasi Anda.
Di dasbor Prometheus, kueri nilai
http_requests_totaldalam periode waktu tertentu untuk memverifikasi bahwa data pemantauan dikumpulkan tanpa kesalahan.
Langkah 2: Ubah konfigurasi ack-alibaba-cloud-metrics-adapter
Masuk ke Konsol ACK. Di panel navigasi sisi kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang ingin Anda kelola dan klik namanya. Di panel navigasi sisi kiri, pilih .
Di halaman Helm, temukan ack-alibaba-cloud-metrics-adapter dan klik Update di kolom Actions.
Di panel Update Release, tambahkan konten berikut ke editor YAML dan klik OK.
Tabel berikut menjelaskan beberapa bidang. Untuk informasi lebih lanjut tentang file konfigurasi ack-alibaba-cloud-adapter, lihat bagian File Konfigurasi ack-alibaba-cloud-metrics-adapter dari topik ini.
Bidang
Deskripsi
AlibabaCloudMetricsAdapter.prometheus.adapter.rules.customKonfigurasi alibaba-cloud-metrics-adapter yang digunakan untuk mengonversi metrik Prometheus. Setel bidang ini ke nilai dalam konten YAML sebelumnya.
alibabaCloudMetricsAdapter.prometheus.urlTitik akhir Managed Service for Prometheus. Untuk informasi lebih lanjut tentang cara mendapatkan titik akhir, lihat bagian Dapatkan Titik Akhir API Managed Service for Prometheus dari topik ini.
AlibabaCloudMetricsAdapter.prometheus.prometheusHeader[].AuthorizationToken. Untuk informasi lebih lanjut tentang cara mendapatkan token, lihat bagian Dapatkan Titik Akhir API Managed Service for Prometheus dari topik ini.
AlibabaCloudMetricsAdapter.prometheus.adapter.rules.defaultTentukan apakah akan membuat metrik yang telah ditentukan sebelumnya. Secara default, metrik yang telah ditentukan sebelumnya dibuat. Kami sarankan menggunakan nilai default
false.
Konfigurasikan ack-alibaba-cloud-metrics-adapter. Setelah ack-alibaba-cloud-metrics-adapter diterapkan, jalankan perintah berikut untuk memeriksa apakah API agregasi Kubernetes telah mengumpulkan data.
Skalakan pod berdasarkan metrik kustom.
Jalankan perintah berikut untuk menanyakan detail metrik kustom yang didukung HPA:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | jq .Jalankan perintah berikut untuk menanyakan nilai saat ini dari metrik
http_requests_per_seconddi namespace default:# Kueri metrik container_memory_working_set_bytes_per_second untuk melihat ukuran memori kerja pod di namespace kube-system per detik. kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_memory_working_set_bytes_per_second" # Kueri metrik container_cpu_usage_core_per_second untuk melihat jumlah vCore pod di namespace kube-system per detik. kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_cpu_usage_core_per_second"Output Sampel:
{ "kind": "MetricValueList", "apiVersion": "custom.metrics.k8s.io/v1beta1", "metadata": { "selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/%2A/container_memory_working_set_bytes_per_second" }, "items":[ { "describedObject": { "kind": "Pod", "namespace": "kube-system", "name": "ack-alibaba-cloud-metrics-adapter-7cf8dcb845-h****", "apiVersion": "/v1" }, "metricName": "container_memory_working_set_bytes_per_second", "timestamp": "2023-08-09T06:30:19Z", "value": "24576k", "selector": null } ]
Skalakan pod berdasarkan metrik eksternal.
Jalankan perintah berikut untuk menanyakan detail metrik eksternal yang didukung HPA:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/" | jq .Jalankan perintah berikut untuk menanyakan nilai saat ini dari metrik
http_requests_per_seconddi namespace default:kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/http_requests_per_second"Output Sampel:
{ "kind": "ExternalMetricValueList", "apiVersion": "external.metrics.k8s.io/v1beta1", "metadata": {}, "items": [ { "metricName": "http_requests_per_second", "metricLabels": {}, "timestamp": "2022-01-28T08:40:20Z", "value": "33m" } ] }
Langkah 3: Konfigurasikan dan terapkan HPA untuk melakukan penskalaan otomatis berdasarkan metrik yang dikumpulkan
Terapkan HPA
Anda dapat menggunakan metrik Prometheus untuk mengekspos metrik kustom dan metrik eksternal secara bersamaan. Tabel berikut menjelaskan dua jenis metrik tersebut.
Tipe Metrik | Deskripsi |
Metrik Kustom | Menskalakan objek Kubernetes, seperti pod, berdasarkan metrik yang terkait dengan objek tersebut. Misalnya, Anda dapat menskalakan pod berdasarkan metrik pod. Untuk informasi lebih lanjut, lihat Penskalaan otomatis pada beberapa metrik dan metrik kustom. |
Metrik Eksternal | Menskalakan objek Kubernetes, seperti pod, berdasarkan metrik yang tidak terkait dengan objek tersebut. Misalnya, Anda dapat menskalakan pod beban kerja berdasarkan QPS bisnis. Untuk informasi lebih lanjut, lihat Penskalaan otomatis pada metrik yang tidak terkait dengan objek Kubernetes . |
Skalakan pod berdasarkan metrik kustom
Buat file bernama hpa.yaml dan tambahkan konten berikut ke file tersebut:
kind: HorizontalPodAutoscaler apiVersion: autoscaling/v2 metadata: name: sample-app-memory-high spec: # Jelaskan objek yang ingin Anda skalakan dengan HPA. HPA dapat secara dinamis mengubah jumlah pod yang diterapkan untuk objek tersebut. scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-app # Tentukan jumlah maksimum dan minimum pod. minReplicas: 1 maxReplicas: 10 # Tentukan metrik berdasarkan mana HPA melakukan penskalaan otomatis. Anda dapat menentukan berbagai jenis metrik secara bersamaan. metrics: - type: Pods pods: # Gunakan metrik pods/container_memory_working_set_bytes_per_second. metric: name: container_memory_working_set_bytes_per_second # Tentukan ambang batas tipe AverageValue. Anda hanya dapat menentukan ambang batas tipe AverageValue untuk metrik Pods. target: type: AverageValue averageValue: 1024000m # 1024000m menunjukkan ambang batas memori sebesar 1 KB. Unit: byte per detik. m adalah unit presisi yang digunakan oleh Kubernetes. Jika nilai tersebut memiliki tempat desimal dan ACK memerlukan presisi tinggi, unit m atau k digunakan. Misalnya, 1001m sama dengan 1.001 dan 1k sama dengan 1000.Jalankan perintah berikut untuk membuat HPA:
kubectl apply -f hpa.yamlJalankan perintah berikut untuk memeriksa apakah HPA berjalan sesuai harapan:
kubectl get hpa sample-app-memory-highOutput yang Diharapkan:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-app-memory-high Deployment/sample-app 24576k/1024000m 3 10 1 7m
Skalakan pod berdasarkan metrik eksternal
Buat file bernama hpa.yaml dan tambahkan konten berikut ke file tersebut:
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: sample-app spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-app minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metric: name: http_requests_per_second selector: matchLabels: job: "sample-app" # Anda hanya dapat menentukan ambang batas tipe Value atau AverageValue untuk metrik eksternal. target: type: AverageValue averageValue: 500mJalankan perintah berikut untuk membuat HPA:
kubectl apply -f hpa.yamlSetelah Layanan LoadBalancer dibuat, jalankan perintah berikut untuk melakukan uji stres:
ab -c 50 -n 2000 LoadBalancer(sample-app):8080/Jalankan perintah berikut untuk menanyakan detail HPA:
kubectl get hpa sample-appOutput yang Diharapkan:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-app Deployment/sample-app 33m/500m 1 10 1 7m
File konfigurasi ack-alibaba-cloud-metrics-adapter
ack-alibaba-cloud-metrics-adapter melakukan langkah-langkah berikut untuk mengonversi metrik Prometheus menjadi metrik yang didukung HPA:
Penemuan: Menemukan metrik Prometheus yang dapat digunakan oleh HPA.
Asosiasi: Mengasosiasikan metrik dengan sumber daya Kubernetes, seperti pod, node, dan namespace.
Penamaan: Mendefinisikan nama metrik yang dapat digunakan oleh HPA setelah konversi.
Pencarian: Mendefinisikan cara mencari data metrik dari API Managed Service for Prometheus.
Dalam contoh sebelumnya, metrik http_requests_total yang diekspos oleh pod sample-app dikonversi menjadi metrik http_requests_per_second untuk HPA. Blok kode berikut menunjukkan konfigurasi ack-alibaba-cloud-metrics-adapter:
- seriesQuery: http_requests_total{namespace!="",pod!=""}
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: ^(.*)_total
as: ${1}_per_second
metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)Parameter | Deskripsi |
| Data kueri Prometheus Query Language (PromQL). |
| Menggabungkan data kueri PromQL dalam seriesQuery. Catatan
|
| Label dalam data kueri PromQL, yang cocok dengan objek |
| Mengonversi nama metrik Prometheus menjadi nama metrik yang mudah dibaca dengan menggunakan ekspresi reguler. Dalam contoh ini, |
Penemuan
Tentukan metrik Prometheus yang ingin Anda konversi. Anda dapat menentukan parameter
seriesFiltersuntuk menyaring metrik. ParameterseriesQuerymencocokkan data berdasarkan label yang ditentukan. Blok kode berikut menunjukkan contohnya:seriesQuery: http_requests_total{namespace!="",pod!=""} seriesFilters: - isNot: "^container_.*_seconds_total"seriesFilters: Opsional. Bidang ini menyaring metrik:is:<regex>: Mencocokkan metrik yang namanya mengandung ekspresi reguler ini.isNot:<regex>: Mencocokkan metrik yang namanya tidak mengandung ekspresi reguler ini.
Asosiasi
Petakan label metrik Prometheus ke sumber daya Kubernetes. Label metrik
http_requests_totaladalahnamespace!=""danpod!="".- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"}Penamaan
Nama metrik HPA yang dikonversi dari metrik Prometheus. Nama metrik Prometheus tetap tidak berubah. Anda tidak perlu mengonfigurasi pengaturan penamaan jika Anda langsung menggunakan metrik Prometheus.
Anda dapat menjalankan perintah
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"untuk menanyakan metrik yang didukung HPA.- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: "^(.*)_total" as: "${1}_per_second"Pencarian
Template permintaan yang dikirim ke API Managed Service for Prometheus. ack-alibaba-cloud-adapter melewatkan parameter dalam HPA ke template permintaan, mengirim permintaan ke API Managed Service for Prometheus berdasarkan template, dan kemudian mengirimkan nilai parameter yang dikembalikan ke HPA untuk penskalaan otomatis.
- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: ^(.*)_total as: ${1}_per_second metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)
Dapatkan titik akhir API Managed Service for Prometheus
Skenario 1: Managed Service for Prometheus
Masuk ke Konsol ACK. Di panel navigasi sisi kiri, klik Clusters.
Di halaman Clusters, temukan kluster yang Anda inginkan dan klik namanya. Di panel sisi kiri, pilih .
Klik Go to ARMS Prometheus di pojok kanan atas.
Di panel navigasi sisi kiri, klik Settings. Kemudian, klik tab Configure dan lihat HTTP API URL (Grafana Read URL).
Kami sarankan Anda memanggil API Managed Service for Prometheus melalui jaringan internal. Anda dapat memanggil API melalui Internet jika tidak ada jaringan internal yang tersedia.

Skenario 2: Prometheus Open-source
Untuk solusi Prometheus open-source yang dikelola sendiri, Anda harus mengekspos API standar Prometheus menggunakan Service. Kemudian, konfigurasikan parameter relatif dari URL sumber data Prometheus di komponen metrics-adapter untuk menyelesaikan konfigurasi sumber data HPA berdasarkan data dari Prometheus open-source.
Contoh berikut menggunakan aplikasi komunitas Helm Chart ack-prometheus-operator dari halaman Marketplace di konsol ACK. Untuk informasi lebih lanjut, lihat Gunakan Prometheus Open Source untuk Memantau Kluster ACK.
Terapkan Managed Service for Prometheus dan ekspos API standar Prometheus.
Masuk ke Konsol ACK. Di panel navigasi sisi kiri, pilih .
Di halaman App Catalog, temukan dan klik ack-prometheus-operator. Di halaman yang muncul, klik Deploy.
Di panel yang muncul, konfigurasikan parameter Cluster dan Namespace, modifikasi parameter Release Name berdasarkan kebutuhan bisnis Anda, dan klik Next. Modifikasi bagian Parameters berdasarkan kebutuhan bisnis Anda dan klik OK.
Lihat hasil penerapan.
Ekspos API standar Prometheus menggunakan Service. Sebagai contoh, gunakan Service
ack-prometheus-operator-prometheusdari ack-prometheus-operator.Masukkan
ServiceIP:9090di bilah alamat browser dan aktifkan akses Internet untuk Service untuk mengakses instance Server Load Balancer (SLB) agar dapat mengunjungi konsol Prometheus.Masukkan di bilah alamat browser dan aktifkan akses melalui Internet untuk Service untuk mengakses instance Server Load Balancer (SLB) untuk mengunjungi konsol Prometheus.
Di bilah navigasi atas, pilih untuk melihat semua tugas pengumpulan.

Tugas dalam status UP berjalan sesuai harapan.

Periksa service dan namespace pada kolom Labels.
Blok kode berikut menunjukkan titik akhir. Dalam contoh ini, ServiceName adalah ack-prometheus-operator-prometheus dan ServiceNamespace adalah monitoring.
http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090
Dalam konfigurasi komponen, atur parameter URL sumber data Prometheus untuk memastikan komunikasi yang tepat antara komponen dan Prometheus.
Jika Anda memilih untuk mengakses API Prometheus melalui Internet, lihat contoh berikut untuk konfigurasi.
AlibabaCloudMetricsAdapter: ...... prometheus: enabled: true url: http://your_domain.com:9090 # Ganti your_domain.com dengan alamat IP publik Anda.Gunakan ack-prometheus-operator sebagai contoh, nilai
urladalah:http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090.
Referensi
Untuk informasi lebih lanjut tentang cara mengimplementasikan HPA menggunakan metrik eksternal, seperti laju permintaan HTTP dan Ingress queries per second (QPS), lihat Implementasikan Penskalaan Horizontal Otomatis Berdasarkan Metrik Alibaba Cloud.
Untuk informasi lebih lanjut tentang cara mengimplementasikan HPA menggunakan NGINX Ingress untuk menyesuaikan jumlah pod secara dinamis untuk beberapa aplikasi berdasarkan beban kerja mereka, lihat Konfigurasikan Penskalaan Pod Horizontal untuk Beberapa Aplikasi Berdasarkan Metrik Lalu Lintas NGINX Ingress.