Mengonfigurasi penskalaan otomatis Pod horizontal


Halaman ini menjelaskan cara menggunakan penskalaan otomatis Pod horizontal untuk menskalakan Deployment secara otomatis menggunakan berbagai jenis metrik. Anda dapat menggunakan panduan yang sama untuk mengonfigurasi HorizontalPodAutoscaler untuk objek Deployment skalabel apa pun.

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Versi API untuk objek HorizontalPodAutoscaler

Saat Anda menggunakan Konsol Google Cloud, objek HorizontalPodAutoscaler dibuat menggunakan autoscaling/v2 API.

Saat menggunakan kubectl untuk membuat atau melihat informasi tentang Horizontal Pod Autoscaler, Anda dapat menentukan autoscaling/v1 API atau autoscaling/v2 API.

  • apiVersion: autoscaling/v1 adalah default, dan memungkinkan Anda melakukan penskalaan otomatis hanya berdasarkan pemakaian CPU. Untuk melakukan penskalaan otomatis berdasarkan metrik lain, sebaiknya gunakan apiVersion: autoscaling/v2. Contoh dalam Membuat contoh Deployment menggunakan apiVersion: autoscaling/v1.

  • apiVersion: autoscaling/v2 direkomendasikan untuk membuat objek HorizontalPodAutoscaler baru. Alat ini memungkinkan Anda melakukan penskalaan otomatis berdasarkan beberapa metrik, termasuk metrik kustom atau eksternal. Semua contoh lain dalam topik ini menggunakan apiVersion: autoscaling/v2.

Untuk memeriksa versi API yang didukung, gunakan perintah kubectl api-versions.

Anda dapat menentukan API yang akan digunakan saat melihat detail tentang Horizontal Pod Autoscaler yang menggunakan apiVersion: autoscaling/v2.

Membuat contoh Deployment

Sebelum dapat membuat Horizontal Pod Autoscaler, Anda harus membuat workload yang dipantau. Contoh dalam topik ini menerapkan konfigurasi Horizontal Pod Autoscaler yang berbeda pada Deployment nginx berikut. Contoh terpisah menampilkan Horizontal Pod Autoscaler berdasarkan penggunaan resource, berdasarkan metrik kustom atau eksternal, dan berdasarkan beberapa metrik.

Simpan kode berikut ke file bernama nginx.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  namespace: default
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
        resources:
          # You must specify requests for CPU to autoscale
          # based on CPU utilization
          requests:
            cpu: "250m"

Manifes ini menentukan nilai untuk permintaan CPU. Jika ingin melakukan penskalaan otomatis berdasarkan penggunaan resource dalam persentase, Anda harus menentukan permintaan untuk resource tersebut. Jika tidak menentukan permintaan, Anda dapat melakukan penskalaan otomatis hanya berdasarkan nilai absolut pemakaian resource, seperti miliCPU untuk pemakaian CPU.

Untuk membuat Deployment, terapkan manifes nginx.yaml:

kubectl apply -f nginx.yaml

Deployment memiliki spec.replicas yang ditetapkan ke 3, sehingga tiga Pod di-deploy. Anda dapat memverifikasi hal ini menggunakan perintah kubectl get deployment nginx.

Setiap contoh dalam topik ini menerapkan Horizontal Pod Autoscaler yang berbeda pada contoh Deployment nginx.

Penskalaan otomatis berdasarkan penggunaan resource

Contoh ini membuat objek HorizontalPodAutoscaler untuk menskalakan Deployment nginx secara otomatis saat pemakaian CPU melampaui 50%, dan memastikan selalu ada minimal 1 replika dan maksimum 10 replika.

Anda dapat membuat Horizontal Pod Autoscaler yang menargetkan CPU menggunakan Konsol Google Cloud, perintah kubectl apply, atau hanya untuk CPU rata-rata, perintah kubectl autoscale.

Konsol

  1. Buka halaman Workloads di Konsol Google Cloud.

    Buka Workload

  2. Klik nama Deployment nginx.

  3. Klik Tindakan > Skalakan otomatis.

  4. Tentukan nilai berikut:

    • Jumlah minimum replika: 1
    • Jumlah maksimum replika: 10
    • Metrik penskalaan otomatis: CPU
    • Target: 50
    • Unit: %
  5. Klik Done.

  6. Klik Autoscale.

