Tiga Sumbu Penskalaan
| Alat | Menskalakan | Kapan dipakai |
|---|---|---|
| HPA | Jumlah pod (horizontal) | Beban naik-turun; aplikasi stateless |
| VPA | Ukuran request/limit pod | Menemukan ukuran yang tepat; beban stabil |
| Cluster Autoscaler | Jumlah node | Pod 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
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.
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"
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 }
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.
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