Kita akan mempelajari konsep Pod Autoscalling. Melalui latihan praktis, kita akan memeriksa pengaturan mendetail serta hal-hal penting yang perlu dipertimbangkan saat menerapkannya di lingkungan produksi (production).

Autoscaling adalah kemampuan sistem untuk menambah atau mengurangi alokasi sumber daya secara otomatis berdasarkan beban atau permintaan. Mekanisme ini bertujuan untuk menjaga performa aplikasi dan ketersediaan layanan (high availability). Fitur ini sangat populer di lingkungan cloud untuk mengelola elastisitas aplikasi dan infrastruktur secara otomatis.

Pada Kubernetes, autoscaling secara umum dapat dibagi menjadi dua: autoscaling untuk Pod dan untuk Node.

  • Autoscaling Pod umumnya menggunakan HPA (Horizontal Pod Autoscaler) untuk menambah atau mengurangi jumlah pod secara horizontal.
  • Autoscaling Node dapat menggunakan Cluster Autoscaler atau Karpenter guna menyesuaikan jumlah node tempat pod berjalan.

Poin Utama Pembahasan:

  • Memahami konsep dasar AutoScaling.
  • Memonitor penggunaan sumber daya Node dan Pod menggunakan Metrics-Server.
  • Memahami mekanisme Horizontal Pod Autoscaler (HPA) yang menambah dan mengurangi pod seiring naik-turunnya beban pengguna.

Materi Praktik:

  • Instalasi Metrics-Server.
  • Praktik Pod Autoscaling (HPA).

Direktori GitHub untuk file sumber (source files) pada bab ini:

https://github.com/junghoon2/k8s-class/tree/main/hpa 

1. Komponen Utama Autoscaling

Mari kita pelajari komponen-komponen kunci yang diperlukan untuk mengonfigurasi autoscaling:

  • Monitoring: Autoscaling menambah atau mengurangi beban berdasarkan metrik sistem. Oleh karena itu, kita membutuhkan sistem pemantauan (monitoring). Sistem ini mengumpulkan metrik performa seperti penggunaan CPU, memori, dan lalu lintas jaringan untuk mengetahui kondisi terkini.
  • Penetapan Ambang Batas (Adjustment Criteria): Administrator menentukan kriteria dasar untuk penyesuaian skala. Contohnya, sistem akan menambah pod jika penggunaan CPU melebihi ambang batas, dan mengurangi pod saat berada di bawah ambang batas. Waktu reaksi (cooldown period) juga bisa diatur. Misalnya, jika lonjakan CPU sering terjadi tiba-tiba, Anda dapat menentukan waktu stabilisasi scaling-down selama 5 menit untuk mencegah perubahan skala yang terlalu sering (thrashing).
  • Kebijakan Skala (Scaling Policy): Autoscaling mendukung dua pendekatan utama: Vertical Scaling dan Horizontal Scaling. Vertical Scaling menyesuaikan kapasitas resource pada instance yang sama (misal dari CPU request 0.5 core menjadi 1 Core). Sedangkan Horizontal Scaling menyesuaikan jumlah instance atau replika pod agar sesuai dengan beban kerja aplikasi.

Melalui integrasi ketiga komponen tersebut, sistem dapat merespons fluktuasi beban secara otomatis. Efisiensi sumber daya pun meningkat tanpa mengorbankan performa aplikasi. Pengelola sistem tidak perlu lagi melakukan intervensi manual setiap kali lalu lintas melonjak.

Di lingkungan cloud, autoscaling otomatis sangat fleksibel karena infrastrukturnya dapat bertambah sesuai kebutuhan. Sebaliknya, pada lingkungan on-premise, autoscaling sering dibatasi oleh jumlah server fisik (node) yang tersedia.

2. Memeriksa Penggunaan Sumber Daya dengan Metrics-Server

Sebelum menerapkan autoscaling, kita harus mengetahui metrik beban sistem terlebih dahulu. Di Kubernetes, komponen Metrics-Server diperlukan untuk memantau penggunaan CPU dan memori pada Pod dan Node.

Pada panduan ini, kita menggunakan ArgoCD dan Helm untuk proses instalasi. (Panduan lengkap mengenai Helm dibahas pada Bab 8; di sini kita hanya menuliskan ringkasan perintahnya).

$ (⎈ |switch-singapore-test:monitoring) helm repo add metrics-server
$ (⎈ |switch-singapore-test:monitoring) helm pull metrics-server/metrics-server --version 3.10.0
$ (⎈ |switch-singapore-test:monitoring) tar xvfz metrics-server-3.10.0.tgz
$ (⎈ |switch-singapore-test:monitoring) rm -rf metrics-server-3.10.0.tgz
$ (⎈ |switch-singapore-test:monitoring) mv metrics-server metrics-server-3.10.0
$ (⎈ |switch-singapore-test:monitoring) cd metrics-server-3.10.0
$ (⎈ |switch-singapore-test:monitoring) mkdir ci
$ (⎈ |switch-singapore-test:monitoring) cp values.yaml ci/