kubectl apply

Simpan manifes YAML berikut sebagai file bernama nginx-hpa.yaml:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  targetCPUUtilizationPercentage: 50

Untuk membuat HPA, terapkan manifes menggunakan perintah berikut:

kubectl apply -f nginx-hpa.yaml

kubectl autoscale

Untuk membuat objek HorizontalPodAutoscaler yang hanya menargetkan pemakaian CPU rata-rata, Anda dapat menggunakan perintah kubectl autoscale:

kubectl autoscale deployment nginx --cpu-percent=50 --min=1 --max=10

Untuk mendapatkan daftar Horizontal Pod Autoscaler dalam cluster, gunakan perintah berikut:

kubectl get hpa

Outputnya mirip dengan hal berikut ini:

NAME    REFERENCE          TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx   Deployment/nginx   0%/50%    1         10        3          61s

Untuk mendapatkan detail tentang Horizontal Pod Autoscaler, Anda dapat menggunakan Konsol Google Cloud atau perintah kubectl.

Konsol

  1. Buka halaman Workloads di Konsol Google Cloud.

    Buka Workload

  2. Klik nama Deployment nginx.

  3. Lihat konfigurasi Horizontal Pod Autoscaler di bagian Autoscaler.

  4. Lihat detail selengkapnya tentang peristiwa penskalaan otomatis di tab Events.

kubectl get

Untuk mendapatkan detail tentang Horizontal Pod Autoscaler, Anda dapat menggunakan kubectl get hpa dengan flag -o yaml. Kolom status berisi informasi tentang jumlah replika saat ini dan peristiwa penskalaan otomatis terbaru.

kubectl get hpa nginx -o yaml

Outputnya mirip dengan hal berikut ini:

apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
  annotations:
    autoscaling.alpha.kubernetes.io/conditions: '[{"type":"AbleToScale","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ScaleDownStabilized","message":"recent
      recommendations were higher than current one, applying the highest recent recommendation"},{"type":"ScalingActive","status":"True","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"ValidMetricFound","message":"the
      HPA was able to successfully calculate a replica count from cpu resource utilization
      (percentage of request)"},{"type":"ScalingLimited","status":"False","lastTransitionTime":"2019-10-30T19:42:59Z","reason":"DesiredWithinRange","message":"the
      desired count is within the acceptable range"}]'
    autoscaling.alpha.kubernetes.io/current-metrics: '[{"type":"Resource","resource":{"name":"cpu","currentAverageUtilization":0,"currentAverageValue":"0"}}]'
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"autoscaling/v1","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"spec":{"maxReplicas":10,"minReplicas":1,"scaleTargetRef":{"apiVersion":"apps/v1","kind":"Deployment","name":"nginx"},"targetCPUUtilizationPercentage":50}}
  creationTimestamp: "2019-10-30T19:42:43Z"
  name: nginx
  namespace: default
  resourceVersion: "220050"
  selfLink: /apis/autoscaling/v1/namespaces/default/horizontalpodautoscalers/nginx
  uid: 70d1067d-fb4d-11e9-8b2a-42010a8e013f
spec:
  maxReplicas: 10
  minReplicas: 1
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  targetCPUUtilizationPercentage: 50
status:
  currentCPUUtilizationPercentage: 0
  currentReplicas: 3
  desiredReplicas: 3

Sebelum mengikuti contoh yang tersisa dalam topik ini, hapus HPA:

kubectl delete hpa nginx

Saat Anda menghapus Horizontal Pod Autoscaler, jumlah replika Deployment tetap sama. Deployment tidak secara otomatis kembali ke statusnya sebelum Horizontal Pod Autoscaler diterapkan.

Anda dapat mempelajari lebih lanjut cara menghapus Horizontal Pod Autoscaler.

Penskalaan otomatis berdasarkan traffic load balancer

Penskalaan otomatis berbasis traffic adalah kemampuan GKE yang mengintegrasikan sinyal penggunaan traffic dari load balancer untuk menskalakan Pod secara otomatis.

Menggunakan traffic sebagai sinyal penskalaan otomatis mungkin dapat membantu karena traffic merupakan indikator beban utama yang melengkapi CPU dan memori. Integrasi bawaan dengan GKE memastikan bahwa penyiapannya mudah dan penskalaan otomatis bereaksi terhadap lonjakan traffic dengan cepat untuk memenuhi permintaan.

