全部产品
Search
文档中心

Container Service for Kubernetes:Pertanyaan Umum tentang Penskalaan Beban Kerja

更新时间:Jul 06, 2025

Topik ini menjawab beberapa pertanyaan umum terkait penskalaan beban kerja (HPA dan CronHPA).

Daftar isi

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:

Tampilkan output sampel

NAME                                   SERVICE                      AVAILABLE   AGE
v1.                                    Local                        True        29h
v1.admissionregistration.k8s.io        Local                        True        29h
v1.apiextensions.k8s.io                Local                        True        29h
v1.apps                                Local                        True        29h
v1.authentication.k8s.io               Local                        True        29h
v1.authorization.k8s.io                Local                        True        29h
v1.autoscaling                         Local                        True        29h
v1.batch                               Local                        True        29h
v1.coordination.k8s.io                 Local                        True        29h
v1.monitoring.coreos.com               Local                        True        29h
v1.networking.k8s.io                   Local                        True        29h
v1.rbac.authorization.k8s.io           Local                        True        29h
v1.scheduling.k8s.io                   Local                        True        29h
v1.storage.k8s.io                      Local                        True        29h
v1alpha1.argoproj.io                   Local                        True        29h
v1alpha1.fedlearner.k8s.io             Local                        True        5h11m
v1beta1.admissionregistration.k8s.io   Local                        True        29h
v1beta1.alicloud.com                   Local                        True        29h
v1beta1.apiextensions.k8s.io           Local                        True        29h
v1beta1.apps                           Local                        True        29h
v1beta1.authentication.k8s.io          Local                        True        29h
v1beta1.authorization.k8s.io           Local                        True        29h
v1beta1.batch                          Local                        True        29h
v1beta1.certificates.k8s.io            Local                        True        29h
v1beta1.coordination.k8s.io            Local                        True        29h
v1beta1.events.k8s.io                  Local                        True        29h
v1beta1.extensions                     Local                        True        29h
...
[v1beta1.metrics.k8s.io                 kube-system/metrics-server   True        29h]
...
v1beta1.networking.k8s.io              Local                        True        29h
v1beta1.node.k8s.io                    Local                        True        29h
v1beta1.policy                         Local                        True        29h
v1beta1.rbac.authorization.k8s.io      Local                        True        29h
v1beta1.scheduling.k8s.io              Local                        True        29h
v1beta1.storage.k8s.io                 Local                        True        29h
v1beta2.apps                           Local                        True        29h
v2beta1.autoscaling                    Local                        True        29h
v2beta2.autoscaling                    Local                        True        29h

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: 100

Jika 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"

    Tampilkan kode sampel

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
        template:
            metadata:
              labels:
                app: nginx
              annotations:
                HPARollingUpdateSkipped: "true"  # Lewati HPA selama pembaruan bergulir. 
            spec:
              containers:
              - name: nginx
                image: nginx:1.7.9
                ports:
                - containerPort: 80
  • 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.

    Tampilkan kode sampel

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx-deployment-basic
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
        template:
            metadata:
              labels:
                app: nginx
              annotations:
                HPAScaleUpDelay: 3m  # Pengaturan ini menunjukkan bahwa HPA mulai berlaku 3 menit setelah pod dibuat. Unit valid: s dan m. s menunjukkan detik dan m menunjukkan menit. 
            spec:
              containers:
              - name: nginx
                image: nginx:1.7.9
                ports:
                - containerPort: 80

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.

Tampilkan kode sampel

## Dalam contoh ini, Deployment digunakan.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-basic
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
      annotations:
        HPAScaleUpDelay: 3m # Pengaturan ini menunjukkan bahwa HPA mulai berlaku 3 menit setelah pod dibuat. Unit valid: s dan m. s menunjukkan detik dan m menunjukkan menit. 
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9 # Ganti dengan <image_name:tags> Anda.
        ports:
        - containerPort: 80 

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:

  1. Jalankan perintah kubectl describe hpa <hpa_name> untuk memeriksa mengapa HPA menjadi abnormal.

    • Jika nilai AbleToScale adalah False di bidang Conditions, periksa apakah Deployment dibuat sesuai harapan.

    • Jika nilai ScalingActive adalah False di bidang Conditions, lanjutkan ke langkah berikutnya.

  2. Jalankan perintah kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/". Jika Error from server (NotFound): the server could not find the requested resource dikembalikan, 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.

  3. 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_regex dalam AliyunLogConfig. Untuk informasi lebih lanjut, lihat Gunakan CRD untuk mengumpulkan log kontainer dalam mode DaemonSet.