Ubah file Helm Value seperti di bawah ini:

ci/values.yaml

apiService:
  insecureSkipTLSVerify: true

Untuk mendeploy menggunakan ArgoCD, siapkan file aplikasi ArgoCD. Berpindahlah ke direktori argo-cd-app-of-apps:

$ (⎈ |switch-seoul-stage:kubecost) cd ../argo-cd-app-of-apps

Buat file CRD ArgoCD Application untuk Metrics-Server: templates/metrics-server-applications.yaml

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: metrics-server
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: kube-system
    server: {{ .Values.spec.destination.server }}
  project: default
  source:
    path: metrics-server-3.10.0
    helm:
      valueFiles:
        - ci/values.yaml
    repoURL: {{ .Values.spec.source.repoURL }}
    targetRevision: {{ .Values.spec.source.targetRevision }}

Fitur Apps Application pada ArgoCD sudah dikonfigurasi dengan opsi syncPolicy/automated agar mengenali file aplikasi di dalam direktori templates secara otomatis:

apps-applications.yaml

syncPolicy:
  automated:
    prune: true
    selfHeal: true

Pada tampilan GUI ArgoCD, resource metrics-server akan muncul seperti gambar di atas. Klik tombol SYNC pada menu atas untuk menerapkan resource.

Klik “SYNC” untuk menerapkan (deploy) resource.

Pada tampilan GUI ArgoCD, resource metrics-server akan muncul seperti gambar di atas. Klik tombol SYNC pada menu atas untuk menerapkan resource.

Periksa namespace kube-system. Pod metrics-server kini telah aktif dan berjalan:

$ (⎈ |switch-singapore-test:kube-system) k get pod metrics-server-6f9cdd486c-2fqm2
NAME                              READY   STATUS    RESTARTS   AGE
metrics-server-6f9cdd486c-2fqm2   0/1     Running   0          24s

Metrics-Server mengambil metrik beban dari kubelet dan cAdvisor yang terpasang di setiap node. Metrik tersebut kemudian diekspos melalui API Server. Anda dapat melihat statistik beban dengan perintah kubectl top.

Melihat penggunaan sumber daya pada Node:

$ (⎈ |switch-singapore-test:kube-system) k top nodes
NAME                                                CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%   
ip-10-110-24-222.ap-southeast-1.compute.internal    171m         8%     2256Mi          31%       
ip-10-110-47-109.ap-southeast-1.compute.internal    88m          4%     907Mi           12%

Melihat penggunaan sumber daya pada Pod:

$ (⎈ |switch-singapore-test:kube-system) k top pods
NAME                                                 CPU(cores)   MEMORY(bytes)   
aws-load-balancer-controller-7d96db6884-nrcgf        2m           24Mi            
aws-node-84wfr                                       3m           41Mi            
(dihapus untuk ringkasan)

Proses instalasi Metrics-Server telah selesai.

3. Praktik HPA (Horizontal Pod Autoscaler)

HPA akan menyesuaikan jumlah replika pod secara dinamis saat penggunaan CPU atau memori melampaui target yang ditentukan.

Untuk mengujinya, kita akan mendeploy pod sampel terlebih dahulu.

php-apache.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 1
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: registry.k8s.io/hpa-example
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m
          requests:
            cpu: 200m
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
-----
port: 80
selector:
run: php-apache

.spec.template.spec.containers.resources.requests.cpu: 200m`
Bagian ini menentukan nilai CPU request untuk pod. Nilai `1000m` setara dengan `1 vCore`, sehingga `200m` berarti `0.2 Core`.

Contoh aplikasi di atas adalah citra resmi PHP-Apache dari dokumentasi Kubernetes yang dirancang untuk menghasilkan beban komputasi CPU saat menerima permintaan HTTP. Sekarang, terapkan manifes tersebut:

```bash
$ (⎈ |switch-singapore-test:default) k apply -f php-apache.yaml
deployment.apps/php-apache created
service/php-apache created

$ (⎈ |switch-singapore-test:default) k get deploy,svc
NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/php-apache   1/1     1            1           40s

NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   172.20.0.1              443/TCP   59d
service/php-apache   ClusterIP   172.20.92.196           80/TCP    39s

Deployment dan service php-apache telah berhasil aktif. Selanjutnya, kita buat konfigurasi HPA dalam format YAML.

php-hpa.yaml

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: php-apache
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: php-apache
  minReplicas: 1
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 50
  • .spec.minReplicas: 1

Menetapkan batas minimum pod yang harus selalu berjalan (1 pod).

  • .spec.maxReplicas: 10

Menetapkan batas maksimum penambahan pod ketika beban tinggi (hingga 10 pod).

  • .spec.metrics.resource.name: cpu