Penskalaan otomatis berbasis traffic diaktifkan oleh Pengontrol gateway dan kemampuan pengelolaan traffic global-nya. Untuk mempelajari lebih lanjut, lihat Penskalaan otomatis berbasis traffic.

Penskalaan otomatis berdasarkan traffic load balancer hanya tersedia untuk Workload gateway.

Persyaratan

Penskalaan otomatis berbasis traffic memiliki persyaratan berikut:

  • Didukung di GKE versi 1.24 dan yang lebih baru.
  • Gateway API diaktifkan di cluster GKE Anda.
  • Didukung untuk traffic yang melewati load balancer yang di-deploy menggunakan Gateway API dan gke-l7-global-external-managed, gke-l7-regional-external-managed, gke-l7-rilb, atau gke-l7-gxlb GatewayClass.

Batasan

Penskalaan otomatis berbasis traffic memiliki batasan berikut:

  • Tidak didukung oleh GatewayClass multi-cluster (gke-l7-global-external-managed-mc, gke-l7-regional-external-managed-mc, gke-l7-rilb-mc, dan gke-l7-gxlb-mc).
  • Tidak didukung untuk traffic yang menggunakan Service jenis ClusterIP atau LoadBalancer.

Men-deploy penskalaan otomatis berbasis traffic

Latihan berikut menggunakan HorizontalPodAutoscaler untuk menskalakan Deployment store-autoscale secara otomatis berdasarkan traffic yang diterima. Gateway menerima traffic masuk dari internet untuk Pod. Autoscaler membandingkan sinyal traffic dari Gateway dengan kapasitas traffic per Pod yang dikonfigurasi pada resource Service store-autoscale. Dengan menghasilkan traffic ke Gateway, Anda memengaruhi jumlah Pod yang di-deploy.

Diagram berikut menunjukkan cara kerja penskalaan otomatis berbasis traffic:

Penskalaan otomatis berbasis traffic

Untuk men-deploy penskalaan otomatis berbasis traffic, lakukan langkah berikut:

  1. Untuk cluster Standard, pastikan GatewayClasses diinstal di cluster Anda. Untuk cluster Autopilot, GatewayClasses diinstal secara default.

    kubectl get gatewayclass
    

    Output akan mengonfirmasi bahwa resource GKE GatewayClass siap digunakan di cluster Anda:

    NAME                               CONTROLLER                  ACCEPTED   AGE
    gke-l7-global-external-managed     networking.gke.io/gateway   True       16h
    gke-l7-regional-external-managed   networking.gke.io/gateway   True       16h
    gke-l7-gxlb                        networking.gke.io/gateway   True       16h
    gke-l7-rilb                        networking.gke.io/gateway   True       16h
    

    Jika Anda tidak melihat output ini, aktifkan Gateway API di cluster GKE.

  2. Deploy aplikasi contoh dan load balancer Gateway ke cluster Anda:

    kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/master/gateway/docs/store-autoscale.yaml
    

    Aplikasi contoh membuat:

    • Deployment dengan 2 replika.
    • Kapasitas Service dengan max-rate-per-endpoint ditetapkan ke 10. Saat fitur ini berada dalam Pratinjau, gunakan anotasi di Service. Jika fitur ini tersedia secara umum, Kebijakan Service akan menggantikan anotasi. Untuk mempelajari kemampuan Gateway lebih lanjut, lihat Kemampuan GatewayClass.
    • Gateway eksternal untuk mengakses aplikasi di internet. Untuk mempelajari lebih lanjut cara menggunakan load balancer Gateway, lihat Men-deploy Gateway.
    • HTTPRoute yang cocok dengan semua traffic dan mengirimkannya ke Service store-autoscale.

    Kapasitas layanan adalah elemen penting saat menggunakan penskalaan otomatis berbasis traffic karena menentukan jumlah traffic per Pod yang memicu peristiwa penskalaan otomatis. Konfigurasi kapasitas Service menggunakan anotasi Service networking.gke.io/max-rate-per-endpoint, yang menentukan traffic maksimum yang harus diterima Service dalam permintaan per detik, per Pod. Kapasitas layanan bersifat khusus untuk aplikasi Anda. Untuk mengetahui informasi selengkapnya, lihat Menentukan kapasitas Service.

  3. Simpan manifes berikut sebagai hpa.yaml:

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: store-autoscale
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: store-autoscale
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Object
        object:
          describedObject:
            kind: Service
            name: store-autoscale
          metric:
            name: "autoscaling.googleapis.com|gclb-capacity-utilization"
          target:
            averageValue: 70
            type: AverageValue
    

    Manifes ini menjelaskan HorizontalPodAutoscaler dengan properti berikut:

    • minReplicas dan maxReplicas: menetapkan jumlah replika minimum dan maksimum untuk Deployment ini. Dalam konfigurasi ini, jumlah Pod dapat diskalakan dari 1 hingga 10 replika.
    • describedObject.name: store-autoscale: referensi ke Service store-autoscale yang menentukan kapasitas traffic.
    • scaleTargetRef.name: store-autoscale: referensi ke Deployment store-autoscale yang menentukan resource yang diskalakan oleh Horizontal Pod Autoscaler.
    • averageValue: 70: nilai rata-rata target penggunaan kapasitas. Hal ini memberi margin pertumbuhan pada Horizontal Pod Autoscaler sehingga Pod yang berjalan dapat memproses traffic berlebih saat Pod baru sedang dibuat.

