Topik ini menjawab pertanyaan umum dan memberikan solusi untuk masalah yang mungkin Anda temui saat menggunakan fitur penskalaan workload, termasuk Horizontal Pod Autoscaler (HPA) dan CronHPA.
Daftar Isi
Mengapa HPA tidak melakukan penskalaan meskipun ambang batas telah tercapai?
Apakah CronHPA kompatibel dengan HPA? Bagaimana cara kerjanya?
Cara mencegah over-scaling HPA akibat lonjakan resource awal
Mengapa HPA melakukan penskalaan meskipun nilai metrik di bawah ambang batas dalam log audit?
Bagaimana cara mengelola VPA yang diinstal dengan kubectl dari Konsol?
Mengapa kolom current pada metrik HPA menampilkan unknown?
Ketika kolom current pada data pemantauan HPA bernilai unknown, hal ini menunjukkan bahwa kube-controller-manager tidak dapat mengakses sumber data pemantauan untuk memperoleh data yang sesuai, sehingga menyebabkan kegagalan penskalaan HPA.
Name: kubernetes-tutorial-deployment
Namespace: default
Labels: <none>
Annotations: <none>
CreationTimestamp: Mon, 10 Jun 2019 11:46:48 0530
Reference: Deployment/kubernetes-tutorial-deployment
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): <unknown> / 2%
Min replicas: 1
Max replicas: 4
Deployment pods: 1 current / 0 desired
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True SucceededGetScale the HPA controller was able to get the target's current scale
ScalingActive False FailedGetResourceMetric the HPA was unable to compute the replica count: unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server is currently unable to handle the request (get pods.metrics.k8s.io)
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Warning FailedGetResourceMetric 3m3s (x1009 over 4h18m) horizontal-pod-autoscaler unable to get metrics for resource cpu: unable to fetch metrics from resource metrics API: the server is currently unable to handle the request (get pods.metrics.k8s.io)Penyebab 1: Sumber data metrik resource tidak tersedia
Pertama, jalankan perintah kubectl top pod untuk memeriksa apakah perintah tersebut mengembalikan data. Jika semua Pod tidak mengembalikan data, jalankan kubectl get apiservice untuk memeriksa status sumber data yang menyediakan Resource Metrics. Contoh output yang dikembalikan adalah sebagai berikut.
Jika API Service untuk v1beta1.metrics.k8s.io bukan kube-system/metrics-server, periksa apakah layanan tersebut telah ditimpa oleh instalasi Prometheus Operator. Jika iya, Anda dapat memulihkan layanan tersebut dengan menerapkan templat YAML berikut.
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
name: v1beta1.metrics.k8s.io
spec:
service:
name: metrics-server
namespace: kube-system
group: metrics.k8s.io
version: v1beta1
insecureSkipTLSVerify: true
groupPriorityMinimum: 100
versionPriority: 100Jika bukan masalah tersebut, buka halaman Operations > Add-ons untuk kluster Anda dan pastikan komponen metrics-server telah diinstal. Untuk informasi lebih lanjut, lihat metrics-server.
Penyebab 2: Metrik tidak dapat diambil selama rolling update atau scale-out
Setelah Pod dibuat atau diperbarui, metrics-server memerlukan waktu untuk mengambil metriknya. Tunggu sekitar dua menit setelah operasi selesai sebelum memeriksa kembali.
Penyebab 3: Kolom request tidak dikonfigurasi
Secara default, HPA menggunakan actual utilization/request sebagai nilai utilization. Oleh karena itu, Anda dapat memeriksa apakah kolom resource pada Pod berisi kolom request.
Penyebab 4: Nama metrik salah
Periksa apakah nama metrik sudah benar, termasuk penulisannya (huruf besar/kecil). Misalnya, jika Anda salah menulis metrik yang didukung HPA cpu sebagai CPU, maka kolom current pada data pemantauan akan menampilkan unknown.
Pemecahan masalah kegagalan penskalaan HPA
Penskalaan HPA dapat gagal karena anomali dalam pengambilan metrik. Saat hal ini terjadi, kolom current pada data pemantauan HPA menampilkan unknown. Akibatnya, HPA tidak dapat memperoleh metrik yang diperlukan untuk pengambilan keputusan penskalaan dan tidak dapat menyesuaikan jumlah Pod. Lihat FAQ Autoscaling Node untuk memecahkan penyebabnya dan menerapkan solusi yang tepat.
Mengapa HPA membuat Pod tambahan selama rolling update?
Selama rolling update, kube-controller-manager melaporkan nilai nol untuk Pod yang belum memiliki metrik yang tersedia. Hal ini kadang-kadang menyebabkan HPA membuat lebih banyak Pod daripada yang diperlukan, fenomena yang dikenal sebagai scaling thrashing atau over-scaling. Anda dapat menggunakan konfigurasi berikut untuk mencegah hal ini.
Konfigurasi tingkat kluster
Untuk mencegah perilaku ini, upgrade metrics-server yang disediakan ACK ke versi terbaru dan aktifkan parameter startup tertentu.
Ini adalah pengaturan global yang memengaruhi semua workload terkait dalam kluster.
# Tambahkan opsi berikut ke parameter startup metrics-server.
--enable-hpa-rolling-update-skipped=true Konfigurasi tingkat workload
Untuk mencegah over-scaling pada workload tertentu, gunakan salah satu metode berikut.
Metode 1: Tambahkan anotasi berikut ke templat Pod workload untuk menjeda evaluasi HPA selama rolling update.
# Tambahkan anotasi ini ke spec.template.metadata.annotations workload untuk sementara menjeda evaluasi HPA selama rolling update. HPARollingUpdateSkipped: "true"Metode 2: Tambahkan anotasi berikut ke templat Pod workload untuk menentukan periode pemanasan (warm-up) yang akan diamati HPA setelah aplikasi dimulai.
# Tambahkan anotasi ini ke spec.template.metadata.annotations workload untuk melewatkan periode pemanasan yang ditentukan. HPAScaleUpDelay: 3m # 3m adalah contoh. Atur periode sesuai kebutuhan Anda.
Mengapa HPA tidak melakukan penskalaan meskipun ambang batas telah tercapai?
HPA tidak hanya mempertimbangkan apakah penggunaan CPU atau memori telah melewati ambang batas. HPA juga menghitung apakah tindakan penskalaan mungkin segera dibalik, yang membantu mencegah scaling thrashing.
Sebagai contoh, asumsikan ambang batas scale-out Anda adalah 80% dan Anda memiliki dua Pod, masing-masing dengan penggunaan CPU 70%. Dalam kasus ini, HPA tidak akan melakukan scale-in. Hal ini karena HPA menghitung bahwa pengurangan menjadi satu Pod akan memusatkan beban, sehingga mendorong penggunaan CPU melebihi ambang batas scale-out 80% dan segera memicu scale-out baru.
Cara mengonfigurasi interval pengumpulan metrik HPA
Untuk versi metrics-server yang lebih baru dari v0.2.1-b46d98c-aliyun, atur parameter startup --metric-resolution. Contohnya: --metric-resolution=15s.
Apakah CronHPA kompatibel dengan HPA? Bagaimana cara kerjanya?
Ya, CronHPA kompatibel dengan HPA. Di Container Service for Kubernetes (ACK), CronHPA berinteraksi dengan objek HPA dengan mengatur scaleTargetRef-nya agar mengarah ke HPA. CronHPA kemudian menggunakan HPA untuk menemukan target penskalaan aktual. Desain ini membuat CronHPA mengetahui status HPA. CronHPA beroperasi melalui HPA alih-alih langsung menyesuaikan jumlah replika Deployment, sehingga mencegah konflik antara kedua autoscaler tersebut. Untuk informasi lebih lanjut, lihat Aktifkan kolaborasi antara CronHPA dan HPA.
Cara mencegah over-scaling HPA akibat lonjakan resource awal
Untuk aplikasi yang ditulis dalam bahasa seperti Java yang memerlukan periode pemanasan, penggunaan CPU dan memori dapat melonjak selama beberapa menit setelah kontainer dimulai. Hal ini dapat menyebabkan HPA memicu scale-out yang tidak perlu. Untuk mencegahnya, upgrade komponen metrics-server yang disediakan ACK ke versi 0.3.9.6 atau lebih baru dan tambahkan anotasi ke spesifikasi Pod Anda untuk mencegah perilaku ini. Untuk instruksi upgrade, lihat Upgrade komponen metrics-server sebelum Anda meningkatkan kluster ke v1.12.
YAML berikut menunjukkan contoh Deployment yang mencakup anotasi untuk mencegah penskalaan yang tidak diinginkan.
Mengapa HPA melakukan penskalaan meskipun nilai metrik di bawah ambang batas dalam log audit?
Penyebab
Horizontal Pod Autoscaler menghitung jumlah replika yang diinginkan berdasarkan rasio antara metrik saat ini dan metrik yang diinginkan menggunakan rumus berikut: jumlah replika yang diinginkan = ceil(jumlah replika saat ini × (metrik saat ini / metrik yang diinginkan)).
Rumus ini menunjukkan bahwa akurasi jumlah replika yang diinginkan bergantung pada akurasi jumlah replika saat ini, metrik saat ini, dan metrik yang diinginkan. Ambil metrik resource, yang banyak digunakan dalam HPA, sebagai contoh. Untuk mengambil jumlah replika saat ini, HPA pertama-tama memperoleh subresource scale (subResources) dari objek yang didefinisikan oleh scaleTargetRef. Kemudian, HPA mengonversi nilai Selector dari status objek scale menjadi labelselector. Selector ini digunakan sebagai kondisi untuk mencocokkan dan mengambil Pod. Jika pada suatu waktu, Pod yang diambil menggunakan kondisi ini tidak semuanya termasuk dalam objek yang didefinisikan di scaleTargetRef, jumlah replika yang diinginkan yang dihitung mungkin salah (misalnya, melakukan scale-up meskipun metrik real-time berada di bawah ambang batas).
Alasan umum ketidakakuratan jumlah Pod meliputi:
Rolling update sedang berlangsung.
Pod yang tidak termasuk dalam objek scaleTargetRef memiliki label yang sama. Anda dapat menjalankan perintah berikut untuk memeriksa Pod tersebut:
kubectl get pods -n {namespace_name} -l {value_of_scale_subresource_status.selector}
Solusi
Untuk masalah terkait rolling update, lihat Mengapa HPA membuat Pod tambahan selama rolling update?.
Jika Pod lain memiliki label yang sama, temukan Pod tersebut. Jika masih digunakan, ubah labelnya. Jika tidak lagi diperlukan, hapuslah.
Dapatkah HPA mengontrol urutan scale-in Pod?
Tidak. HPA hanya menyesuaikan jumlah replika untuk suatu workload; HPA tidak menentukan Pod mana yang akan dihentikan. Controller yang mengelola Pod, seperti Deployment, menentukan urutan penghentian dan periode shutdown yang mulus.
Namun, di lingkungan campuran dengan jenis node berbeda, seperti instance ECS dan resource ECI tanpa server, atau beberapa kelompok node, Anda dapat memengaruhi prioritas scale-in dengan mengonfigurasi ResourcePolicy kustom. Anda dapat menggunakan HPA dengan Deployment dan ResourcePolicy untuk memprioritaskan scale-in Pod pada node ECI dibandingkan node ECS. Untuk informasi lebih lanjut, lihat Menyesuaikan penjadwalan prioritas resource elastis.
Apa arti satuan metrik utilization HPA?
Metrik penggunaan biasanya berupa nilai integer tanpa satuan atau nilai integer dalam satuan m. Rasio konversinya adalah 1000m = 1. Sebagai contoh, ketika tcp_connection_counts bernilai 70000m, nilainya setara dengan 70.
Apa yang harus saya lakukan jika kolom target menampilkan unknown setelah saya menjalankan kubectl get hpa?
Ikuti langkah-langkah berikut untuk memecahkan masalah ini.
Jalankan
kubectl describe hpa <hpa_name>untuk memeriksa penyebab kegagalan HPA.Jika kolom
Conditionsmenunjukkan bahwaAbleToScalebernilaiFalse, pastikan Deployment berjalan dengan benar.Jika kolom
Conditionsmenunjukkan bahwaScalingActivebernilaiFalse, lanjutkan ke langkah berikutnya.
Jalankan
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/". Jika responsnyaError from server (NotFound): the server could not find the requested resource, periksa status startup alibaba-cloud-metrics-adapter.Jika alibaba-cloud-metrics-adapter berjalan dengan benar, periksa apakah metrik HPA terkait dengan Ingress. Jika iya, Anda harus terlebih dahulu menerapkan komponen Simple Log Service (SLS). Untuk informasi lebih lanjut, lihat Kumpulkan dan analisis log akses Nginx Ingress.
Verifikasi bahwa metrik HPA dimasukkan dengan benar. Nilai sls.ingress.route menggunakan format
<namespace>-<svc>-<port>.namespace: Namespace dari Ingress.svc: Nama Service untuk Ingress.port: Nama port untuk Service yang terkait dengan Ingress.
Cara menemukan metrik yang didukung oleh HPA
Untuk daftar metrik yang didukung, lihat Metrik HPA Alibaba Cloud. Tabel berikut menjelaskan beberapa metrik yang umum digunakan.
Metrik | Deskripsi | Parameter tambahan |
sls_ingress_qps | QPS untuk entri rute Ingress yang ditentukan. | sls.ingress.route |
sls_alb_ingress_qps | QPS untuk entri rute ALB Ingress yang ditentukan. | sls.ingress.route |
sls_ingress_latency_avg | Latensi rata-rata untuk semua permintaan. | sls.ingress.route |
sls_ingress_latency_p50 | Latensi persentil ke-50 dari permintaan. | sls.ingress.route |
sls_ingress_latency_p95 | Latensi persentil ke-95 dari permintaan. | sls.ingress.route |
sls_ingress_latency_p99 | Latensi persentil ke-99 dari permintaan. | sls.ingress.route |
sls_ingress_latency_p9999 | Latensi persentil ke-99,99 dari permintaan. | sls.ingress.route |
sls_ingress_inflow | Bandwidth masuk dari Ingress. | sls.ingress.route |
Autoscaling dengan format log Nginx Ingress kustom
Untuk mempelajari cara menggunakan metrik Ingress SLS untuk penskalaan horizontal Pod, lihat Skala Pod berdasarkan metrik Nginx Ingress. Ini memerlukan pengaktifan dan konfigurasi yang benar untuk pengumpulan log Nginx Ingress ke Simple Log Service (SLS) di kluster Anda.
Secara default, Simple Log Service diaktifkan saat Anda membuat kluster. Jika Anda mempertahankan pengaturan default, Anda dapat melihat dasbor analisis log akses dan memantau status real-time Nginx Ingress di Konsol SLS setelah kluster dibuat.
Jika Anda menonaktifkan Simple Log Service saat pembuatan kluster, Anda harus mengaktifkan dan mengonfigurasinya kembali untuk menggunakan metrik Ingress SLS dalam penskalaan. Untuk informasi lebih lanjut, lihat Kumpulkan dan analisis log akses Nginx Ingress.
Jika Anda perlu menyesuaikan format log Nginx Ingress dan telah mengubah format log akses Controller Ingress, Anda harus memodifikasi bagian
processor_regexuntuk ekstraksi ekspresi reguler dalam konfigurasi CRD. Hal ini karena CRD AliyunLogConfig yang diterapkan saat Anda pertama kali mengaktifkan Simple Log Service (SLS) di kluster hanya berlaku untuk format log Controller Ingress default di ACK. Untuk informasi lebih lanjut, lihat Kumpulkan log kontainer menggunakan DaemonSet-CRD.
Cara mengambil metrik QPS sls_ingress_qps menggunakan CLI?
Anda dapat mengambil metrik sls_ingress_qps dengan menggunakan perintah berikut:
kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingressDalam hal ini, {{SLS_Project}} adalah nama Proyek SLS untuk kluster ACK. Jika Anda tidak menentukan nama kustom, nilai default-nya adalah k8s-log-{{ClusterId}}, dengan {{ClusterId}} sebagai ID kluster.
Jika perintah mengembalikan error berikut:
Error from server: {
"httpCode": 400,
"errorCode": "ParameterInvalid",
"errorMessage": "key (slb_pool_name) is not config as key value config,if symbol : is in your log,please wrap : with quotation mark \"",
"requestID": "xxxxxxx"
}Hal ini menunjukkan bahwa tidak ada data yang tersedia untuk metrik ini. Hal ini dapat terjadi jika Anda melakukan kueri untuk metrik ALB Ingress seperti sls_alb_ingress_qps tanpa memiliki ALB Ingress yang dikonfigurasi.
Jika perintah mengembalikan hasil seperti berikut:
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "sls_ingress_qps",
"timestamp": "2025-02-26T16:45:00Z",
"value": "50", # Nilai QPS
"metricLabels": {
"sls.project": "your-sls-project-name",
"sls.logstore": "nginx-ingress"
}
}
]
}Hal ini menunjukkan bahwa metrik eksternal Kubernetes QPS telah diambil, dengan value sebagai nilai QPS.
Gagal menarik gambar alibaba-cloud-metrics-adapter
Gejala
Saat Anda melakukan upgrade komponen ack-alibaba-cloud-metrics-adapter ke versi 1.3.7, penarikan gambar gagal dengan error berikut:
Gagal menarik gambar "registry-<region-id>-vpc.ack.aliyuncs.com/acs/alibaba-cloud-metrics-adapter-amd64:v0.2.9-ba634de-aliyun".
Penyebab
Komponen ack-alibaba-cloud-metrics-adapter saat ini tidak mendukung upgrade in-place.
Solusi
Untuk melakukan upgrade komponen, ikuti langkah-langkah berikut:
Buat cadangan konfigurasi komponen saat ini.
Uninstall versi lama komponen tersebut.
Instal versi terbaru komponen dengan menggunakan konfigurasi yang telah dicadangkan.
Selama proses ini, penskalaan untuk objek HPA terkait dijeda karena pengumpulan metrik berhenti.