Menentukan metrik CPU sebagai tolok ukur scaling.

  • .spec.metrics.resource.target.averageUtilization: 50

Menetapkan ambang batas rata-rata beban sebesar 50%. Angka ini dihitung dari nilai Resource Request yang disetel pada pod (bukan Resource Limit).

  • .spec.metrics.type: Resource

Menentukan tipe metrik bawaan sistem. Anda juga dapat menggunakan Custom Metrics untuk parameter lain seperti jumlah koneksi aktif atau latensi.

  • .spec.scaleTargetRef

Menentukan target deployment yang akan diskalakan oleh HPA (php-apache).

Terapkan resource HPA ke cluster:

$ (⎈ |switch-singapore-test:default) k apply -f php-hpa.yaml
horizontalpodautoscaler.autoscaling/php-apache created

$ (⎈ |switch-singapore-test:default) k get hpa
NAME         REFERENCE               TARGETS       MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   cpu: 0%/50%   1         10        1          24s

Saat awal dijalankan, penggunaan CPU masih berada di angka 0%/50%. Oleh karena itu, jumlah replika tetap berada di batas minimum (MINPODS = 1).

Sekarang, kita jalankan pod generator (load-generator) untuk memberikan beban trafik secara terus-menerus ke service php-apache:

$ (⎈ |switch-singapore-test:default) kubectl run -i --tty load-generator --rm --image=busybox:1.28 --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"

Pantau status HPA secara berkala. Kolom TARGETS akan meningkat tajam (misal dari 133% hingga lebih dari 200%):

$ (⎈ |switch-singapore-test:default) k get hpa
NAME         REFERENCE               TARGETS         MINPODS   MAXPODS   REPLICAS   AGE
php-apache   Deployment/php-apache   cpu: 239%/50%   1         10        5          3m15s

Ketika target utilisasi terlampaui, HPA otomatis menambah jumlah replika pod dari 1 menjadi beberapa pod untuk membagi beban trafik:

$ (⎈ |switch-singapore-test:default) k get pods
NAME                          READY   STATUS    RESTARTS   AGE
load-generator                1/1     Running   0          3m44s
php-apache-7495ff8f5b-66zzq   1/1     Running   0          113s
php-apache-7495ff8f5b-d4fdp   1/1     Running   0          3m23s
php-apache-7495ff8f5b-l6n86   1/1     Running   0          28m
php-apache-7495ff8f5b-ldljv   1/1     Running   0          3m23s
php-apache-7495ff8f5b-msx5z   1/1     Running   0          3m8s

HPA secara mandiri mengatasi lonjakan trafik tanpa bantuan manual dari pengelola sistem.

Setelah Anda menghentikan beban trafik (keluar dari proses load-generator), penggunaan CPU akan turun kembali. HPA secara perlahan akan mengurangi jumlah pod hingga kembali ke jumlah awal (MINPODS: 1).

4. Hal yang Perlu Diperhatikan Saat Menggunakan HPA

Terdapat beberapa pertimbangan teknis penting sebelum menerapkan HPA pada sistem produksi:

1. Fluktuasi Singkat (Flapping):

Beban lalu lintas web sering kali naik-turun dalam tempo cepat. Apabila skala pod bertambah dan berkurang terlalu sering, performa aplikasi justru dapat terganggu.

2. Kustomisasi behavior pada HPA:

Gunakan parameter behavior untuk mengendalikan jendela penstabilan (stabilization window) saat scale-down atau scale-up.

Berikut contoh konfigurasi kebijakan stabilitas:

behavior:
  scaleDown:
    stabilizationWindowSeconds: 300
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15
  scaleUp:
    stabilizationWindowSeconds: 0
    policies:
    - type: Percent
      value: 100
      periodSeconds: 15
  • behavior.scaleDown.stabilizationWindowSeconds: 300

Memberikan jeda evaluasi selama 5 menit (300 detik) sebelum mengurangi pod. Langkah ini mencegah pod langsung dihapus saat beban turun sesaat.

  • behavior.scaleUp.stabilizationWindowSeconds: 0

Berbeda dengan proses turun skala, peningkatan skala diatur ke angka 0 detik. Hal ini dilakukan agar sistem dapat langsung merespons lonjakan trafik secepat mungkin.

Pembersihan Resource Praktik (Cleanup)

Setelah selesai menguji, hapus resource deployment, service, dan HPA yang telah dibuat:

$ (⎈ |switch-singapore-test:default) k delete -f php-apache.yaml -f php-hpa.yaml
deployment.apps "php-apache" deleted
service "php-apache" deleted
horizontalpodautoscaler.autoscaling "php-apache" deleted

 

0 CommentsClose Comments

Leave a comment

Newsletter Subscribe

Get the Latest Posts & Articles in Your Email

We Promise Not to Send Spam:)