Horizontal Pod Autoscaler menghasilkan perilaku traffic berikut:

  • Jumlah Pod disesuaikan antara 1 hingga 10 replika untuk mencapai 70% dari tarif maksimum per endpoint. Hal ini akan menghasilkan 7 RPS per Pod saat max-rate-per-endpoint=10.
  • Di atas 7 RPS per pod, skala Pod akan ditingkatkan sampai mencapai maksimum 10 replika atau sampai traffic rata-ratanya adalah 7 RPS per Pod.
  • Jika traffic dikurangi, skala Pod akan diturunkan ke kecepatan yang wajar menggunakan algoritma Horizontal Pod Autoscaler.

Anda juga dapat men-deploy generator traffic untuk memvalidasi perilaku penskalaan otomatis berbasis traffic.

Pada 30 RPS, Deployment diskalakan menjadi 5 replika sehingga setiap replika idealnya menerima 6 RPS traffic, yang akan menunjukkan pemanfaatan sebesar 60% per Pod. Jumlah ini berada di bawah target pemanfaatan 70% sehingga Pod diskalakan dengan tepat. Bergantung pada fluktuasi traffic, jumlah replika yang diskalakan otomatis juga mungkin berfluktuasi. Untuk mengetahui deskripsi yang lebih mendetail tentang penghitungan jumlah replika, lihat Perilaku penskalaan otomatis.

Penskalaan otomatis berdasarkan metrik kustom atau eksternal

Guna membuat Horizontal Pod Autoscaler untuk metrik kustom dan metrik eksternal, lihat Mengoptimalkan penskalaan otomatis Pod berdasarkan metrik.

Penskalaan otomatis berdasarkan beberapa metrik

Contoh ini membuat Horizontal Pod Autoscaler yang melakukan penskalaan otomatis berdasarkan penggunaan CPU dan metrik kustom bernama packets_per_second.

Jika Anda telah mengikuti contoh sebelumnya dan masih memiliki Horizontal Pod Autoscaler bernama nginx, hapus sebelum mengikuti contoh ini.

Contoh ini memerlukan apiVersion: autoscaling/v2. Untuk mengetahui informasi selengkapnya tentang API yang tersedia, lihat Versi API untuk objek HorizontalPodAutoscaler.

Simpan manifes YAML ini sebagai file bernama nginx-multiple.yaml:

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  - type: Resource
    resource:
      name: memory
      target:
        type: AverageValue
        averageValue: 100Mi
  # Uncomment these lines if you create the custom packets_per_second metric and
  # configure your app to export the metric.
  # - type: Pods
  #   pods:
  #     metric:
  #       name: packets_per_second
  #     target:
  #       type: AverageValue
  #       averageValue: 100

Terapkan manifes YAML:

kubectl apply -f nginx-multiple.yaml

Saat dibuat, Horizontal Pod Autoscaler memantau Deployment nginx untuk mengetahui pemakaian CPU rata-rata, penggunaan memori rata-rata, dan (jika Anda membatalkan komentar) metrik packets_per_second kustom. Horizontal Pod Autoscaler menskalakan Deployment secara otomatis berdasarkan metrik yang nilainya akan membuat peristiwa penskalaan otomatis yang lebih besar.

