HorizontalPodAutoscaler secara otomatis akan memperbanyak jumlah Pod di dalam ReplicationController, Deployment, ReplicaSet ataupun StatefulSet berdasarkan hasil observasi penggunaan CPU(atau, dengan metrik khusus, pada beberapa aplikasi yang menyediakan metrik). Perlu dicatat bahwa HorizontalPodAutoscale tidak dapat diterapkan pada objek yang tidak dapat diperbanyak, seperti DeamonSets.

HorizontalPodAutoscaler diimplementasikan sebagai Kubernetes API resource dan sebuah controller. Resource tersebut akan menentukan perilaku dari controller-nya. Kontroler akan mengubah jumlah replika pada ReplicationController atau pada Deployment untuk menyesuaikan dengan hasil observasi rata-rata penggunaan CPU sesuai dengan yang ditentukan oleh pengguna.

Cara kerja HPA, untuk lebih detail nya bisa langsung cek pada dokumentasi berikut: https://kubernetes.io/id/docs/tasks/run-application/horizontal-pod-autoscale/

Template HPA

buat template bernama hpa.yml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: httpbin-hpa
  namespace: tkjpedia
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: httpbin
  minReplicas: 2
  maxReplicas: 6
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 80
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 70

pada template tersebut kita membatasi untuk minimal adalah 2 replika dan maksimal nya 6 replika berdasarkan penggunaan cpu 80% atau memory 70%

apply hpa dengan perintah berikut:

kubectl apply -f hpa.yml

Cek status hpa menggunakan perintah berikut:

kubectl get hpa -n tkjpedia

disini terlihat penggunaan cpu 2% dan memory 31%. Replica yang terbentuk adalah 2 karena itu adalah batas minimal yang sudah kita tentukan.

cek pods, maka kita memiliki 2 pod httpbin.

Uji Coba

Setelah kita membuat konfigurasi autoscale, kita akan uji apakah hpa tersebut jalan atau tidak. Kita bisa menggunakan tools tools load tes. Disini tkjpedia akan menggunakan k6. https://k6.io/

Kondisi idle

Ketika dijalankan load test pertama dengan beban ringan rata rata cpu pod melebihi batas maksimal yaitu 80%, maka pod akan bertambah satu per satu, ketika replica mencapai 3, rata rata cpu turun dibawah 80%, maka pod tidak akan ditambah lagi sampai load test selesai.

Load test kedua kita tambahkan beban nya, gambar dibawah ini pada saat replica berjumlah 5 penggunaan cpu masih melebihi dari 80% maka pod akan terus ditambahkan.

kemudian ketika pod sudah mencapai 6, rata rata penggunaan cpu turun dibawah 80%, maka pod tidak akan ditambah lagi.

Jika sudah mencapai max replica, maka pod tidak bisa ditambah lagi walaupun penggunaan resource tinggi.

Kondisi idle sesaat setelah test selesai, jumlah replica masih 6, belum dihapus / dikurangi

replica tidak akan langsung dihapus semua, namun penghapusan / scale down bertahap

Selamat!