Jika penskalaan otomatis Pod horizontal tidak berfungsi seperti yang Anda harapkan di Google Kubernetes Engine (GKE), workload Anda mungkin tidak diskalakan dengan benar. Masalah ini dapat mencegah aplikasi menangani beban, yang dapat menyebabkan masalah performa atau gangguan. Anda mungkin melihat Pod tidak bertambah meskipun CPU tinggi, nilai metrik
ditampilkan sebagai <unknown>
dalam status HorizontalPodAutoscaler, atau operasi
penskalaan tidak terjadi sama sekali.
Gunakan halaman ini untuk mendiagnosis dan menyelesaikan masalah umum terkait penskalaan otomatis Pod horizontal, mulai dari kesalahan konfigurasi awal pada objek HorizontalPodAutoscaler hingga kegagalan yang lebih kompleks dalam pipeline metrik. Dengan mengikuti langkah-langkah pemecahan masalah ini, Anda dapat membantu memastikan aplikasi Anda diskalakan secara efisien dan andal berdasarkan permintaan, sehingga memanfaatkan resource Horizontal Pod Autoscaler secara efektif.
Informasi ini penting bagi developer Aplikasi yang mengonfigurasi objek HorizontalPodAutoscaler dan perlu memastikan aplikasi mereka diskalakan dengan benar. Fitur ini juga membantu admin dan operator Platform memecahkan masalah pada pipeline metrik atau konfigurasi cluster yang memengaruhi semua workload yang diskalakan otomatis. Untuk mengetahui informasi selengkapnya tentang peran umum dan contoh tugas yang kami rujuk dalam konten, lihat Peran dan tugas pengguna GKE umum. Google Cloud
Jika Anda sudah mengalami gejala atau melihat pesan error, gunakan tabel berikut untuk menemukan panduan yang tepat:
Gejala | Kemungkinan resolusi |
---|---|
Tidak ada penskalaan, tetapi kondisi HorizontalPodAutoscaler adalah True |
Memecahkan masalah HorizontalPodAutoscaler yang berfungsi normal tetapi tidak merespons |
Anda melihat pesan error tertentu di peristiwa HorizontalPodAutoscaler | Memecahkan masalah error umum Horizontal Pod Autoscaler |
Metrik <unknown> |
Memecahkan masalah metrik kustom dan eksternal |
Tidak ada penurunan skala | Memecahkan masalah Penskalaan Otomatis Pod Horizontal yang gagal menurunkan skala |
Sebelum memulai
- Pastikan Anda menggunakan objek HorizontalPodAutoscaler dengan workload yang dapat diskalakan, seperti Deployment dan StatefulSet. Anda tidak dapat menggunakan penskalaan otomatis Pod horizontal dengan workload yang tidak dapat diskalakan, misalnya, DaemonSets.
-
Untuk mendapatkan izin yang Anda perlukan guna memecahkan masalah penskalaan otomatis Pod horizontal di GKE, yang mencakup memeriksa objek HorizontalPodAutoscaler dan melihat log cluster, minta administrator untuk memberi Anda peran IAM berikut pada project Anda:
-
Periksa resource GKE:
GKE Viewer (
roles/container.viewer
) -
Melihat log cluster:
Logs Viewer (
roles/logging.viewer
)
Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, baca artikel Mengelola akses ke project, folder, dan organisasi.
Anda mungkin juga bisa mendapatkan izin yang diperlukan melalui peran khusus atau peran bawaan lainnya.
-
Periksa resource GKE:
GKE Viewer (
Konfigurasi alat command line
kubectl
untuk berkomunikasi dengan cluster GKE Anda:gcloud container clusters get-credentials CLUSTER_NAME \ --location LOCATION \ --project PROJECT_ID
Ganti kode berikut:
CLUSTER_NAME
: nama cluster Anda.LOCATION
: region atau zona Compute Engine (misalnya,us-central1
atauus-central1-a
) untuk cluster.PROJECT_ID
: Google Cloud Project ID Anda.
Memverifikasi status dan konfigurasi Horizontal Pod Autoscaler
Mulai pemecahan masalah dengan memeriksa kondisi dan konfigurasi objek HorizontalPodAutoscaler. Pemeriksaan awal ini membantu Anda mengidentifikasi dan menyelesaikan kesalahan konfigurasi dasar, yang merupakan penyebab utama masalah penskalaan.
Mendeskripsikan HorizontalPodAutoscaler
Untuk melihat perhitungan real-time dan keputusan penskalaan terbaru HorizontalPodAutoscaler, gunakan perintah kubectl describe hpa
. Perintah ini memberikan ringkasan objek HorizontalPodAutoscaler dan log Events
yang berguna untuk mendiagnosis masalah:
kubectl describe hpa HPA_NAME -n NAMESPACE_NAME
Ganti kode berikut:
HPA_NAME
: nama objek HorizontalPodAutoscaler Anda.NAMESPACE_NAME
: namespace objek HorizontalPodAutoscaler Anda.
Outputnya mirip dengan hal berikut ini:
Name: php-apache-hpa
Reference: Deployment/php-apache
Metrics: ( current / target )
resource cpu on pods (as a percentage of request): 1% (1m) / 50%
Min replicas: 1
Max replicas: 10
Conditions:
Type Status Reason Message
---- ------ ------ -------
AbleToScale True ReadyForNewScale recommended size matches current size
ScalingActive True ValidMetricFound the HorizontalPodAutoscaler was able to successfully calculate a replica count
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal SuccessfulRescale 39m horizontal-pod-autoscaler New size: 4; reason: cpu resource utilization...
Normal SuccessfulRescale 26m horizontal-pod-autoscaler New size: 1; reason: cpu resource utilization...
Dalam output, tiga bagian berikut akan membantu Anda mendiagnosis masalah:
Metrics
: bagian ini menampilkan nilai metrik saat ini dibandingkan dengan targetnya. Periksa di sini untuk melihat apakah HorizontalPodAutoscaler menerima data. Nilai metrik<unknown>
menunjukkan bahwa HorizontalPodAutoscaler belum mengambil metrik atau pipeline metrik rusak.Conditions
: health check tingkat tinggi ini menunjukkan apakah HorizontalPodAutoscaler dapat mengambil metrik (AbleToScale
) dan melakukan penghitungan penskalaan (ScalingActive
). StatusFalse
dalam salah satu kondisi ini menunjukkan kegagalan.Events
: bagian ini mencatat tindakan penskalaan, peringatan, dan error terbaru dari pengontrol HorizontalPodAutoscaler. Bagian ini sering kali menjadi tempat pertama untuk menemukan pesan atau alasan error tertentu, sepertiFailedGetScale
atauFailedGetResourceMetric
, yang membantu Anda menemukan sumber masalah.
Periksa status HorizontalPodAutoscaler di Deployment
Untuk memeriksa status objek HorizontalPodAutoscaler yang digunakan dengan Deployment Anda, gunakan konsol Google Cloud :
Di konsol Google Cloud , buka halaman Workloads.
Klik nama Deployment Anda.
Buka tab Details dan temukan bagian Autoscaling.
Tinjau nilai di baris Status:
- Tanda centang hijau berarti HorizontalPodAutoscaler dikonfigurasi dan dapat membaca metriknya.
- Segitiga kuning berarti HorizontalPodAutoscaler dikonfigurasi, tetapi mengalami masalah saat membaca metriknya. Ini adalah masalah umum dengan metrik kustom atau eksternal. Untuk mengatasi masalah ini, diagnosis mengapa metrik tidak tersedia. Untuk mengetahui informasi selengkapnya, lihat bagian Memecahkan masalah metrik kustom dan eksternal.
Untuk jenis workload lain seperti StatefulSet, atau untuk mengetahui detail selengkapnya, periksa manifest objek HorizontalPodAutoscaler.
Periksa manifes HorizontalPodAutoscaler Anda
Manifes YAML objek HorizontalPodAutoscaler memungkinkan Anda melihat informasi tentang konfigurasi dan statusnya saat ini.
Untuk melihat manifes YAML, pilih salah satu opsi berikut:
Konsol
Di konsol Google Cloud , buka halaman Object Browser.
Dalam daftar Object Kinds, centang kotak HorizontalPodAutoscaler, lalu klik OK.
Buka grup API autoscaling, lalu klik panah peluas untuk HorizontalPodAutoscaler.
Klik nama objek HorizontalPodAutoscaler yang ingin Anda periksa.
Tinjau bagian YAML, yang menampilkan konfigurasi lengkap objek HorizontalPodAutoscaler.
kubectl
Jalankan perintah berikut:
kubectl get hpa HPA_NAME -n NAMESPACE_NAME -o yaml
Ganti kode berikut:
HPA_NAME
: nama objek HorizontalPodAutoscaler Anda.NAMESPACE_NAME
: namespace objek HorizontalPodAutoscaler Anda.
Setelah mengambil manifes, cari bagian utama berikut:
spec
(konfigurasi Anda):scaleTargetRef
: workload (seperti Deployment) yang seharusnya diskalakan oleh HorizontalPodAutoscaler.minReplicas
danmaxReplicas
: setelan replika minimum dan maksimum.metrics
: metrik yang Anda konfigurasi untuk penskalaan (misalnya, pemakaian CPU atau metrik kustom).
status
(status aktif HorizontalPodAutoscaler):currentMetrics
: nilai metrik terbaru yang telah diamati HorizontalPodAutoscaler.currentReplicas
dandesiredReplicas
: jumlah Pod saat ini dan jumlah yang ingin diskalakan oleh HorizontalPodAutoscaler.conditions
: bagian yang paling berharga untuk pemecahan masalah. Bagian ini menunjukkan kondisi HorizontalPodAutoscaler:AbleToScale
: menunjukkan apakah HorizontalPodAutoscaler dapat menemukan target dan metriknya.ScalingActive
: menunjukkan apakah HorizontalPodAutoscaler diizinkan untuk menghitung dan melakukan penskalaan.ScalingLimited
: menunjukkan apakah HorizontalPodAutoscaler ingin melakukan penskalaan, tetapi dibatasi oleh setelanminReplicas
ataumaxReplicas
Anda.
Menggunakan fitur logging lanjutan
Untuk mendapatkan insight yang lebih mendalam tentang objek HorizontalPodAutoscaler, gunakan jenis log berikut:
Melihat peristiwa Horizontal Pod Autoscaler di Cloud Logging: gunakan filter log untuk menemukan semua peristiwa Horizontal Pod Autoscaler untuk cluster tertentu. Contoh:
Di konsol Google Cloud , buka halaman Logs Explorer.
Di panel kueri, masukkan kueri berikut:
resource.type="k8s_cluster" resource.labels.cluster_name="CLUSTER_NAME" resource.labels.location="LOCATION" logName="projects/PROJECT_ID/logs/events" jsonPayload.involvedObject.kind="HorizontalPodAutoscaler"`
Ganti kode berikut:
CLUSTER_NAME
: nama cluster tempat HorizontalPodAutoscaler berada.LOCATION
: region atau zona Compute Engine (misalnya,us-central1
atauus-central1-a
) untuk cluster.PROJECT_ID
: project ID Anda.
Klik Jalankan kueri dan tinjau outputnya.
Melihat peristiwa Horizontal Pod Autoscaler: log ini memberikan log terstruktur yang mudah dibaca dan menjelaskan cara HorizontalPodAutoscaler menghitung rekomendasi, sehingga memberikan insight mendetail tentang proses pengambilan keputusannya.
Memecahkan masalah HorizontalPodAutoscaler yang responsif tetapi tidak responsif
Bagian ini membantu Anda mendiagnosis alasan HorizontalPodAutoscaler Anda mungkin tidak memicu tindakan penskalaan apa pun, meskipun terlihat berfungsi dengan baik dan tidak melaporkan error apa pun dalam status atau peristiwanya.
Gejala:
HorizontalPodAutoscaler tampak berfungsi dengan baik, kondisinya melaporkan True
, dan
tidak menunjukkan error dalam peristiwanya. Namun, tindakan penskalaan
masih belum dilakukan.
Penyebab:
Beberapa faktor dapat menyebabkan perilaku yang diharapkan ini:
- Batas replika: jumlah replika saat ini sudah mencapai
batas yang ditetapkan oleh kolom
minReplicas
ataumaxReplicas
dalam konfigurasi HorizontalPodAutoscaler. - Jendela toleransi: Kubernetes menggunakan jendela toleransi default sebesar 10% untuk mencegah penskalaan pada fluktuasi metrik kecil. Penskalaan hanya terjadi jika rasio metrik saat ini terhadap metrik target berada di luar rentang 0,9 hingga 1,1. Misalnya, jika targetnya adalah CPU 85% dan penggunaan saat ini adalah 93%, rasionya sekitar 1,094 (93/85≈1,094). Karena nilai ini kurang dari 1,1, Horizontal Pod Autoscaler tidak melakukan penskalaan.
- Pod yang Belum Siap: Horizontal Pod Autoscaler hanya menyertakan Pod dengan status
Ready
dalam penghitungan penskalaannya. Pod yang mengalami masalah dengan statusPending
atau tidak menjadiReady
(karena health check gagal atau masalah resource) akan diabaikan dan dapat mencegah penskalaan. - Penundaan periode sinkronisasi: pengontrol HorizontalPodAutoscaler memeriksa metrik secara berkala. Penundaan 15-30 detik antara metrik yang melampaui nilai minimum dan inisiasi tindakan penskalaan adalah hal yang normal.
- Latensi metrik baru: saat HorizontalPodAutoscaler menggunakan metrik kustom baru untuk pertama kalinya, Anda mungkin melihat latensi satu kali selama beberapa menit. Penundaan ini terjadi karena sistem pemantauan (seperti Cloud Monitoring) harus membuat deret waktu baru saat titik data pertama ditulis.
- Penghitungan beberapa metrik: saat Anda mengonfigurasi beberapa metrik, Horizontal Pod Autoscaler menghitung jumlah replika yang diperlukan untuk setiap metrik secara terpisah, lalu memilih nilai yang dihitung tertinggi sebagai jumlah replika akhir. Karena perilaku ini, workload Anda akan diskalakan untuk memenuhi permintaan metrik dengan kebutuhan tertinggi. Misalnya, jika metrik CPU menghitung kebutuhan 9 replika, tetapi metrik permintaan per detik menghitung kebutuhan 15, Horizontal Pod Autoscaler akan menskalakan Deployment menjadi 15 replika.
Resolusi:
Coba solusi berikut:
- Batas replika: periksa nilai
minReplicas
danmaxReplicas
di manifes HorizontalPodAutoscaler atau di output perintahkubectl describe
. Sesuaikan batas ini jika mencegah penskalaan yang diperlukan. - Rentang toleransi: jika penskalaan diperlukan dalam toleransi default, konfigurasi nilai toleransi yang berbeda. Jika tidak, tunggu hingga metrik bergerak di luar rasio 0,9 hingga 1,1.
- Pod Tidak Siap: selidiki alasan Pod
Pending
atau tidakReady
dan selesaikan masalah yang mendasarinya (misalnya, batasan resource, pemeriksaan kesiapan gagal). Untuk mengetahui tips pemecahan masalah, lihat Debug Pod dalam dokumentasi Kubernetes. - Penundaan periode sinkronisasi dan latensi metrik baru: latensi ini normal. Tunggu hingga periode sinkronisasi selesai atau deret waktu metrik kustom baru dibuat.
- Penghitungan beberapa metrik: ini adalah perilaku yang dimaksudkan. Jika penskalaan terjadi berdasarkan satu metrik (seperti permintaan per detik), penskalaan tersebut akan menggantikan penghitungan metrik lain yang lebih rendah (seperti CPU) dengan benar.
Memecahkan masalah error Horizontal Pod Autoscaler umum
Bagian berikut memberikan solusi untuk pesan error dan alasan peristiwa tertentu yang mungkin Anda temui saat memeriksa status HorizontalPodAutoscaler. Anda biasanya menemukan pesan ini di bagian Events
dari output
perintah kubectl describe hpa
.
Memecahkan masalah error konfigurasi Horizontal Pod Autoscaler
Kesalahan konfigurasi dalam manifes HorizontalPodAutoscaler, seperti kesalahan pengetikan kolom atau konfigurasi yang bertentangan, menyebabkan error di bagian ini.
Error: metrik tidak valid
Anda mungkin melihat error ini saat konfigurasi untuk metrik dalam HorizontalPodAutoscaler salah atau tidak konsisten secara sintaksis.
Gejala:
Jika HorizontalPodAutoscaler tidak dapat menghitung replika yang diperlukan karena masalah konfigurasi, bagian Events
-nya akan menampilkan alasan FailedComputeMetricsReplicas
dengan pesan yang mirip dengan berikut ini:
invalid metrics (1 invalid out of 1)
Penyebab:
Error ini biasanya berarti ada ketidakcocokan antara metrik type
dan
target
yang Anda tentukan dalam manifes HorizontalPodAutoscaler. Misalnya,
Anda mungkin telah menentukan type
sebesar Utilization
, tetapi memberikan nilai target
averageValue
, bukan averageUtilization
.
Resolusi:
Perbaiki manifes HorizontalPodAutoscaler sehingga nilai kolom target
sesuai dengan metrik type
:
- Jika
type
adalahUtilization
, nilai di kolomtarget
harusaverageUtilization
. - Jika
type
adalahAverageValue
, nilai di kolomtarget
harusaverageValue
.
Error: beberapa layanan memilih target yang sama
Anda mungkin melihat error ini saat menggunakan penskalaan otomatis berbasis traffic yang memiliki konfigurasi Layanan yang salah untuk HorizontalPodAutoscaler Anda.
Gejala:
Anda melihat error berikut:
multiple services selecting the same target of HPA_NAME: SERVICE_NAME
Output ini mencakup nilai-nilai berikut:
HPA_NAME
: nama HorizontalPodAutoscaler.SERVICE_NAME
: nama Layanan.
Penyebab:
Penskalaan otomatis berbasis traffic dikonfigurasi, tetapi lebih dari satu Layanan Kubernetes menargetkan kolom scaleTargetRef
HorizontalPodAutoscaler. Penskalaan otomatis berbasis traffic hanya mendukung hubungan satu-ke-satu antara Layanan dan workload yang diskalakan otomatis.
Resolusi:
Untuk memperbaiki masalah ini, pastikan hanya satu pemilih label Service yang cocok dengan Pod beban kerja Anda:
Temukan label Pod beban kerja Anda:
kubectl get deployment HPA_TARGET_DEPLOYMENT \ -n NAMESPACE \ -o jsonpath='{.spec.template.metadata.labels}'
Ganti kode berikut:
HPA_TARGET_DEPLOYMENT
: nama Deployment yang ditargetkan oleh HorizontalPodAutoscaler.NAMESPACE
: namespace Deployment.
Outputnya mirip dengan hal berikut ini:
{"app":"my-app", "env":"prod"}
Temukan semua Layanan yang cocok dengan label tersebut dengan meninjau kolom
spec.selector
untuk semua Layanan di namespace.kubectl get services -n NAMESPACE -o yaml
Identifikasi setiap Layanan yang pemilihnya cocok dengan label dari langkah sebelumnya. Misalnya,
{"app": "my-app"}
dan{"app": "my-app", "env": "prod"}
akan cocok dengan contoh label Pod.Selesaikan konflik dengan memilih salah satu opsi berikut:
- Buat pemilih Layanan yang dimaksud menjadi unik dengan menambahkan label baru yang unik
ke kolom
spec.template.metadata.labels
Deployment Anda. Kemudian, perbarui kolomspec.selector
Service one yang dimaksud untuk menyertakan label baru ini. - Buat pemilih Service lainnya lebih ketat dengan mengubah kolom
spec.selector
dari semua Service lainnya yang bertentangan sehingga menjadi lebih ketat dan tidak lagi cocok dengan Pod beban kerja Anda.
- Buat pemilih Layanan yang dimaksud menjadi unik dengan menambahkan label baru yang unik
ke kolom
Terapkan perubahan Anda:
kubectl apply -f MANIFEST_NAME
Ganti
MANIFEST_NAME
dengan nama file YAML yang berisi manifes Service atau Deployment yang telah diperbarui.
Error: label tidak diizinkan
Gejala:
Anda melihat error berikut:
unable to fetch metrics from external metrics API: googleapi: Error 400: Metric label: 'LABEL_NAME' is not allowed
Dalam output ini, LABEL_NAME
adalah nama label yang salah.
Penyebab:
Manifes HorizontalPodAutoscaler menentukan kunci label yang tidak valid di bagian
metric.selector.matchLabels
dan Cloud Monitoring tidak mengenali
atau mengizinkan kunci ini untuk metrik.
Resolusi:
Untuk menyelesaikan masalah ini, lakukan tindakan berikut:
- Identifikasi nama label yang tidak diizinkan dari pesan error.
- Hapus atau koreksi kunci label ini di bagian
metric.selector.matchLabels
manifes HorizontalPodAutoscaler Anda. - Temukan kunci label yang valid dan dapat difilter dengan melihat dokumentasi Cloud Monitoring untuk metrik tersebut.
Masalah: Beberapa HorizontalPodAutoscaler menargetkan workload yang sama
Mengonfigurasi beberapa objek HorizontalPodAutoscaler untuk mengelola workload yang sama akan menyebabkan perilaku penskalaan yang bertentangan dan tidak dapat diprediksi.
Gejala:
Tidak ada Condition
atau Reason
tertentu dalam status HorizontalPodAutoscaler yang secara langsung menunjukkan konflik ini. Sebaliknya, Anda mungkin mengalami
gejala berikut:
- Jumlah replika workload dapat berfluktuasi secara tidak terduga.
- Keputusan penskalaan mungkin tidak sesuai dengan metrik yang ditentukan dalam satu HorizontalPodAutoscaler.
- Saat melihat peristiwa, Anda mungkin melihat peristiwa
SuccessfulRescale
yang bergantian atau bertentangan dari objek HorizontalPodAutoscaler yang berbeda.
Penyebab:
Masalah ini terjadi karena lebih dari satu objek HorizontalPodAutoscaler dalam namespace yang sama menentukan beban kerja yang persis sama di kolom spec.scaleTargetRef
. Setiap HorizontalPodAutoscaler secara independen menghitung jumlah replika dan mencoba menskalakan workload berdasarkan kumpulan metrik dan targetnya sendiri. Kubernetes tidak memblokir konfigurasi ini, tetapi
menyebabkan penyesuaian penskalaan yang tidak menentu karena HorizontalPodAutoscaler
bersaing satu sama lain.
Resolusi:
Untuk menghindari konflik, tentukan semua metrik penskalaan dalam satu
objek HorizontalPodAutoscaler. Setiap HorizontalPodAutoscaler menghitung kebutuhan penskalaan dari kolom spec.metrics
-nya sendiri, sehingga penggabungannya memungkinkan objek HorizontalPodAutoscaler yang dipilih mempertimbangkan semua faktor, seperti CPU dan permintaan per detik, secara bersamaan:
Untuk mengidentifikasi HorizontalPodAutoscaler mana yang menargetkan workload yang sama, dapatkan manifes YAML untuk setiap objek HorizontalPodAutoscaler. Perhatikan baik-baik kolom
spec.scaleTargetRef
di output.kubectl get hpa -n NAMESPACE_NAME -o yaml
Ganti
NAMESPACE_NAME
dengan namespace objek HorizontalPodAutoscaler Anda.Cari instance apa pun yang memiliki nilai yang sama untuk
apiVersion
,kind
, danname
dalam kolomscaleTargetRef
-nya di berbagai resource HorizontalPodAutoscaler.Menggabungkan metrik ke dalam satu objek HorizontalPodAutoscaler:
- Pilih satu objek HorizontalPodAutoscaler yang akan dipertahankan. HorizontalPodAutoscaler ini akan menjadi yang Anda ubah.
- Periksa bagian
spec.metrics
dalam manifes setiap objek HorizontalPodAutoscaler lainnya yang menargetkan workload yang sama. - Salin definisi metrik yang ingin Anda pertahankan dari bagian
spec.metrics
objek HorizontalPodAutoscaler duplikat. - Tempelkan definisi metrik yang disalin ini ke dalam array
spec.metrics
dari HorizontalPodAutoscaler yang Anda putuskan untuk dipertahankan.
Terapkan perubahan Anda:
kubectl apply -f MANIFEST_NAME
Ganti
MANIFEST_NAME
dengan nama manifes HorizontalPodAutoscaler yang Anda putuskan untuk dipertahankan.Hapus objek HorizontalPodAutoscaler lainnya yang menargetkan workload yang sama:
kubectl delete hpa DUPLICATE_MANIFEST_NAME -n NAMESPACE_NAME
Ganti
DUPLICATE_MANIFEST_NAME
dengan nama objek HorizontalPodAutoscaler redundan yang ingin Anda hapus.
Memecahkan masalah error workload dan target
Error di bagian ini disebabkan oleh Deployment, StatefulSet, atau Pod yang diskalakan, bukan objek HorizontalPodAutoscaler itu sendiri.
Error: Tidak dapat mendapatkan skala target saat ini
Anda mungkin melihat error ini saat HorizontalPodAutoscaler tidak dapat menemukan atau mengakses beban kerja yang seharusnya diskalakan.
Gejala:
Bagian Events
memiliki kondisi FailedGetScale
dengan pesan yang mirip dengan berikut ini:
the HorizontalPodAutoscaler controller was unable to get the target's current scale: WORKLOAD_TYPE.apps "TARGET_WORKLOAD" not found
Output ini mencakup nilai-nilai berikut:
WORKLOAD_TYPE
: jenis beban kerja, sepertiDeployment
atauStatefulSet
.TARGET_WORKLOAD
: nama workload.
Penyebab:
Pengontrol HorizontalPodAutoscaler tidak dapat menemukan workload (seperti
Deployment atau StatefulSet) yang dikonfigurasi untuk dikelola. Masalah ini disebabkan oleh masalah di kolom scaleTargetRef
dalam manifes HorizontalPodAutoscaler. Resource yang ditentukan mungkin tidak ada,
mungkin telah dihapus, atau mungkin salah eja.
Resolusi:
Coba solusi berikut:
- Verifikasi kolom
scaleTargetRef
di manifest HorizontalPodAutoscaler: Pastikan nilainame
,kind
, danapiVersion
di kolomscaleTargetRef
sama persis dengan metadata yang sesuai dari target workload Anda. Jika nama beban kerja salah, perbarui kolomscaleTargetRef
HorizontalPodAutoscaler untuk mengarah ke nama yang benar. - Konfirmasi bahwa workload ada: pastikan workload target ada
di namespace yang sama dengan HorizontalPodAutoscaler. Anda dapat memeriksanya
dengan perintah seperti
kubectl get deployment DEPLOYMENT_NAME
. Jika Anda sengaja menghapus workload, hapus objek HorizontalPodAutoscaler yang sesuai untuk membersihkan cluster Anda. Jika Anda perlu membuat ulang workload, HorizontalPodAutoscaler akan otomatis menemukannya setelah tersedia, dan error akan teratasi. - Periksa apakah HorizontalPodAutoscaler dan workload berada di namespace yang sama: HorizontalPodAutoscaler dan target workload-nya harus berada di namespace yang sama. Jika Anda lupa menentukan namespace saat membuat objek dengan perintah
kubectl
, Kubernetes akan menempatkan objek di namespacedefault
. Perilaku ini dapat menyebabkan ketidakcocokan jika HorizontalPodAutoscaler Anda berada di namespacedefault
, sedangkan workload Anda berada di namespace lain, atau sebaliknya. Periksa namespace untuk kedua objek dan pastikan keduanya cocok.
Setelah HorizontalPodAutoscaler berhasil menemukan targetnya, kondisi
AbleToScale
akan menjadi True
, dan pesan akan berubah menjadi: the
HorizontalPodAutoscaler controller was able to get the target's current scale
.
Error: Tidak dapat menghitung jumlah replika
Anda mungkin melihat error ini saat HorizontalPodAutoscaler perlu menghitung penskalaan berdasarkan penggunaan resource, tetapi tidak memiliki informasi dasar yang diperlukan dari Pod.
Gejala:
Kondisi ScalingActive
adalah False
dengan Reason
FailedGetResourceMetric
. Biasanya Anda juga akan melihat pesan yang mirip dengan
berikut:
the HorizontalPodAutoscaler was unable to compute the replica count
Penyebab:
Horizontal Pod Autoscaler perlu menghitung penggunaan resource sebagai persentase untuk menskalakan workload, tetapi tidak dapat melakukan penghitungan ini karena setidaknya satu container dalam spesifikasi Pod tidak memiliki definisi resources.requests
untuk resource yang sesuai (cpu
atau memory
).
Resolusi:
Untuk mengatasi masalah ini, perbarui manifes Pod dalam Deployment, StatefulSet, atau pengontrol lainnya untuk menyertakan kolom resources.requests
bagi resource (cpu
atau memory
) yang coba diskalakan oleh HorizontalPodAutoscaler untuk semua container dalam Pod. Contoh:
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
containers:
- name: example-container
...
resources:
requests:
cpu: "100m"
memory: "128Mi"
Error: tidak dapat mengambil metrik Pod untuk Pod
Anda mungkin melihat error ini saat ada masalah dalam mengambil metrik yang diperlukan HorizontalPodAutoscaler untuk membuat keputusan penskalaan. Hal ini sering kali terkait dengan definisi resource Pod.
Gejala:
Anda akan melihat pesan persisten yang mirip dengan berikut ini:
unable to fetch pod metrics for pod
Wajar jika Anda melihat pesan ini untuk sementara saat server metrik mulai dijalankan.
Penyebab:
Untuk melakukan penskalaan berdasarkan persentase penggunaan resource (seperti cpu
atau memory
),
setiap container dalam Pod yang ditargetkan oleh objek HorizontalPodAutoscaler
harus memiliki kolom resources.requests
yang ditentukan untuk resource tertentu tersebut.
Jika tidak, HorizontalPodAutoscaler tidak dapat melakukan penghitungan yang
diperlukan, dan tidak mengambil tindakan terkait metrik tersebut.
Resolusi:
Jika pesan error ini terus muncul dan Anda melihat bahwa Pod tidak diskalakan untuk workload, pastikan Anda telah menentukan permintaan resource untuk setiap container dalam workload.
Memecahkan masalah error ketersediaan data dan API metrik
Bagian berikut membantu Anda mengatasi error yang terjadi saat
HorizontalPodAutoscaler mencoba mengambil data dari API metrik. Masalah ini dapat
berkisar dari kegagalan komunikasi cluster internal, saat Metrics API tidak
tersedia, hingga kueri tidak valid yang ditolak oleh penyedia metrik (sering terlihat sebagai
error HTTP tingkat 400
).
Error: tidak ada versi metrik yang tersedia
Gejala:
Anda melihat error berikut:
unable to fetch metrics from custom metrics API: no known available metric versions found
Penyebab:
Error ini menunjukkan gangguan komunikasi dalam cluster, bukan masalah pada sumber metrik (seperti Cloud Monitoring). Penyebab umumnya meliputi hal-hal berikut:
- Server Kubernetes API tidak tersedia untuk sementara (misalnya, selama upgrade cluster atau perbaikan bidang kontrol).
- Pod adaptor metrik (misalnya,
custom-metrics-stackdriver-adapter
) tidak berfungsi, tidak berjalan, atau tidak terdaftar dengan benar di server API.
Resolusi:
Masalah ini sering kali bersifat sementara. Jika masalah berlanjut, coba solusi berikut:
Periksa kondisi bidang kontrol Kubernetes:
Di konsol Google Cloud , lihat kesehatan dan status cluster Anda.
Buka halaman cluster Kubernetes.
Periksa kolom Status dan Notifikasi untuk cluster Anda.
Klik
Notifikasi untuk mencari operasi yang sedang berlangsung seperti upgrade atau perbaikan. Server API mungkin tidak tersedia sebentar selama waktu ini.
Tinjau Cloud Audit Logs untuk menemukan error terkait komponen panel kontrol. Untuk mengetahui informasi tentang cara melihat log ini, lihat Informasi logging audit GKE.
Periksa kondisi dan log Pod adaptor metrik: pastikan Pod adaptor metrik berstatus
Running
dan tidak ada mulai ulang baru-baru ini:kubectl get pods -n custom-metrics,kube-system -o wide
Jika status Pod selain
Running
, atau memiliki jumlah mulai ulang yang tinggi, selidiki Pod untuk menemukan akar masalahnya. Untuk mengetahui tips pemecahan masalah, lihat Men-debug Pod dalam dokumentasi Kubernetes.Pastikan bahwa API metrik terdaftar dan tersedia:
kubectl get apiservice | grep metrics.k8s.io
Jika API metrik responsif, outputnya akan mirip dengan berikut ini:
NAME SERVICE AVAILABLE AGE v1beta1.custom.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 18d v1beta1.external.metrics.k8s.io custom-metrics/custom-metrics-stackdriver-adapter True 18d v1beta1.metrics.k8s.io kube-system/metrics-server True 18d
Jika kolom
AVAILABLE
memiliki nilaiFalse
, kolomMessage
dalam manifes APIService lengkap mungkin memberikan detail lainnya.Anda dapat melihat manifes lengkap dengan perintah berikut:
kubectl get apiservice API_SERVICE_NAME -o yaml
Ganti
API_SERVICE_NAME
dengan nama objek APIService, sepertiv1beta1.custom.metrics.k8s.io
.
Error: kueri tidak akan menampilkan deret waktu apa pun
Gejala:
Anda melihat error berikut:
unable to fetch metrics from custom or external metrics API: googleapi: Error
400: The supplied filter [...] query will not return any time series
Penyebab:
Kueri yang dikirim ke Cloud Monitoring valid, tetapi tidak menampilkan data. Artinya, tidak ada titik data yang cocok dengan filter Anda (yang berbeda dengan menemukan metrik dengan nilai 0
). Kemungkinan besar, masalah ini terjadi karena aplikasi atau workload yang bertanggung jawab untuk membuat metrik kustom tidak menulis data ke Cloud Monitoring selama waktu saat error dilaporkan.
Resolusi:
Coba solusi berikut:
- Verifikasi konfigurasi: pastikan nama dan label metrik di objek HorizontalPodAutoscaler Anda sama persis dengan yang dikeluarkan oleh aplikasi.
- Periksa izin: pastikan aplikasi dikonfigurasi dengan benar dengan izin dan endpoint API yang diperlukan untuk memublikasikan metrik ke Cloud Monitoring.
- Konfirmasi aktivitas aplikasi: verifikasi bahwa aplikasi yang bertanggung jawab atas metrik tersebut beroperasi dan mencoba mengirim data ke Cloud Monitoring selama jangka waktu terjadinya peringatan Horizontal Pod Autoscaler.
- Selidiki error: periksa log aplikasi tersebut dari jangka waktu yang sama untuk menemukan error eksplisit yang terkait dengan emisi metrik, seperti kegagalan koneksi, kredensial yang tidak valid, atau masalah pemformatan.
Memecahkan masalah metrik kustom dan eksternal
Jika HorizontalPodAutoscaler Anda mengandalkan metrik dari sumber selain CPU atau memori default, masalah dapat terjadi dalam pipeline metrik kustom atau eksternal. Pipeline ini terdiri dari pengontrol HorizontalPodAutoscaler, server API metrik Kubernetes, adaptor metrik, dan sumber metrik (misalnya, Cloud Monitoring atau Prometheus) seperti yang ditunjukkan dalam diagram berikut:
Bagian ini menjelaskan cara men-debug pipeline ini, dari adaptor metrik hingga sumber metrik.
Gejala:
Gejala paling umum dari masalah dalam pipeline metrik adalah sebagai berikut:
- Nilai metrik ditampilkan sebagai
<unknown>
. - Peristiwa HorizontalPodAutoscaler menampilkan error seperti
FailedGetExternalMetric
atauFailedGetCustomMetric
.
Penyebab:
Ada masalah dalam pipeline metrik kustom atau eksternal.
Resolusi:
Gunakan langkah-langkah berikut untuk membantu Anda men-debug pipeline:
Periksa apakah adaptor metrik terdaftar dan tersedia: adaptor metrik harus mendaftarkan dirinya ke server Kubernetes API utama untuk menayangkan metrik. Tindakan ini adalah cara paling langsung untuk melihat apakah adaptor berjalan dan dapat dijangkau oleh server API:
kubectl get apiservice | grep -E 'NAME|metrics.k8s.io'
Dalam output, Anda akan melihat entri
v1beta1.custom.metrics.k8s.io
atauv1beta1.external.metrics.k8s.io
dan nilaiTrue
di kolomAvailable
. Contoh:NAME SERVICE AVAILABLE AGE v1beta1.metrics.k8s.io kube-system/metrics-server True 18d
Jika nilai di kolom
Available
adalahFalse
atau tidak ada, kemungkinan adapter Anda error atau salah dikonfigurasi. Periksa log Pod adaptor di namespacekube-system
ataucustom-metrics
untuk mengetahui error terkait izin, konektivitas jaringan ke sumber metrik, atau pesan yang menunjukkan bahwa metrik tidak dapat ditemukan.Jika nilainya
True
, lanjutkan ke langkah berikutnya.
Kueri Metrics API secara langsung: jika adaptor tersedia, lewati HorizontalPodAutoscaler dan minta metrik Anda langsung dari Kubernetes API. Perintah ini menguji seluruh pipeline, dari server API ke adaptor metrik hingga sumber data.
Untuk membuat kueri metrik eksternal, jalankan perintah berikut:
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/NAMESPACE_NAME/METRIC_NAME" | jq .
Untuk membuat kueri metrik Pod kustom, jalankan perintah berikut:
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/NAMESPACE_NAME/pods/*/METRIC_NAME" | jq .
Ganti kode berikut:
NAMESPACE_NAME
: namespace tempat Pod Anda berjalan.METRIC_NAME
: nama metrik kustom atau eksternal yang ingin Anda kueri. Misalnya,requests_per_second
atauqueue_depth
.
Analisis output perintah: hasil perintah sebelumnya memberi tahu Anda letak masalahnya. Pilih skenario yang cocok dengan output Anda:
- Respons JSON yang berhasil dengan nilai: pipeline metrik berfungsi dengan benar. Masalah ini kemungkinan merupakan masalah konfigurasi dalam manifes HorizontalPodAutoscaler Anda. Periksa kesalahan ejaan dalam nama metrik atau
matchLabels
yang salah. Error: Error from server (Service Unavailable)
: error ini biasanya menunjukkan masalah konektivitas jaringan, yang sering kali merupakan masalah firewall di cluster yang menggunakan isolasi jaringan.Identifikasi Layanan adaptor metrik. Biasanya ada di ruang nama
custom-metrics
ataukube-system
:kubectl get service -n custom-metrics,kube-system | grep -E 'adapter|metrics'
Temukan port yang diproses adaptor:
kubectl get service ADAPTER_SERVICE -n ADAPTER_NAMESPACE -o yaml
Ganti kode berikut:
ADAPTER_SERVICE
: nama Layanan Kubernetes yang terkait dengan adaptor metrik yang Anda deploy. Service ini adalah Service yang Anda temukan di langkah sebelumnya. Layanan ini mengekspos fungsi adaptor ke bagian lain cluster, termasuk server Kubernetes API.ADAPTER_NAMESPACE
: namespace tempat layanan adapter berada (misalnya,custom-metrics
ataukube-system
).
Temukan aturan firewall masuk untuk panel kontrol cluster Anda:
gcloud compute firewall-rules list \ --filter="name~gke-CLUSTER_NAME-[0-9a-z]*-master"
Ganti
CLUSTER_NAME
dengan nama cluster Anda.Tambahkan
targetPort
adaptor ke aturan:Jelaskan aturan saat ini untuk melihat port yang diizinkan:
gcloud compute firewall-rules describe FIREWALL_RULE_NAME
Ganti
FIREWALL_RULE_NAME
dengan nama aturan firewall yang mengatur traffic jaringan ke panel kontrol cluster Kubernetes Anda.Perbarui aturan untuk menambahkan port adaptor ke daftar:
gcloud compute firewall-rules update FIREWALL_RULE_NAME \ --allow tcp:443,tcp:10250,tcp:ADAPTER_PORT
Ganti
ADAPTER_PORT
dengan port jaringan yang diproses adaptor metrik.
Pastikan Kebijakan Jaringan Kubernetes tidak memblokir traffic ke Pod adaptor metrik:
kubectl get networkpolicy -n custom-metrics,kube-system
Tinjau kebijakan apa pun untuk memastikan kebijakan tersebut mengizinkan traffic masuk dari bidang kontrol atau server API ke
ADAPTER_SERVICE
diADAPTER_PORT
.
Daftar kosong
[]
: output ini berarti adaptor sedang berjalan, tetapi tidak dapat mengambil metrik tertentu, yang menunjukkan masalah pada konfigurasi adaptor atau sumber metrik itu sendiri.Masalah Pod Adapter: periksa log Pod adapter metrik atau Pod untuk mengetahui error terkait panggilan API, autentikasi, atau pengambilan metrik. Untuk memeriksa log, lakukan hal berikut:
Temukan nama Pod adaptor:
kubectl get pods -n ADAPTER_NAMESPACE
Melihat lognya:
kubectl logs ADAPTER_POD_NAME \ -n ADAPTER_NAMESPACE
Ganti kode berikut:
ADAPTER_POD_NAME
: nama Pod adapter yang Anda identifikasi di langkah sebelumnya.ADAPTER_NAMESPACE
: namespace tempat Pod adaptor berada (misalnya,custom-metrics
ataukube-system
).
Tidak ada data di sumber: metrik mungkin tidak ada di sistem sumber. Gunakan alat pemantauan, seperti Metrics Explorer, untuk mengonfirmasi bahwa metrik ada dan memiliki nama serta label yang benar.
- Respons JSON yang berhasil dengan nilai: pipeline metrik berfungsi dengan benar. Masalah ini kemungkinan merupakan masalah konfigurasi dalam manifes HorizontalPodAutoscaler Anda. Periksa kesalahan ejaan dalam nama metrik atau
Memecahkan masalah kegagalan penskalaan Horizontal Pod Autoscaler
Bagian ini membantu Anda memahami alasan HorizontalPodAutoscaler mungkin tidak mengecilkan skala workload Anda seperti yang diharapkan.
Gejala:
HorizontalPodAutoscaler berhasil menskalakan beban kerja, tetapi gagal menskalakannya kembali meskipun metrik seperti pemakaian CPU rendah.
Penyebab:
Perilaku ini dirancang untuk mencegah penskalaan naik dan turun dengan cepat atau penskalaan turun berdasarkan informasi yang tidak lengkap. Dua alasan utamanya adalah sebagai berikut:
- Menggunakan beberapa metrik: Horizontal Pod Autoscaler melakukan penskalaan berdasarkan metrik yang memerlukan replika paling banyak. Jika Anda memiliki beberapa metrik, workload tidak akan diperkecil kecuali jika semua metrik menunjukkan bahwa lebih sedikit replika yang diperlukan. Satu metrik yang memerlukan jumlah replika yang tinggi akan mencegah penurunan skala, meskipun metrik lainnya rendah.
- Metrik tidak tersedia: jika ada metrik yang tidak tersedia (sering ditampilkan sebagai
<unknown>
), Horizontal Pod Autoscaler secara konservatif menolak untuk menurunkan skala workload. Fitur ini tidak dapat menentukan apakah metrik tidak ada karena penggunaan benar-benar nol atau karena pipeline metrik rusak. Masalah ini sering terjadi pada metrik kustom berbasis rasio (misalnya,messages_per_second
), yang dapat berhenti melaporkan data saat tidak ada aktivitas, sehingga Horizontal Pod Autoscaler melihat metrik tersebut sebagai tidak tersedia dan menghentikan operasi penurunan skala. - Penundaan penurunan skala dari kebijakan penskalaan: kolom
behavior
HorizontalPodAutoscaler memungkinkan Anda mengonfigurasi kebijakan penskalaan. Kebijakan default untuk penurunan skala mencakup periode stabilisasi 300 detik (lima menit). Selama periode ini, HorizontalPodAutoscaler tidak akan mengurangi jumlah replika, meskipun nilai metrik telah turun di bawah batas target. Jendela ini mencegah fluktuasi cepat, tetapi dapat membuat penurunan skala lebih lambat dari yang diharapkan.
Resolusi:
Coba solusi berikut:
Untuk beberapa metrik dan metrik yang tidak tersedia, diagnosis metrik yang menyebabkan masalah:
kubectl describe hpa HPA_NAME -n NAMESPACE_NAME
Pada output, cari metrik apa pun dengan status
<unknown>
di bagianMetrics
dan peringatan sepertiFailedGetCustomMetric
atauFailedGetExternalMetric
di bagianEvents
. Untuk men-debug pipeline secara mendetail, lihat bagian Memecahkan masalah metrik kustom dan eksternal.Untuk metrik yang tidak tersedia, jika metrik menjadi tidak tersedia selama periode traffic rendah (umum terjadi pada metrik berbasis rasio), coba salah satu solusi berikut:
- Gunakan metrik berbasis pengukur, bukan metrik berbasis rasio jika memungkinkan. Metrik pengukur, seperti jumlah total pesan dalam antrean (misalnya,
subscription
ataunum_undelivered_messages
), secara konsisten melaporkan nilai, meskipun nilai tersebut adalah0
, sehingga Horizontal Pod Autoscaler dapat membuat keputusan penskalaan dengan andal. - Pastikan sumber metrik Anda melaporkan nilai nol. Jika Anda mengontrol metrik
kustom, konfigurasikan metrik tersebut untuk memublikasikan
0
selama periode tidak aktif, bukan tidak mengirimkan data sama sekali.
- Gunakan metrik berbasis pengukur, bukan metrik berbasis rasio jika memungkinkan. Metrik pengukur, seperti jumlah total pesan dalam antrean (misalnya,
Untuk penundaan penurunan skala dari kebijakan penskalaan, jika periode stabilisasi default lima menit untuk penurunan skala terlalu lama, sesuaikan periode tersebut. Periksa bagian
spec.behavior.scaleDown
dari manifes HorizontalPodAutoscaler Anda. Anda dapat menurunkanstabilizationWindowSeconds
untuk memungkinkan autoscaler menurunkan skala lebih cepat setelah metrik turun. Untuk mengetahui informasi selengkapnya tentang mengonfigurasi kebijakan ini, lihat Kebijakan Penskalaan dalam dokumentasi Kubernetes.
Langkah berikutnya
Jika Anda tidak dapat menemukan solusi untuk masalah Anda dalam dokumentasi, lihat Mendapatkan dukungan untuk mendapatkan bantuan lebih lanjut, termasuk saran tentang topik berikut:
- Membuka kasus dukungan dengan menghubungi Layanan Pelanggan Cloud.
- Mendapatkan dukungan dari komunitas dengan
mengajukan pertanyaan di StackOverflow
dan menggunakan tag
google-kubernetes-engine
untuk menelusuri masalah serupa. Anda juga dapat bergabung ke#kubernetes-engine
channel Slack untuk mendapatkan dukungan komunitas lainnya. - Membuka bug atau permintaan fitur menggunakan issue tracker publik.