Melihat detail tentang Horizontal Pod Autoscaler

Untuk melihat konfigurasi dan statistik Horizontal Pod Autoscaler, gunakan perintah berikut:

kubectl describe hpa HPA_NAME

Ganti HPA_NAME dengan nama objek HorizontalPodAutoscaler Anda.

Jika Horizontal Pod Autoscaler menggunakan apiVersion: autoscaling/v2 dan didasarkan pada beberapa metrik, perintah kubectl describe hpa hanya menampilkan metrik CPU. Untuk melihat semua metrik, gunakan perintah berikut:

kubectl describe hpa.v2.autoscaling HPA_NAME

Ganti HPA_NAME dengan nama objek HorizontalPodAutoscaler Anda.

Setiap status Horizontal Pod Autoscaler saat ini ditampilkan di kolom Conditions, dan peristiwa penskalaan otomatis dicantumkan di kolom Events.

Outputnya mirip dengan hal berikut ini:

Name:                                                  nginx
Namespace:                                             default
Labels:                                                <none>
Annotations:                                           kubectl.kubernetes.io/last-applied-configuration:
                                                         {"apiVersion":"autoscaling/v2","kind":"HorizontalPodAutoscaler","metadata":{"annotations":{},"name":"nginx","namespace":"default"},"s...
CreationTimestamp:                                     Tue, 05 May 2020 20:07:11 +0000
Reference:                                             Deployment/nginx
Metrics:                                               ( current / target )
  resource memory on pods:                             2220032 / 100Mi
  resource cpu on pods  (as a percentage of request):  0% (0) / 50%
Min replicas:                                          1
Max replicas:                                          10
Deployment pods:                                       1 current / 1 desired
Conditions:
  Type            Status  Reason              Message
  ----            ------  ------              -------
  AbleToScale     True    ReadyForNewScale    recommended size matches current size
  ScalingActive   True    ValidMetricFound    the HPA was able to successfully calculate a replica count from memory resource
  ScalingLimited  False   DesiredWithinRange  the desired count is within the acceptable range
Events:                                                <none>

Menghapus Horizontal Pod Autoscaler

Anda dapat menghapus Horizontal Pod Autoscaler menggunakan Konsol Google Cloud atau perintah kubectl delete.

Konsol

Untuk menghapus Horizontal Pod Autoscaler nginx:

  1. Buka halaman Workload di Konsol Google Cloud.

    Buka Workload

  2. Klik nama Deployment nginx.

  3. Klik Tindakan > Skalakan otomatis.

  4. Klik Hapus.

kubectl delete

Untuk menghapus nginx Horizontal Pod Autoscaler, gunakan perintah berikut:

kubectl delete hpa nginx

Saat Anda menghapus Horizontal Pod Autoscaler, Deployment atau (atau objek deployment lainnya) akan tetap berada dalam skala yang ada, dan tidak kembali ke jumlah replika dalam manifes asli Deployment. Untuk menskalakan Deployment kembali secara manual ke tiga Pod, Anda dapat menggunakan perintah kubectl scale:

kubectl scale deployment nginx --replicas=3

Pembersihan

  1. Hapus Horizontal Pod Autoscaler, jika Anda belum melakukannya:

    kubectl delete hpa nginx
    
  2. Hapus Deployment nginx:

    kubectl delete deployment nginx
    
  3. Jika ingin, hapus cluster.

Pemecahan masalah

Saat menyiapkan Horizontal Pod Autoscaler, Anda mungkin melihat pesan peringatan seperti berikut:

unable to fetch pod metrics for pod

Wajar jika Anda melihat pesan ini saat server metrik mulai dijalankan. Namun, jika Anda terus melihat peringatan dan melihat bahwa Pod tidak diskalakan untuk workload, pastikan Anda telah menentukan permintaan resource untuk setiap container dalam workload. Untuk menggunakan target persentase penggunaan resource dengan penskalaan otomatis Pod horizontal, Anda harus mengonfigurasi permintaan untuk resource tersebut bagi setiap container yang berjalan di setiap Pod dalam workload. Jika tidak, Horizontal Pod Autoscaler tidak dapat melakukan penghitungan yang diperlukan, dan tidak mengambil tindakan terkait metrik tersebut.

Langkah selanjutnya