Kodeloka
  1. Kodeloka
  2. Kelas Kubernetes
  3. Materi

6 · Penskalaan · Modul 9 dari 14

HPA, VPA & Cluster Autoscaler

Menskalakan jumlah pod berdasarkan metrik, menyesuaikan ukuran pod secara otomatis, dan menambah node saat kapasitas habis.

Tiga Sumbu Penskalaan

AlatMenskalakanKapan dipakai
HPAJumlah pod (horizontal)Beban naik-turun; aplikasi stateless
VPAUkuran request/limit podMenemukan ukuran yang tepat; beban stabil
Cluster AutoscalerJumlah nodePod Pending karena kluster kehabisan kapasitas

Horizontal Pod Autoscaler

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: hpa-pesanan
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: layanan-pesanan
  minReplicas: 3
  maxReplicas: 20
  metrics:
    - type: Resource
      resource:
        name: cpu
        target:
          type: Utilization
          averageUtilization: 70
  behavior:
    scaleUp:
      stabilizationWindowSeconds: 30
      policies:
        - type: Percent
          value: 100          # boleh menggandakan
          periodSeconds: 30
    scaleDown:
      stabilizationWindowSeconds: 300   # turun perlahan
      policies:
        - type: Percent
          value: 20
          periodSeconds: 60
🚫 HPA tidak bekerja tanpa resource request

averageUtilization: 70 berarti "70% dari request", bukan 70% dari kapasitas node. Bila kontainer tidak punya requests.cpu, HPA tidak punya angka pembanding dan statusnya akan menampilkan <unknown> selamanya. Ini penyebab nomor satu HPA yang "tidak jalan". Anda juga perlu metrics-server terpasang.

📌 Kenapa scaleDown harus jauh lebih lambat

Menaikkan kapasitas terlalu lambat berarti pengguna merasakan lambatnya sistem. Menurunkan kapasitas terlalu cepat menyebabkan flapping: pod dimatikan, beban per pod naik, HPA menambah lagi, berulang tanpa henti. Jendela stabilisasi turun yang panjang (5 menit atau lebih) membuat sistem tenang, dan biaya beberapa pod tambahan selama beberapa menit jauh lebih murah daripada ketidakstabilan.

Menskalakan Berdasarkan Metrik Kustom

metrics:
  # Panjang antrean per pod
  - type: External
    external:
      metric:
        name: rabbitmq_queue_messages
        selector:
          matchLabels: { queue: pesanan }
      target:
        type: AverageValue
        averageValue: "30"

  # Permintaan per detik per pod
  - type: Pods
    pods:
      metric:
        name: http_requests_per_second
      target:
        type: AverageValue
        averageValue: "100"
💡 CPU sering bukan metrik yang tepat

Untuk pekerja yang mengonsumsi antrean, panjang antrean jauh lebih bermakna daripada CPU — pekerja yang menunggu I/O punya CPU rendah padahal antrean menumpuk. Untuk API, permintaan per detik atau latensi p95 lebih mencerminkan pengalaman pengguna. KEDA memperluas HPA dengan puluhan sumber metrik siap pakai: Kafka, RabbitMQ, Redis, Prometheus, antrean cloud, bahkan jadwal cron.

Vertical Pod Autoscaler

apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
  name: vpa-pesanan
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: layanan-pesanan
  updatePolicy:
    updateMode: "Off"        # hanya memberi rekomendasi
  resourcePolicy:
    containerPolicies:
      - containerName: api
        minAllowed: { cpu: 50m, memory: 64Mi }
        maxAllowed: { cpu: 2, memory: 2Gi }
⚠️ VPA dan HPA berebut kendali

Memakai VPA mode Auto bersama HPA berbasis CPU pada Deployment yang sama akan saling mengganggu: VPA menaikkan request, yang menurunkan persentase utilisasi, yang membuat HPA mengurangi replika — lalu berputar. Pakai VPA dalam mode Off untuk mendapatkan rekomendasi ukuran, terapkan sendiri, dan biarkan HPA yang mengurus jumlah replika.

Cluster Autoscaler

Ketika pod tidak bisa dijadwalkan karena tidak ada node yang punya kapasitas cukup, Cluster Autoscaler menambah node baru. Ketika node kosong cukup lama, ia menghapusnya.

⚠️ Yang menghambat penghapusan node

Cluster Autoscaler tidak akan menghapus node yang menjalankan: pod tanpa controller (dibuat langsung, bukan lewat Deployment), pod dengan PodDisruptionBudget yang tidak terpenuhi, pod dengan penyimpanan lokal, atau pod dengan anotasi cluster-autoscaler.kubernetes.io/safe-to-evict: "false". Bila tagihan cloud Anda tidak turun saat trafik sepi, periksa hal-hal ini lebih dulu.

Menskalakan ke Nol

HPA bawaan punya minReplicas minimal 1 — selalu ada pod yang berjalan dan menagih biaya. Untuk beban kerja yang benar-benar sepi di luar jam kerja, KEDA bisa menskalakan sampai nol dan menyalakan kembali begitu ada pesan masuk atau permintaan pertama datang.

kubectl get hpa
kubectl describe hpa hpa-pesanan
kubectl get --raw /apis/metrics.k8s.io/v1beta1/nodes | jq
kubectl top pods
kubectl get events --field-selector reason=FailedScheduling