Topik ini menjawab beberapa pertanyaan umum terkait penskalaan beban kerja (HPA dan CronHPA).
Daftar isi
Apa yang harus dilakukan jika unknown ditampilkan di bidang saat ini dalam metrik HPA?
Apa yang harus dilakukan jika HPA tidak dapat mengumpulkan metrik dan gagal melakukan penskalaan?
Apa yang harus dilakukan jika pod berlebih ditambahkan oleh HPA selama pembaruan bergulir?
Apa yang harus dilakukan jika HPA tidak menskalakan pod ketika ambang penskalaan tercapai?
Bagaimana cara mengonfigurasi interval pengumpulan metrik HPA?
Bagaimana cara mengonfigurasi penskalaan horizontal setelah menyesuaikan format log NGINX Ingress?
Apa yang harus saya lakukan jika unknown ditampilkan di bidang current dalam metrik HPA?
Jika bidang current dari metrik Horizontal Pod Autoscaler (HPA) menunjukkan unknown, itu menandakan bahwa kube-controller-manager tidak dapat mengumpulkan metrik sumber daya dari sumber data pemantauan. Akibatnya, HPA gagal melakukan penskalaan.
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 tempat metrik sumber daya dikumpulkan tidak tersedia
Jalankan perintah kubectl top pod untuk memeriksa apakah data metrik pod yang dipantau dikembalikan. Jika tidak ada data metrik yang dikembalikan, jalankan perintah kubectl get apiservice untuk memeriksa apakah komponen metrics-server tersedia. Output berikut adalah contoh data yang dikembalikan:
Jika layanan API untuk v1beta1.metrics.k8s.io bukan kube-system/metrics-server, periksa apakah metrics-server tertimpa oleh Prometheus Operator. Jika metrics-server tertimpa oleh Prometheus Operator, gunakan template YAML berikut untuk menerapkan ulang metrics-server:
apiVersion: apiregistration.k8s.io/v1beta1
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 masalah tetap ada, buka halaman detail kluster di konsol ACK dan pilih Operations > Add-ons untuk memeriksa apakah metrics-server telah diinstal. Untuk informasi lebih lanjut, lihat metrics-server.
Penyebab 2: Metrik tidak dapat dikumpulkan selama pembaruan bergulir atau aktivitas penambahan skala
Secara default, metrics-server mengumpulkan metrik pada interval 1 menit. Namun, metrics-server harus menunggu beberapa menit sebelum dapat mengumpulkan metrik setelah pembaruan bergulir atau aktivitas penambahan skala selesai. Kami merekomendasikan Anda untuk meminta metrik 2 menit setelah pembaruan bergulir atau aktivitas penambahan skala selesai.
Penyebab 3: Bidang request tidak ditentukan
Secara default, HPA mendapatkan penggunaan CPU atau memori pod dengan menghitung nilai penggunaan sumber daya/permintaan sumber daya. Jika permintaan sumber daya tidak ditentukan dalam konfigurasi pod, HPA tidak dapat menghitung penggunaan sumber daya. Oleh karena itu, Anda harus memastikan bahwa bidang request ditentukan dalam parameter resource konfigurasi pod.
Penyebab 4: Nama metrik salah
Periksa apakah nama metrik benar. Nama metrik bersifat peka huruf besar kecil. Misalnya, jika metrik cpu yang didukung oleh HPA secara tidak sengaja ditulis sebagai CPU, unknown akan ditampilkan di bidang current.
Apa yang harus saya lakukan jika HPA tidak dapat mengumpulkan metrik dan gagal melakukan penskalaan?
HPA mungkin gagal melakukan penskalaan ketika tidak dapat mengumpulkan metrik. Ketika masalah ini terjadi, unknown ditampilkan di bidang current dalam metrik HPA. Dalam kasus ini, HPA tidak dapat mengumpulkan metrik yang digunakan untuk menentukan apakah akan melakukan penskalaan. Akibatnya, HPA tidak dapat menskalakan pod. Lihat FAQ tentang penskalaan otomatis node untuk memecahkan masalah dan memperbaiki masalah ini.
Apa yang harus saya lakukan jika pod berlebih ditambahkan oleh HPA selama pembaruan bergulir?
Selama pembaruan bergulir, kube-controller-manager melakukan pengisian nol pada pod yang datanya pemantauan tidak dapat dikumpulkan. Ini dapat menyebabkan HPA menambah jumlah pod yang berlebihan. Anda dapat melakukan langkah-langkah berikut untuk memperbaiki masalah ini.
Perbaiki masalah ini untuk semua beban kerja di kluster
Perbarui metrics-server ke versi terbaru dan tambahkan parameter berikut ke pengaturan startup metrics-server.
Konfigurasi berikut berlaku untuk semua beban kerja di kluster.
# Tambahkan konfigurasi berikut ke pengaturan startup metrics-server.
--enable-hpa-rolling-update-skipped=true Perbaiki masalah ini untuk beban kerja tertentu
Anda dapat menggunakan salah satu metode berikut untuk memperbaiki masalah ini untuk beban kerja tertentu:
Metode 1: Tambahkan anotasi berikut ke template beban kerja untuk melewati HPA selama pembaruan bergulir.
# Tambahkan anotasi berikut ke parameter spec.template.metadata.annotations konfigurasi beban kerja untuk melewati HPA selama pembaruan bergulir. HPARollingUpdateSkipped: "true"Metode 2: Tambahkan anotasi berikut ke template beban kerja untuk melewati periode pemanasan sebelum pembaruan bergulir.
# Tambahkan anotasi berikut ke parameter spec.template.metadata.annotations konfigurasi beban kerja untuk melewati periode pemanasan sebelum pembaruan bergulir. HPAScaleUpDelay: 3m # Anda dapat mengubah nilainya sesuai dengan kebutuhan bisnis Anda.
Apa yang harus saya lakukan jika HPA tidak menskalakan pod ketika ambang penskalaan tercapai?
HPA mungkin tidak menskalakan pod meskipun penggunaan CPU atau memori turun di bawah ambang penskalaan masuk atau melebihi ambang penskalaan keluar. HPA juga mempertimbangkan faktor lain ketika menskalakan pod. Misalnya, HPA memeriksa apakah aktivitas penskalaan keluar saat ini memicu aktivitas penskalaan masuk atau aktivitas penskalaan masuk saat ini memicu aktivitas penskalaan keluar. Ini mencegah penskalaan berulang dan konsumsi sumber daya yang tidak perlu.
Sebagai contoh, jika ambang penskalaan keluar adalah 80% dan Anda memiliki dua pod yang utilitas CPU-nya masing-masing 70%, pod tersebut tidak akan diskalakan masuk. Hal ini karena utilitas CPU salah satu pod mungkin lebih tinggi dari 80% setelah pod diskalakan masuk. Ini memicu aktivitas penskalaan keluar lainnya.
Bagaimana cara mengonfigurasi interval pengumpulan metrik HPA?
Untuk versi metrics-server yang lebih baru dari 0.2.1-b46d98c-aliyun, tentukan parameter --metric-resolution dalam pengaturan startup. Contoh: --metric-resolution=15s.
Bisakah CronHPA dan HPA berinteraksi tanpa konflik? Bagaimana cara mengaktifkan interaksi antara CronHPA dan HPA?
CronHPA dan HPA dapat berinteraksi tanpa konflik. ACK memodifikasi konfigurasi CronHPA dengan mengatur scaleTargetRef ke objek penskalaan HPA. Dengan cara ini, hanya HPA yang menskalakan aplikasi yang ditentukan oleh scaleTargetRef. Ini juga memungkinkan CronHPA mendeteksi status HPA. CronHPA tidak langsung mengubah jumlah pod untuk Deployment. CronHPA memicu HPA untuk menskalakan pod. Ini mencegah konflik antara CronHPA dan HPA. Untuk informasi lebih lanjut tentang cara mengaktifkan interaksi tanpa konflik antara CronHPA dan HPA, lihat Interaksi antara CronHPA dan HPA.
Bagaimana cara memperbaiki masalah bahwa pod berlebih ditambahkan oleh HPA ketika penggunaan CPU atau memori meningkat dengan cepat?
Ketika pod aplikasi Java atau aplikasi yang ditenagai oleh framework Java dimulai, penggunaan CPU dan memori mungkin tinggi selama beberapa menit selama periode pemanasan. Ini dapat memicu HPA untuk menambah pod. Untuk memperbaiki masalah ini, perbarui versi metrics-server yang disediakan oleh ACK ke 0.3.9.6 atau lebih baru dan tambahkan anotasi ke konfigurasi pod untuk mencegah HPA memicu aktivitas penskalaan secara tidak sengaja. Untuk informasi lebih lanjut tentang cara memperbarui metrics-server, lihat Perbarui komponen metrics-server sebelum Anda memperbarui versi Kubernetes ke 1.12.
Template YAML berikut memberikan konfigurasi pod sampel yang mencegah HPA memicu aktivitas penskalaan secara tidak sengaja dalam skenario ini.
Apa yang harus saya lakukan jika HPA menambah aplikasi sementara nilai metrik dalam log audit lebih rendah dari ambang batas?
Penyebab
HPA menghitung jumlah pod replika yang diinginkan berdasarkan rasio nilai metrik saat ini terhadap nilai metrik yang diinginkan: Jumlah pod replika yang diinginkan = ceil[Jumlah pod replika saat ini × (Nilai metrik saat ini/Nilai metrik yang diinginkan)].
Rumus tersebut menunjukkan bahwa akurasi hasil tergantung pada akurasi jumlah pod replika saat ini, nilai metrik saat ini, dan nilai metrik yang diinginkan. Sebagai contoh, ketika HPA mengumpulkan metrik tentang jumlah pod replika saat ini, HPA pertama kali meminta subresource bernama scale dari objek yang ditentukan oleh parameter scaleTargetRef dan kemudian memilih pod berdasarkan label yang ditentukan di bidang Selector dalam bagian status dari subresource scale. Jika beberapa pod yang diminta oleh HPA tidak termasuk dalam objek yang ditentukan oleh parameter scaleTargetRef, jumlah pod replika yang diinginkan yang dihitung oleh HPA mungkin tidak sesuai dengan harapan Anda. Sebagai contoh, HPA mungkin menambah aplikasi sementara nilai metrik real-time lebih rendah dari ambang batas.
Jumlah pod yang cocok mungkin tidak akurat karena alasan berikut:
Pembaruan bergulir sedang berlangsung.
Pod yang tidak termasuk dalam objek yang ditentukan oleh parameter scaleTargetRef memiliki label yang ditentukan di bidang Selector dalam bagian status dari subresource scale. Jalankan perintah berikut untuk meminta pod:
kubectl get pods -n {Namespace} -l {Nilai bidang Selector dalam bagian status dari subresource bernama scale}
Solusi
Jika pembaruan bergulir sedang berlangsung, lihat FAQ tentang penskalaan otomatis node untuk menyelesaikan masalah ini.
Jika pod yang tidak termasuk dalam objek yang ditentukan oleh parameter scaleTargetRef memiliki label yang ditentukan di bidang Selector dalam bagian status dari subresource scale, lacak pod tersebut dan ubah labelnya. Anda juga dapat menghapus pod yang tidak lagi Anda perlukan.
Bisakah HPA menentukan urutan pod yang diskalakan masuk?
Tidak, HPA tidak dapat menentukan urutan pod yang diskalakan masuk. HPA dapat secara otomatis menambah atau mengurangi jumlah pod berdasarkan metrik yang ditentukan. Namun, HPA tidak dapat menentukan pod mana yang dihentikan terlebih dahulu. Urutan pod yang dihentikan dan waktu shutdown yang anggun ditentukan oleh pengontrol yang mengelola pod.
Apa arti unit metrik pemanfaatan yang dikumpulkan oleh HPA?
Unit metrik pemanfaatan yang dikumpulkan oleh HPA adalah m, yang merupakan singkatan dari awalan milli-. Awalan ini berarti seperseribu. Nilai metrik pemanfaatan adalah bilangan bulat. Misalnya, jika nilai metrik tcp_connection_counts adalah 70000m, nilainya sama dengan 70.
Apa yang harus saya lakukan jika unknown ditampilkan di kolom TARGETS setelah saya menjalankan perintah kubectl get hpa?
Lakukan operasi berikut untuk memecahkan masalah ini:
Jalankan perintah
kubectl describe hpa <hpa_name>untuk memeriksa mengapa HPA menjadi abnormal.Jika nilai
AbleToScaleadalahFalsedi bidangConditions, periksa apakah Deployment dibuat sesuai harapan.Jika nilai
ScalingActiveadalahFalsedi bidangConditions, lanjutkan ke langkah berikutnya.
Jalankan perintah
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/". JikaError from server (NotFound): the server could not find the requested resourcedikembalikan, verifikasi status alibaba-cloud-metrics-adapter.Jika status alibaba-cloud-metrics-adapter normal, periksa apakah metrik HPA terkait dengan Ingress. Jika metrik terkait dengan Ingress, pastikan Anda menerapkan komponen Simple Log Service sebelum ack-alibaba-cloud-metrics-adapter diterapkan. Untuk informasi lebih lanjut, lihat Analisis dan pantau log akses nginx-ingress.
Pastikan nilai metrik HPA valid. Nilai dari sls.ingress.route harus dalam format
<namespace>-<svc>-<port>.namespace: namespace tempat Ingress berada.svc: nama Service yang Anda pilih saat membuat Ingress.port: port dari Service.
Bagaimana cara menemukan metrik yang didukung oleh HPA?
Untuk informasi lebih lanjut tentang metrik yang didukung oleh HPA, lihat Alibaba Cloud metrics adapter. Tabel berikut menjelaskan metrik yang umum digunakan.
Metrik | Deskripsi | Parameter tambahan |
sls_ingress_qps | Jumlah permintaan yang dapat diproses oleh Ingress per detik berdasarkan aturan routing tertentu. | sls.ingress.route |
sls_alb_ingress_qps | Jumlah permintaan yang dapat diproses oleh ALB Ingress per detik berdasarkan aturan routing tertentu. | sls.ingress.route |
sls_ingress_latency_avg | Latensi rata-rata dari semua permintaan. | sls.ingress.route |
sls_ingress_latency_p50 | Latensi maksimum untuk 50% tercepat dari semua permintaan. | sls.ingress.route |
sls_ingress_latency_p95 | Latensi maksimum untuk 95% tercepat dari semua permintaan. | sls.ingress.route |
sls_ingress_latency_p99 | Latensi maksimum untuk 99% tercepat dari semua permintaan. | sls.ingress.route |
sls_ingress_latency_p9999 | Latensi maksimum untuk 99.99% tercepat dari semua permintaan. | sls.ingress.route |
sls_ingress_inflow | Bandwidth masuk dari Ingress. | sls.ingress.route |
Bagaimana cara mengonfigurasi penskalaan horizontal setelah saya menyesuaikan format log NGINX Ingress?
Lihat Implementasikan penskalaan otomatis horizontal berdasarkan metrik Alibaba Cloud untuk melakukan penskalaan pod horizontal berdasarkan metrik Ingress yang dikumpulkan oleh Simple Log Service. Anda harus mengonfigurasi Simple Log Service untuk mengumpulkan log NGINX Ingress.
Secara default, Simple Log Service diaktifkan ketika Anda membuat kluster. Jika Anda menggunakan pengaturan pengumpulan log default, Anda dapat melihat laporan analisis log dan status real-time dari NGINX Ingress di konsol Simple Log Service setelah Anda membuat kluster.
Jika Anda menonaktifkan Simple Log Service ketika membuat kluster ACK, Anda tidak dapat melakukan penskalaan pod horizontal berdasarkan metrik Ingress yang dikumpulkan oleh Simple Log Service. Anda harus mengaktifkan Simple Log Service untuk kluster sebelum Anda dapat menggunakan fitur ini. Untuk informasi lebih lanjut, lihat Analisis dan pantau log akses nginx-ingress-controller.
AliyunLogConfig yang dihasilkan ketika Anda mengaktifkan Simple Log Service untuk kluster pertama kali hanya berlaku untuk format log default yang ACK definisikan untuk pengontrol Ingress. Jika Anda telah mengubah format log, Anda harus memodifikasi pengaturan
processor_regexdalam AliyunLogConfig. Untuk informasi lebih lanjut, lihat Gunakan CRD untuk mengumpulkan log kontainer dalam mode DaemonSet.